在我们的项目中不免会遇到需要在一个项目中使用多个数据源的问题,像我在得到一个任务将用户的聊天记录进行迁移的时候,就是用到了三个数据源,当时使用的AOP的编程方式根据访问的方法的不同进行动态的切换数据源,觉得性能不太好,先在又新用到了一种使用方式,觉得不错,记录下来。

  介绍一下DEMO项目,使用的spring boot集成mybatis,mybatis查询数据库是基于注解形式查询的,目的查询两个数据库test1和test2的用户信息,并在控制台打印。

  1.pom文件

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.mybatis.spring.boot</groupId>
  8. <artifactId>mybatis-spring-boot-starter</artifactId>
  9. <version>2.1.1</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.alibaba</groupId>
  13. <artifactId>druid-spring-boot-starter</artifactId>
  14. <version>1.1.10</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>mysql</groupId>
  18. <artifactId>mysql-connector-java</artifactId>
  19. <scope>runtime</scope>
  20. <version>5.1.27</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-test</artifactId>
  25. <scope>test</scope>
  26. <exclusions>
  27. <exclusion>
  28. <groupId>org.junit.vintage</groupId>
  29. <artifactId>junit-vintage-engine</artifactId>
  30. </exclusion>
  31. </exclusions>
  32. </dependency>
  33. </dependencies>
  34.  
  35. <build>
  36. <resources>
  37. <resource>
  38. <directory>src/main/java</directory>
  39. <includes>
  40. <include>
  41. **/*.xml
  42. </include>
  43. </includes>
  44. </resource>
  45. <resource>
  46. <directory>src/resources</directory>
  47. </resource>
  48. </resources>
  49. <plugins>
  50. <plugin>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-maven-plugin</artifactId>
  53. </plugin>
  54. </plugins>
  55. </build>

  其中添加了alibaba的druid的数据源代替了spring boot默认的hikacp,注意mysql的驱动的版本号要与自己所使用的mysql的版本号保持一致,其中build模块里面的resources里面是为了防止spring boot 过滤掉src/main/java的XML文件,毕竟有的人喜欢mybatsi查询数据库的时候使用的是XML映射文件,不过我们本次使用的 是注解的形式 ,所以<resources>里面的内容在项目中没有用到。如果直接使用注解,可以忽略该内容。

  2.用户类

  1. public class User {
  2. public Integer id;
  3. public String name;
  4. public String address;
  5.  
  6. @Override
  7. public String toString() {
  8. return "User{" +
  9. "id=" + id +
  10. ", name='" + name + '\'' +
  11. ", address='" + address + '\'' +
  12. '}';
  13. }
  14. //get set方法省略...........
  15. }

  用户类没有什么好说的,就是基本的几个属性。

  3.application.properties文件配置

  1. spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
  2. spring.datasource.one.username=root
  3. spring.datasource.one.password=123456
  4. spring.datasource.one.url=jdbc:mysql://localhost:3306/test1
  5.  
  6. spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
  7. spring.datasource.two.username=root
  8. spring.datasource.two.password=123456
  9. spring.datasource.two.url=jdbc:mysql://localhost:3306/test2

  这里主要配置了两个数据库的访问属性,注意两个的区别为one何two的前缀不同,方便在下面使用spring boot的类安全属性的方式创建不同的数据源。

  4.根据不同的前缀创建不同的数据源

  1. @Configuration
  2. public class DataSourceConfig {
  3. @Bean
  4. @ConfigurationProperties(prefix = "spring.datasource.one")
  5. public DataSource dsOne(){
  6. return DruidDataSourceBuilder.create().build();
  7. }
  8. @Bean
  9. @ConfigurationProperties(prefix = "spring.datasource.two")
  10. public DataSource dsTwo(){
  11. return DruidDataSourceBuilder.create().build();
  12. }
  13. }

  该类位于主目录的config目录下面,使用@ConfigurationProperties注解表明对应的DataSource创建的时候使用的配置文件的内容。

  5.在主目录下面分别创建mapper1和mapper2包,在对应的包下面创建对应的数据层访问接口UserMapper1和UserMapper2,内容都如下所示

  1. @Mapper
  2. public interface UserMapper1 {
  3. @Select("select * from users")
  4. List<User> getAllUser();
  5. }

  这接口里面没有什么好说的就是一个简单的mytatis的基于注解的查询所有用户的接口。

  6.在config包下面创建不同的配置类MybatisConfigOne和MybatisConfigTwo两个类分别对应去扫描mapper1和mapper2两个路径下面的dao层接口。

  1. @Configuration
  2. @MapperScan(basePackages = "com.hopec.mybatis.mapper1",sqlSessionFactoryRef = "sqlSessionFactory1",
  3. sqlSessionTemplateRef = "sqlSessionTemplate1")
  4. public class MybatisConfigOne {
  5. @Autowired
  6. @Qualifier("dsOne")
  7. DataSource ds1;
  8. @Bean
  9. SqlSessionFactory sqlSessionFactory1(){
  10. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  11. bean.setDataSource(ds1);
  12. try {
  13. return bean.getObject();
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. }
  17. return null;
  18. }
  19. @Bean
  20. SqlSessionTemplate sqlSessionTemplate1(){
  21. return new SqlSessionTemplate(sqlSessionFactory1());
  22. }
  23. }
  1. public class MybatisConfigTwo {
  2. @Autowired
  3. @Qualifier("dsTwo")
  4. DataSource ds2;
  5. @Bean
  6. SqlSessionFactory sqlSessionFactory2(){
  7. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  8. bean.setDataSource(ds2);
  9. try {
  10. return bean.getObject();
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. return null;
  15. }
  16. @Bean
  17. SqlSessionTemplate sqlSessionTemplate2(){
  18. return new SqlSessionTemplate(sqlSessionFactory2());
  19. }
  20. }

  7.测试

  1. @SpringBootTest
  2. class MybatisApplicationTests {
  3. @Autowired
  4. UserMapper1 userMapper1;
  5. @Autowired
  6. UserMapper2 userMapper2;
  7. @Test
  8. void contextLoads() {
  9. List<User> users = userMapper1.getAllUser();
  10. System.out.println(users);
  11. List<User> allUser = userMapper2.getAllUser();
  12. System.out.println(allUser);
  13.  
  14. }
  15.  
  16. }

  测试结果:

  如果想使用多个数据源,就继续增加就可以了,ok,大功告成了!

spring boot mybatis多多数据源解决方法的更多相关文章

  1. spring boot mybatis 多数据源配置

    package com.xynet.statistics.config.dataresources; import org.springframework.jdbc.datasource.lookup ...

  2. spring boot Mybatis多数据源配置

    关于 有时候,随着业务的发展,项目关联的数据来源会变得越来越复杂,使用的数据库会比较分散,这个时候就会采用多数据源的方式来获取数据.另外,多数据源也有其他好处,例如分布式数据库的读写分离,集成多种数据 ...

  3. Spring Boot + Mybatis 多数据源配置实现读写分离

    本文来自网易云社区 作者:王超 应用场景:项目中有一些报表统计与查询功能,对数据实时性要求不高,因此考虑对报表的统计与查询去操作slave db,减少对master的压力. 根据网上多份资料测试发现总 ...

  4. spring boot项目自定义数据源,mybatisplus分页、逻辑删除无效解决方法

    Spring Boot项目中数据源的配置可以通过两种方式实现: 1.application.yml或者application.properties配置 2.注入DataSource及SqlSessio ...

  5. Spring Boot + Mybatis 实现动态数据源

    动态数据源 在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库.又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动 ...

  6. Spring Boot + Mybatis 配置多数据源

    Spring Boot + Mybatis 配置多数据源 Mybatis拦截器,字段名大写转小写 package com.sgcc.tysj.s.common.mybatis; import java ...

  7. Spring boot Mybatis 整合(完整版)

    个人开源项目 springboot+mybatis+thymeleaf+docker构建的个人站点开源项目(集成了个人主页.个人作品.个人博客) 朋友自制的springboot接口文档组件swagge ...

  8. Spring Boot MyBatis 数据库集群访问实现

    Spring Boot MyBatis 数据库集群访问实现 本示例主要介绍了Spring Boot程序方式实现数据库集群访问,读库轮询方式实现负载均衡.阅读本示例前,建议你有AOP编程基础.mybat ...

  9. spring boot + mybatis + layui + shiro后台权限管理系统

    后台管理系统 版本更新 后续版本更新内容 链接入口: springboot + shiro之登录人数限制.登录判断重定向.session时间设置:https://blog.51cto.com/wyai ...

随机推荐

  1. Redis基础(官方文档总结)

    REmote DIctionary Server(Redis) Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供 ...

  2. filebeat的@timestamp字段时区问题

    最近使用filebeat进行日志采集,并通过logstash对日志进行格式化处理. filebeat采集数据后,会给日志增加字段@timestamp,@timestamp是UTC时间,查看日志很不方便 ...

  3. Android Studio [水平布局LinearLayout]

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  4. calico的ipip与bgp的模式分析

    1.前言 BGP工作模式: bgp工作模式和flannel的host-gw模式几乎一样: bird是bgd的客户端,与集群中其它节点的bird进行通信,以便于交换各自的路由信息: 随着节点数量N的增加 ...

  5. Spring 梳理-MVC-前端控制器DispatchServlet及URL请求处理过程

    大多数基于java的web框架,都有前端控制器 spring mvc请求过程 1. 请求会首先发送到DispatchServlet,这是spring的前置Servlet,它会接收请求并转发给sprin ...

  6. Spring BeanDefinition的加载

     前面提到AbstractRefreshableApplicationContext在刷新BeanFactory时,会调用loadBeanDefinitions方法以加载系统中Bean的定义,下面将讲 ...

  7. Android开发——Kotlin开发APP使用笔记

    之前一直使用java来开发Android项目,学了新的kotlin语言,前来试一试,并说一下kotlin对Android的一些功能增强 创建项目 我使用的是Android Studio3.0+,所以默 ...

  8. kubernetes垃圾回收器GarbageCollector Controller源码分析(二)

    kubernetes版本:1.13.2 接上一节:kubernetes垃圾回收器GarbageCollector Controller源码分析(一) 主要步骤 GarbageCollector Con ...

  9. php实现商城秒杀

    这一次总结和分享用Redis实现分布式锁来完成电商的秒杀功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意思,若有误请谅解 ...

  10. Http协议Content-Length详解

    前言 http协议是互联网中最重要的协议之一,虽然看上去很简单,但是实际中经常遇到问题,我们就已经遇到好几次了.有长连接相关的,有报文解析相关的.对http协议不能一知半解,必须透彻理解才行.本文通过 ...