1. 程式人生 > >SpringBoot整合PageHelper分頁查詢

SpringBoot整合PageHelper分頁查詢

    最近在公司裡做一個內部專案,但是總公司那邊需求一直沒提過來,沒辦法就自己想自己做,結果不同人負責不同模組,寫出來的程式碼就差異性很大,一個分頁查詢,四個人就寫了封裝了三個類,對於我這種強迫症太不友好了。所以我就決定引入一個統一的規範。

    我們之前用Mybatis-Plus進行了一次重構,省去了基本的crud方法的編寫,所以我先看了以一下里面推薦的分頁器,這個分頁器的用法也是高度封裝了的,但是我們有一些查詢程式碼是沒有重構複用的,所以還是先不用它的。

    所以後面決定還是用PageHelper來做。

1.引入外掛

    引入分頁外掛有下面2種方式,推薦使用 Maven 方式。

1). 引入 Jar 包

你可以從下面的地址中下載最新版本的 jar 包

由於使用了sql 解析工具,你還需要下載 jsqlparser.jar(需要和PageHelper 依賴的版本一致) :

2). 使用 Maven

在 pom.xml 中新增如下依賴:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本</version>
</dependency>

最新版本號可以從作者Github上可檢視。

不過官方推薦最新版本的似乎會和spring-boot有相容性問題,會出現不分頁的情況,我也踩了很多坑,最後選擇下面這兩者搭配,這種方法是起來是可執行的。其他的尚不確定。

<!-- spring-mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
<!--pageHelper分頁外掛-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>

2. 配置攔截器外掛

在application.yml中配置

# pageHelper分頁配置
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countSql

3.程式碼中使用

後臺程式碼:

 @GetMapping("/list")
    public PageInfo<TbProject> listProject(String name, String type, int pageSize, int page) {
        PageHelper.startPage(page + 1, pageSize);
        Map map = new HashMap();
        map.put("name", name);
        map.put("type", type);
        List<TbProject> tbProjects = proService.listProject(map);
        PageInfo pageInfo = new PageInfo(tbProjects);
        System.out.println("總數為:"+pageInfo.getTotal());
        return pageInfo;
    }

因為我的前臺使用的是elementUI,和pageHelper對於當前頁的處理有區別,所以對傳回來的當前頁進行加1處理。

在pageHelper呼叫了startPage方法後,會對後面第一個select查詢進行物理分頁,查詢的寫法和查詢所有資料一致。最後通過

PageInfo pageInfo = new PageInfo(tbProjects);將所有需要的資訊儲存到pageInfo 中返回到前臺。

前臺程式碼

getProList() {
                this.axios({
                    method: 'get',
                    url: '/project/list',
                    params: {
                        'page': this.pageInfo.page,
                        'pageSize': this.pageInfo.pageSize,
                        'name': this.proName4search,
                        'type': this.selType,
                    }
                }).then((response) => {
                    //可以在前臺控制檯上檢視返回的pageInfo中有哪些資料
                    console.log(response);

                    //通過list拿到目標頁的物件集合,total獲取到總數量
                    this.tableData = response.data.list;
                    this.total = response.data.total;

                }).catch(error => {
                    this.$message.error(this.erroStr + error);
                });
            },

過程中遇到的問題:

1:在除錯的時候,不知道點了哪裡,idea一直報類似下面下面錯誤:

Error: Maven Resources Compiler: Failed to copy ‘E:\WorkSpace2016\Test\heaton\heaton-web\src\main\resources\dirty.txt’  to ‘E:\WorkSpace2016\Test\heaton\heaton-web\target\classes\dirty.txt’: E:\WorkSpace2016\Test\heaton\heaton-web\target\classes\dirty.txt (拒絕訪問。)

深層原因不太清楚,直接原因上面紫色部分檔案位置為只讀屬性,解決辦法是把它刪掉。如果出現無法刪除,可能是idea正在使用,關掉相應的程序或者重啟計算機。

2:在上傳svn的時候,萬惡的checkstyle一直不給我通過,一個儲存常量的公共類提示

Utility classes should not have a public or default constructor.

原來是沒有加私有的構造器,腦仁疼,被checkstyle各種稀奇古怪的錯誤折磨到死,已經失去了辨別能力了。

以上。

最後感謝外掛作者:Liuzh