1. 程式人生 > >Spring Boot 2.0 + MyBatis + pageHelper 多元資料庫分頁

Spring Boot 2.0 + MyBatis + pageHelper 多元資料庫分頁

繼之前在MyBatis設定多元資料的情況下,在工作中又遇到了多元資料庫分頁失效的問題,如下是解決過程。

這裡先貼上我之前解決多元資料的部落格:https://blog.csdn.net/jiangxiaoyi_07/article/details/84982875

先介紹只有一個數據源的情況下pageHelper的使用方法。

首先,在啟動類上加上如下程式碼

@Bean
PageHelper pageHelper(){
   //分頁外掛
   PageHelper pageHelper = new PageHelper();
   Properties properties = new Properties();
   properties.setProperty("reasonable", "true");
   properties.setProperty("supportMethodsArguments", "true");
   properties.setProperty("returnPageInfo", "check");
   properties.setProperty("params", "count=countSql");
   pageHelper.setProperties(properties);
   //新增外掛
   new SqlSessionFactoryBean().setPlugins(new Interceptor[]{pageHelper});
   return pageHelper;
}

helperDialect:分頁外掛會自動檢測當前的資料庫連結,自動選擇合適的分頁方式。

reasonable:分頁合理化引數,預設值為false。當該引數設定為 true 時,pageNum<=0 時會查詢第一頁, pageNum>pages(超過總數時),會查詢最後一頁。預設false 時,直接根據引數進行查詢。

params:為了支援startPage(Object params)方法,增加了該引數來配置引數對映,用於從物件中根據屬性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置對映的用預設值, 預設值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。

supportMethodsArguments:支援通過 Mapper 介面引數來傳遞分頁引數,預設值false,分頁外掛會從查詢方法的引數值中,自動根據上面 params 配置的欄位中取值,查詢到合適的值時就會自動分頁。

在需要分頁的sql語句上一行加入,注意一定不要中間插入其他的程式碼

Page page = PageHelper.startPage(pageNum, pageSize);
ArrayList<Target> targets = targetMapper.findTargetsByClientId(clientId, pageNum, pageSize);

這時獲取到的結果已經是分頁後的結果啦~

PageInfo<Target> targetPage = new PageInfo<>(targets);
targetPage.setPages(page.getPages());
targetPage.setTotal(page.getTotal());
targetPage.setPageNum(page.getPageNum());
targetPage.setPageSize(page.getPageSize());

然後將分頁相關的結果放到PageInfo物件裡。

在配置了兩個資料庫源後,分別有如下的兩個資料庫配置檔案,具體的可以看之前多元資料的部落格,文章開頭已經貼出來過。

注掉在單資料庫源的情況下載啟動類上加上的分頁相關的程式碼,

然後分別在MybatisDbAConfig和MybatisDbBConfig檔案加入如下的程式碼

@Bean
public SqlSessionFactory sqlSessionFactory1() throws Exception {
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    factoryBean.setDataSource(xx1DataDataSource());//使用xx1DataDataSource()為資料來源

    //分頁外掛
    Interceptor interceptor = new PageInterceptor();
    Properties properties = new Properties();
    properties.setProperty("helperDialect", "mysql");
    properties.setProperty("offsetAsPageNum", "true");
    properties.setProperty("rowBoundsWithCount", "true");
    properties.setProperty("reasonable", "true");
    properties.setProperty("supportMethodsArguments", "true");
    properties.setProperty("params", "pageNum=pageNumKey;pageSize=pageSizeKey;");
    interceptor.setProperties(properties);
    factoryBean.setPlugins(new Interceptor[]{interceptor});

    return factoryBean.getObject();
}

其他的使用方法和之前的單源資料庫的情況是一樣的了。

使用了PageHelper外掛之後除了基礎的查詢語句之外不需要關心分頁語句,因為Mybatis 的攔截器在輸入的sql語句之外拼接了分頁先關的語句。