继之前在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语句之外拼接了分页先关的语句。