之前只用过单数据源下的分页插件,而且几乎不用配置。一个静态方法就能搞定。

  1. PageHelper.startPage(pageNum, pageSize);
  1. 后来使用了多数据源(不同的数据库),PageHelper分页插件需要设定一个默认的数据库,mysqloracle或者其他。
    但是又不能实时切换,导致请求的第一个类型数据库的请求都可以继续请求,而其他的数据库的请求因为sql语句在不同数据库的count和分页语句不同报错。
  2.  
  3. 解决思路是
    ①配置先配置多数据源,再配置多个SqlSessionFactory使用不同的数据源,SqlSessionFactory同时指定某些dao层接口(或者mapper),此时不同的dao层就可以访问不同数据源
    ②在每个SqlSessionFactory中配置一个分页插件
  4.  
  5. 第一步骤中的多数据源配置很多博文都有记录,在此不再重复写,我配置的时候参考的是这个链接
  1. http://blog.csdn.net/neosmith/article/details/61202084
  1. 他提供了一个多数据源手动配置,一个自动配置方案。因为我们要在多数据源下另外配置分页插件,所以选用手动配置方案。
  1.  
  2. 重点讲第二步骤:
    一、多数据源下配置分页插件
      如果你使用的上边的配置方案,那么你现在应该有多个SqlSessionFactorybean。我们重点来看某个SqlSessionFactory bean的配置:
  1. @Configuration
  2. @MapperScan(basePackages = {"com.firstRest.dao.localLeftjointest"}, sqlSessionFactoryRef = "sqlSessionFactory1")
  3. public class MybatisDbAConfig {
  4.  
  5. @Autowired
  6. @Qualifier("localLeftjointestDataSource")
  7. private DataSource ds1;
  8.  
  9. @Bean
  10. public SqlSessionFactory sqlSessionFactory1() throws Exception {
  11. SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
  12. factoryBean.setDataSource(ds1); // 使用localLeftjointest数据源, 连接leftjointest库
  13.  
  14. //分页插件
  15. Interceptor interceptor = new PageInterceptor();
  16. Properties properties = new Properties();
  17. properties.setProperty("helperDialect", "mysql");
  18. properties.setProperty("offsetAsPageNum", "true");
  19. properties.setProperty("rowBoundsWithCount", "true");
  20. properties.setProperty("reasonable", "true");
  21. properties.setProperty("supportMethodsArguments","true");
  22. properties.setProperty("params","pageNum=pageNumKey;pageSize=pageSizeKey;");
  23. interceptor.setProperties(properties);
  24. factoryBean.setPlugins(new Interceptor[] {interceptor});
  25.  
  26. return factoryBean.getObject();
  27.  
  28. }
  29.  
  30. @Bean
  31. public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
  32. SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); // 使用上面配置的Factory
  33. return template;
  34. }
  35. }
  1. 多出来的代码就是我们需要添加的地方,我们来看一下到底干了些什么:
    ①新建了一个PageInterceptor,因为Mybatis允许在已经映射语句执行过程中某一点进行拦截调用,而PageHelper就是在这进行分页操作的
    ②新建一个属性,并添加一些属性值,这些属性值里重要的是:
      
      1helperDialect 数据库方言:数据库是什么就写什么就行 mysqlsqlserveroracledb2 这样的,详情参考 https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/en/HowToUse.md
      2supportMethodsArguments 是否支持参数方式进行分页:写true就行了,后边写原因
      3params 支持了那些参数:pageNum=pageNumKey;pageSize=pageSizeKey。分别对应了分页页码,分页大小。
  1.   需要注意的是:
  2.     有些博文中写的是在①步骤中新建一个PageHelper对象,设置PageHelper的属性,然后添加到Plugins里面去,现在已经不支持这种写法了! 现在就是要用PageInterceptor
  3.     2)(3)中设置的是插件是用方案配置,如果这样设置的话,在dao层(或者mapper中)接口同时出现pageNumKey pageSizeKey 参数,这个方法就会被分页。为什么使用这个方法呢,我们之后讲,先这么写就对了。
  1. 单个SqlSessionFactory配置好了,其他的SqlSessionFactory在配置分页插件的时候只需要把helperDialect 修改成另外一个数据源数据库类型即可。
  2.  
  3. 二、如何写dao层接口
      上边我们设置了supportMethodsArguments params,如何使分页插件在我们调用dao层方法的时候生效呢?
      代码如下:
  1. @Repository
  2. public interface JlzxDao {
  3. @Select(value = "Select * from ${table_name} order by id")
  4. @ResultType(HashMap.class)
  5. List<HashMap> getAll(@Param("table_name") String tableName,
  6.                @Param("pageNumKey") int pageNum,
  7. 7 @Param("pageSizeKey") int pageSize);
  8. }
  1.  
  1.   重点看标红的参数,我并没有把这两个参数在sql中使用,但把两个参数写了进去。这样同时出现pageNumKey pageSizeKey 参数,这个方法就会被分页。
  2.  
  3.   这样Dao层咋调用的时候多传两个分页参数过去就可以自动分页了。
  4.  
  5. 三、为何选用这种参数方式使用分页
      在单数据源的时候,我使用的是静态方法,即本文最开始的那行代码进行标示,使下一个查询语句进行分页。
      但使用这种静态方法时,在service层(或者controller层)判断数据源来自哪里之后使用下边的语句,这是我之前的service层的写法:
  1. @Service("BaseService")
  2. public class BasePagingService implements PagingService{
  3. @Autowired
  4. private JlzxDao jlzxDao;
  5. @Autowired
  6. private LeftjointestDao leftjointestDao;
  7.  
  8. @Override
  9. public PageInfo<HashMap> selectByPage(String dbName,String tableName,int currentPage, int pageSize){
  10. if(dbName.equals("leftjointest")){
  11. PageHelper.startPage(currentPage, pageSize);
  12. return new PageInfo<>(leftjointestDao.getAll(tableName));
  13. }
  14. else if(dbName.equals("jlzx")){
  15. PageHelper.startPage(currentPage, pageSize);
  16. return new PageInfo<>(jlzxDao.getAll(tableName));
  17. }
  18. return null;
  19.  
  20. }
  21. }

  这样的方法会报错:在系统中发现了多个分页插件,请检查系统配置!

  所以换了参数直接写在dao层方法中的用法。

  1.  
  2. 我的项目链接如下:
    https://github.com/Jaccccccccccccccccccccccccccccck/firstREST如有错误,还望指正!
  1.  
  1.   
  1.   
  1.  
  1.  

