SpringBoot+MyBatis多数据源使用分页插件PageHelper
之前只用过单数据源下的分页插件,而且几乎不用配置。一个静态方法就能搞定。
PageHelper.startPage(pageNum, pageSize);
后来使用了多数据源(不同的数据库),PageHelper分页插件需要设定一个默认的数据库,mysql、oracle或者其他。
但是又不能实时切换,导致请求的第一个类型数据库的请求都可以继续请求,而其他的数据库的请求因为sql语句在不同数据库的count和分页语句不同报错。 解决思路是
①配置先配置多数据源,再配置多个SqlSessionFactory使用不同的数据源,SqlSessionFactory同时指定某些dao层接口(或者mapper),此时不同的dao层就可以访问不同数据源
②在每个SqlSessionFactory中配置一个分页插件 第一步骤中的多数据源配置很多博文都有记录,在此不再重复写,我配置的时候参考的是这个链接
http://blog.csdn.net/neosmith/article/details/61202084
他提供了一个多数据源手动配置,一个自动配置方案。因为我们要在多数据源下另外配置分页插件,所以选用手动配置方案。
重点讲第二步骤:
一、多数据源下配置分页插件
如果你使用的上边的配置方案,那么你现在应该有多个SqlSessionFactory的bean。我们重点来看某个SqlSessionFactory bean的配置:
@Configuration
@MapperScan(basePackages = {"com.firstRest.dao.localLeftjointest"}, sqlSessionFactoryRef = "sqlSessionFactory1")
public class MybatisDbAConfig { @Autowired
@Qualifier("localLeftjointestDataSource")
private DataSource ds1; @Bean
public SqlSessionFactory sqlSessionFactory1() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(ds1); // 使用localLeftjointest数据源, 连接leftjointest库 //分页插件
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(); } @Bean
public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); // 使用上面配置的Factory
return template;
}
}
多出来的代码就是我们需要添加的地方,我们来看一下到底干了些什么:
①新建了一个PageInterceptor,因为Mybatis允许在已经映射语句执行过程中某一点进行拦截调用,而PageHelper就是在这进行分页操作的
②新建一个属性,并添加一些属性值,这些属性值里重要的是:
(1)helperDialect 数据库方言:数据库是什么就写什么就行 mysql、sqlserver、oracle、db2 这样的,详情参考 https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/en/HowToUse.md
(2)supportMethodsArguments 是否支持参数方式进行分页:写true就行了,后边写原因
(3)params 支持了那些参数:pageNum=pageNumKey;pageSize=pageSizeKey。分别对应了分页页码,分页大小。
需要注意的是:
有些博文中写的是在①步骤中新建一个PageHelper对象,设置PageHelper的属性,然后添加到Plugins里面去,现在已经不支持这种写法了! 现在就是要用PageInterceptor!
(2)(3)中设置的是插件是用方案配置,如果这样设置的话,在dao层(或者mapper中)接口同时出现pageNumKey 和 pageSizeKey 参数,这个方法就会被分页。为什么使用这个方法呢,我们之后讲,先这么写就对了。
单个SqlSessionFactory配置好了,其他的SqlSessionFactory在配置分页插件的时候只需要把helperDialect 修改成另外一个数据源数据库类型即可。 二、如何写dao层接口
上边我们设置了supportMethodsArguments 和params,如何使分页插件在我们调用dao层方法的时候生效呢?
代码如下:
@Repository
public interface JlzxDao {
@Select(value = "Select * from ${table_name} order by id")
@ResultType(HashMap.class)
List<HashMap> getAll(@Param("table_name") String tableName,
@Param("pageNumKey") int pageNum,
7 @Param("pageSizeKey") int pageSize);
}
重点看标红的参数,我并没有把这两个参数在sql中使用,但把两个参数写了进去。这样同时出现pageNumKey 和 pageSizeKey 参数,这个方法就会被分页。 这样Dao层咋调用的时候多传两个分页参数过去就可以自动分页了。 三、为何选用这种参数方式使用分页
在单数据源的时候,我使用的是静态方法,即本文最开始的那行代码进行标示,使下一个查询语句进行分页。
但使用这种静态方法时,在service层(或者controller层)判断数据源来自哪里之后使用下边的语句,这是我之前的service层的写法:
 @Service("BaseService")
 public class BasePagingService implements PagingService{
     @Autowired
     private JlzxDao jlzxDao;
     @Autowired
     private LeftjointestDao leftjointestDao;
     @Override
     public PageInfo<HashMap> selectByPage(String dbName,String tableName,int currentPage, int pageSize){
         if(dbName.equals("leftjointest")){
             PageHelper.startPage(currentPage, pageSize);
             return new PageInfo<>(leftjointestDao.getAll(tableName));
         }
         else if(dbName.equals("jlzx")){
             PageHelper.startPage(currentPage, pageSize);
             return new PageInfo<>(jlzxDao.getAll(tableName));
         }
         return null;
     }
 }
