SpringBoot多数据源改造(二)

        在上一篇的内容中,主要介绍了spring boot项目的多数据源改造的涉及的基本配置及改动。在spring项目中,常用Mybatis做ORM操作数据库,并且分页操作是避免不了的。

因此,这一篇主要介绍多数据源改造过程中Myabatis Pagehelper分页插件的改造。

      PageHelper 支持多数据源、多异构数据源,比如mysql ,druid连接池,oracle等,详情可移步官方文档:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

      当单数据源配置时,常用三种配置方式。

     第一种,在application.propertiesapplication.yml中配置,比如:

  pagehelper:
  helperDialect: mysql
  offsetAsPageNum: true
  rowBoundsWithCount: true
  reasonable: false

第二种,在在mybatis.xml配置中添加,比如:
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- 扫描mapping.xml文件 -->
    <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
    <!-- 配置分页插件 -->
     <property name="plugins">
        <array>
          <bean class="com.github.pagehelper.PageHelper">
            <property name="properties">
              <value>
                helperDialect=mysql
                offsetAsPageNum=true
                rowBoundsWithCount=true
                reasonable=false
              </value>
            </property>
          </bean>
        </array>
      </property>
  </bean>

第三种,也是最常用的,在代码中添加,使用@Bean注解在启动程序的时候初始化,也是本项目在单数据源时的配置,比如:
/**
 * 分页配置
 * @return PageHelper
 */
  @Bean
  public PageHelper pageHelper() {

      PageHelper pageHelper = new PageHelper();
      Properties p = new Properties();
      p.setProperty("offsetAsPageNum", "true");
      p.setProperty("rowBoundsWithCount", "true");
      p.setProperty("reasonable", "true");
      pageHelper.setProperties(p);
      return pageHelper;
  }

那么问题来了,当数据库改为多数据源配置时,这个插件需不需要修改,需要怎么修改呢?

答案是需要修改,项目修改成多数据源后,在启动类中的@Bean注释配置就不会生效了,确定不了使用的数据源了。必须要把分页配置下沉到各个数据源中。

在上一篇改造的基础上修改两个数据源配置类的sqlSessionFactory方法,如下:
/**
* 创建sql工程
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "sqlSessionFactory2")
public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//分页插件
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("dialect", "mysql");
p.setProperty("offsetAsPageNum", "true");
p.setProperty("rowBoundsWithCount", "true");
p.setProperty("reasonable", "true");
pageHelper.setProperties(p);
bean.setPlugins(new Interceptor[]{pageHelper});

//对应mybatis.type-aliases-package配置
bean.setTypeAliasesPackage("com.XXX.ecc.cloudbiz.domain");
//对应mybatis.mapper-locations配置
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:YYY_sqlmap/**/*.xml"));
//开启驼峰映射
bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);

return bean.getObject();
}


    /**
* 创建sql工程
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);

//分页插件
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("dialect", "mysql");
p.setProperty("offsetAsPageNum", "true");
p.setProperty("rowBoundsWithCount", "true");
p.setProperty("reasonable", "true");
pageHelper.setProperties(p);
bean.setPlugins(new Interceptor[]{pageHelper});

//对应mybatis.type-aliases-package配置
bean.setTypeAliasesPackage("com.XXX.ecc.cloudbiz.domain");
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:sqlmap/**/*.xml"));
//开启驼峰映射
bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);

return bean.getObject();
}
并且去掉启动类中的分页插件配置,至此改造完毕。

说明 :
1、本次改造基于的pagehelper版本如下:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.0.3</version>
</dependency>


2、这里有一个地方需要注意,在sqlSessionFactory的方法中,分页的配置最好要先于MapperLocation的配置,否则可能分页不生效,还是查询全部结果

 

posted @ 2019-05-29 23:22  xuzhujack  阅读(538)  评论(0编辑  收藏  举报
;