SpringBoot+MyBatis多数据源使用分页插件PageHelper的更多相关文章

  1. Springboot集成mybatis通用Mapper与分页插件PageHelper

    插件介绍 通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 Example 相关的单表操作.通用 Mapper 是为了解决 MyBatis 使用 ...

  2. MyBatis学习总结_17_Mybatis分页插件PageHelper

    如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 分页插件支持任何复杂的单表.多表分页,部分特殊情况请看重要提示. 想要使用分页插件?请看如何使用分页插件. 物理分页 该 ...

  3. (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示

    http://blog.csdn.net/yerenyuan_pku/article/details/72774381 上文我们实现了展示后台页面的功能,而本文我们实现的主要功能是展示商品列表,大家要 ...

  4. SpringBoot集成MyBatis的分页插件 PageHelper

    首先说说MyBatis框架的PageHelper插件吧,它是一个非常好用的分页插件,通常我们的项目中如果集成了MyBatis的话,几乎都会用到它,因为分页的业务逻辑说复杂也不复杂,但是有插件我们何乐而 ...

  5. SpringBoot 使用 MyBatis 分页插件 PageHelper 进行分页查询

    前言:本文档使用的是 SpringBoot,如果是 Spring 还需要在 MyBatis 配置 xml 中配置拦截器,并且 PageHelper 是针对 MyBatis 的,MyBatis 的集成不 ...

  6. SpringBoot添加对Mybatis分页插件PageHelper的支持

    1.修改maven配置文件pom.xml,添加对pageHelper的支持: <!--pagehelper--> <dependency> <groupId>com ...

  7. SpringBoot Mybatis 分页插件PageHelper

    添加maven配置: <!-- 分布插件 --> <dependency> <groupId>com.github.pagehelper</groupId&g ...

  8. Mybatis的分页插件PageHelper

    Mybatis的分页插件PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper  文档地址:http://git.oschina. ...

  9. mybatis分页插件PageHelper的使用(转)

    Mybatis 的分页插件PageHelper-4.1.1的使用 Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_P ...

随机推荐

  1. char.IsLetter的使用

    先看一下下面的代码,大家会觉得控制台输出什么? 输出:Chiantxt  .对吗? 因为你看到char.IsLetter这个方法的文字的注释是这样写的: 但实际上输出的结果是这样的: ??? 怎么还输 ...

  2. LiveCharts文档-4基本绘图-3其他

    原文:LiveCharts文档-4基本绘图-3其他 4基本绘图-3其他 因为每个图表的使用方法大同小异,所以不再啰嗦重复,具体直接看这个链接里的介绍.原文链接 其他的图表类型有 基本堆叠图 基本条形图 ...

  3. BootStrap学习(3)_导航菜单

    一.导航元素 1.表格导航或标签 以一个带有 class .nav 的无序列表开始. 添加 class .nav-tabs. <!DOCTYPE html> <html xmlns= ...

  4. java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application-dev.yml'

    如果你的项目没有配置错误,配置文件名称也正常,还出现这个问题,那一定是你的yml文件编码的问题 先附上一张项目架构图 当我启动服务器寻找配置文件的时候,服务器提示这样的错误信息 java.lang.I ...

  5. Scala学习(六)练习

    Scala中的对象&练习 1. 编写一个Conversions对象,加入inchesToCentimeters,gallonsToLiters和milesToKilometers方法 程序代码 ...

  6. Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

    Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...

  7. Centos6下关于系统用户密码规则-运维笔记

    随着linux使用的普遍,对于linux用户以及系统的安全要求越来越高,而用户密码复杂程度是系统安全性高低的首要体现.因此如何对linux下用户的密码进行规则限制,以保证用户必须使用复杂的密码,杜绝用 ...

  8. JavaScript术语:shim 和 polyfill

    转自:https://www.html.cn/archives/8339 在学习和使用 JavaScript 的时候,我们会经常碰到两个术语:shim 和 polyfill.它们有许多定义和解释,意思 ...

  9. Linux学习期中总结

    一.<Linux内核分析>总结 (一)计算机是如何工作的 1.存储程序计算机工作模型 2. X86CPU的寄存器:通用寄存器.段寄存器.标志寄存器等. 3.计算机的汇编指令 (1)movl ...

  10. Neo4j初探

    neo4j-desktop-win64 exe https://neo4j.com/download-thanks-desktop/?edition=desktop&flavour=winst ...