这样的方法会报错:在系统中发现了多个分页插件,请检查系统配置!
所以换了参数直接写在dao层方法中的用法。
我的项目链接如下:
https://github.com/Jaccccccccccccccccccccccccccccck/firstREST如有错误,还望指正!
SpringBoot+MyBatis多数据源使用分页插件PageHelper的更多相关文章
- Springboot集成mybatis通用Mapper与分页插件PageHelper
		插件介绍 通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 Example 相关的单表操作.通用 Mapper 是为了解决 MyBatis 使用 ... 
- MyBatis学习总结_17_Mybatis分页插件PageHelper
		如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 分页插件支持任何复杂的单表.多表分页,部分特殊情况请看重要提示. 想要使用分页插件?请看如何使用分页插件. 物理分页 该 ... 
- (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示
		http://blog.csdn.net/yerenyuan_pku/article/details/72774381 上文我们实现了展示后台页面的功能,而本文我们实现的主要功能是展示商品列表,大家要 ... 
- SpringBoot集成MyBatis的分页插件  PageHelper
		首先说说MyBatis框架的PageHelper插件吧,它是一个非常好用的分页插件,通常我们的项目中如果集成了MyBatis的话,几乎都会用到它,因为分页的业务逻辑说复杂也不复杂,但是有插件我们何乐而 ... 
- SpringBoot 使用 MyBatis 分页插件 PageHelper 进行分页查询
		前言:本文档使用的是 SpringBoot,如果是 Spring 还需要在 MyBatis 配置 xml 中配置拦截器,并且 PageHelper 是针对 MyBatis 的,MyBatis 的集成不 ... 
- SpringBoot添加对Mybatis分页插件PageHelper的支持
		1.修改maven配置文件pom.xml,添加对pageHelper的支持: <!--pagehelper--> <dependency> <groupId>com ... 
- SpringBoot Mybatis 分页插件PageHelper
		添加maven配置: <!-- 分布插件 --> <dependency> <groupId>com.github.pagehelper</groupId&g ... 
- Mybatis的分页插件PageHelper
		Mybatis的分页插件PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper 文档地址:http://git.oschina. ... 
- mybatis分页插件PageHelper的使用(转)
		Mybatis 的分页插件PageHelper-4.1.1的使用 Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_P ... 
随机推荐
- SkylineGlobe 6.6 版本API更新
			TEPro6.6API更新 概述 API6.6 较6.5只做了微小的更新,您可以很容易的将6.5的应用程序移植为6.6版本的应用程序. C#环境中,修改步骤如下: 创建SGWorld66实例代替SGW ... 
- sql实时提交事务
			public void deleteByHbtlidAndDept(String class_id,String depart_id) { Session session = this.getHibe ... 
- 重装系统之win10不能进入bios界面
			原因 自Win10发布以来,新出厂的预装Win10的电脑都默认在UEFI模式下启动操作系统.UEFI启动是一种新的主板引导项,正被看做是有近20多年历史的BIOS 的继任者.顾名思义,快速启动是可以提 ... 
- [Entity Framework+MVC复习总结1]-WebForm与Asp.Net MVC
			一.Web开发方式的比较 二.web Form开发模型 WebForm开发优点: 1.支持事件模型开发.得益于丰富的服务器端组件,webfrom开发可以迅速的搭建web应用 2.使用方便,入门容易 3 ... 
- Linux-C-Program:makefile
			注:本文参照博客:https://blog.csdn.net/initphp/article/details/7692923 1. 概述2. 示例说明2.1 无makefile编译2.2 有makef ... 
- EF_DataFrist遇到的问题
			正在 Code First 模式下将此上下文与从 EDMX 文件生成的用于 Database First 或 Model First 开发的代码一起使用.这将无法正常工作.若要解决此问题,请不要删除引 ... 
- kill方法
			删除磁盘上的文件. 语法 Kill 路径名 所需的_路径名_参数是一个字符串表达式,指定要删除的一个或多个文件名. _Pathname_可能包括驱动器和目录或文件夹. 例子删除当前路径下的TXT文档 ... 
- 如何解决jersey框架中以json格式返回数组,当数组中元素一个时json格式不对
			原文地址:http://www.cnblogs.com/swpk/p/3566536.html?utm_source=tuicool jersey 是oracle 出的一个较好的REST框架.使用此框 ... 
- 理解使用static import 机制
			J2SE 1.5里引入了“Static Import”机制,借助这一机制,可以用略掉所在的类或接口名的方式,来使用静态成员.本文介绍这一机制的使用方法,以及使用过程中的注意事项. 在Java程序中,是 ... 
- linux内核设计第七周——可执行程序的装载
