经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
spring boot下mybatis配置双数据源的实例
来源:jb51  时间:2021/9/28 12:15:59  对本文有异议

最近项目上遇到需要双数据源的来实现需求,并且需要基于spring boot,mybatis的方式来实现,在此做简单记录。

单一数据源配置

单一数据源配置的话并没有什么特别的,在spring boot框架下,只需要在配置文件内添加对应的配置项即可,spring boot会自动初始化需要用到的bean。

配置信息如下。这里使用的是德鲁伊的数据源配置方式

  1. #datasource配置
  2. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  3. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  4. spring.datasource.url=jdbc:mysql://xxx
  5. spring.datasource.username=root
  6. spring.datasource.password=123456
  7. #mybatis配置
  8. #mybatis xmlMapper文件路径
  9. mybatis.mapper-locations=classpath:META-INF/mybatis/mapper/*Mapper.xml
  10. mybatis.configuration.map-underscore-to-camel-case=true
  11. #mappers mapper接口文件路径 多个接口时逗号隔开
  12. mapper.mappers=com.xxxx.xxxx
  13. mapper.not-empty=false
  14. mapper.identity=MYSQL

在使用mapper的时候,直接使用spring的注解注入即可。

多个数据源配置

假如需要新增配置一个数据源,那么在spring boot 框架下如何实现呢?在多数据源的情况下,数据源配置需要添加两份,数据源、mybatis等使用到的bean不能再依赖spring boot替我们完成。

多数据源配置文件

配置文件改成如下,第二个数据源的配置前缀需要自定义为另外的。

  1. #datasource 1配置
  2. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  3. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  4. spring.datasource.url=jdbc:mysql://xxx
  5. spring.datasource.username=root
  6. spring.datasource.password=123456
  7. #datasource 2配置,前缀改为second以区分第一个数据源
  8. second.datasource.type=com.alibaba.druid.pool.DruidDataSource
  9. second.datasource.driver-class-name=com.mysql.jdbc.Driver
  10. second.datasource.url=jdbc:mysql://xxx
  11. second.datasource.username=root
  12. second.datasource.password=123456

多数据源配置类

编写第一个数据源使用的配置类,如下所示。

对于Datasource的bean定义,需要使用@ConfigurationProperties(prefix = "spring.datasource")前缀匹配来指定使用第一个数据源的配置,同时还需要使用注解@Primary来指定当有依赖注入需要注入datasource时,优先使用@Primary注解修饰的datasource。

对于SqlSessionFactory定义,我们无法依赖spring boot做自动化配置实现,有一些动作需要我们手动处理。首先是mapper.xml文件路径的指定,这样mapper接口才能注册到mybatis容器中;假如你定义的的mapper接口没有对应的MapperXml,你还需要手动指定mapper接口的包路径作为参数,调用addMappers的方法,进行扫描注册,手动注册接口到mybatis容器中,一般这个过程在解析MapperXml文件时会由mybatis框架实现。

还有就是SqlSessionTemplate,DataSourceTransactionManager的定义,第一个数据源都需要配置为优先注入。

上面所有的配置第一个数据源相关bean优先注入都是为了方便spring容器,管理第一个数据源的mapper接口的代理类实例bean。spring boot实现Mapper代理类实例的注册时,是从容器中获取一个SqlSessionTemplatebean,然后调用SqlSessionTemplate.getMapper()方法获取一个实例的,因此SqlSessionTemplate优先注入者,spring容器管理的Mapper代理类就是对应数据源定义的。所以第一个数据源的Mapper使用时,可以直接使用@Resource注解或者别的依赖注解来使用。

  1. import org.apache.ibatis.session.SqlSessionFactory;
  2. import org.mybatis.spring.SqlSessionFactoryBean;
  3. import org.mybatis.spring.SqlSessionTemplate;
  4. import org.springframework.beans.factory.annotation.Qualifier;
  5. import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.context.annotation.Primary;
  10. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  11. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  12. import javax.sql.DataSource;
  13. /**
  14. * @author garine
  15. * @date 2018年11月16日
  16. **/
  17. @Configuration
  18. public class OdsMybatisConfig {
  19. @Bean
  20. @ConfigurationProperties(prefix = "spring.datasource")
  21. @Primary
  22. public DataSource odsDataSource(){
  23. return DataSourceBuilder.create().build();
  24. }
  25. @Bean
  26. @Primary
  27. public SqlSessionFactory odsSqlSessionFactory(DataSource dataSource) throws Exception {
  28. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  29. bean.setDataSource(dataSource);
  30. //设置mapper.xml文件路径
  31. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:META-INF/mybatis/mapper/*Mapper.xml"));
  32. //设置mapper接口的扫描包路径
  33. //sqlSessionFactory.getConfiguration().addMappers("com.xxx.mapper");
  34. return bean.getObject();
  35. }
  36. @Bean
  37. @Primary
  38. public DataSourceTransactionManager odsTransactionManager(DataSource dataSource) {
  39. return new DataSourceTransactionManager(dataSource);
  40. }
  41. @Bean
  42. @Primary
  43. public SqlSessionTemplate odsSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
  44. return new SqlSessionTemplate(sqlSessionFactory);
  45. }
  46. }

下面是第二个数据源的配置类。针对第二个数据源配置,方法内容基本一致,但是需要注意的是,由于第一个数据源设置了优先配置,那么所有依赖注入默认都将注入第一个数据源的配置,所以第二个数据源配置需要额外指定使用何种bean注入。

datasource的定义需要使用 @Qualifier注解指定值,在依赖注入时使用 @Qualifier和指定值就可以注入目标bean。wmsSqlSessionFactory方法 使用@Qualifier(“wmsDatasource”)注解可以注入第二个数据源bean。

  1. import org.apache.ibatis.session.SqlSessionFactory;
  2. import org.mybatis.spring.SqlSessionFactoryBean;
  3. import org.mybatis.spring.SqlSessionTemplate;
  4. import org.springframework.beans.factory.annotation.Qualifier;
  5. import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.context.annotation.Primary;
  10. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  11. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  12. import javax.sql.DataSource;
  13. /**
  14. * @author garine
  15. * @date 2018年11月16日
  16. **/
  17. @Configuration
  18. public class WmsMybatisConfig {
  19. @Bean
  20. @ConfigurationProperties(prefix = "second.datasource")
  21. @Qualifier("wmsDatasource")
  22. public DataSource wmsDataSource(){
  23. return DataSourceBuilder.create().build();
  24. }
  25. @Bean
  26. @Qualifier("wmsSqlSessionFactory")
  27. public SqlSessionFactory wmsSqlSessionFactory(@Qualifier("wmsDataSource") DataSource dataSource) throws Exception {
  28. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  29. bean.setDataSource(dataSource);
  30. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:META-INF/mybatis/wms/mapper/*Mapper.xml"));
  31. bean.getObject();
  32. SqlSessionFactory sqlSessionFactory = bean.getObject();
  33. //设置wms数据源额外的mapper.java注册
  34. //sqlSessionFactory.getConfiguration().addMappers("com.xx.maper");
  35. return sqlSessionFactory;
  36. }
  37. @Bean
  38. public DataSourceTransactionManager wmsTransactionManager(@Qualifier("wmsDataSource") DataSource dataSource) {
  39. return new DataSourceTransactionManager(dataSource);
  40. }
  41. @Bean
  42. @Qualifier("wmsSqlSessionTemplate")
  43. public SqlSessionTemplate wmsSqlSessionTemplate( @Qualifier("wmsSqlSessionFactory") SqlSessionFactory wmsSqlSessionFactory) throws Exception {
  44. return new SqlSessionTemplate(wmsSqlSessionFactory);
  45. }
  46. }

通过上面的配置就可以实现双数据源配置,下面是使用方式。

  • 第一个数据源定义的maper由spring容器管理,可以直接使用@Resource注解使用
  • 第二个数据源使用可能比较麻烦,代码如下
  1. //依赖注入第二个数据源的SqlSession
  2. @Resource
  3. @Qualifier("wmsSqlSessionTemplate")
  4. SqlSessionTemplate wmsSqlSessionTemplate;
  5. //使用时手动获取Mapper然后调用接口方法
  6. wmsSqlSessionTemplate.getMapper(ReturnResultRecoderMapper.class).selectTest()

最后需要注意一点就是,使用上面的配置方式,mybatis的结果处理器对下划线结果集合并没有自动转换为驼峰方式,需要手动在sql中定义别名。

例如实体

  1. class People{
  2. private String peopleGender;
  3. }

mybatis执行sql,结果集映射为People类。

  1. sekect people_gender from people

people_gender这个结果无法自动映射到peopleGender,需要执行以下sql才能映射上

  1. sekect people_gender as peopleGendler from people

所以这个配置过程应该是漏了某些配置导致结果处理器的名称映射不起作用,这个问题先mark。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号