SpringBoot多数据源切换

多数据源配置,如果使用的是mybatis-plus,可以整合同样是mybatis-plus开发的jar包dynamic-datasource,可以很简单的通过注解做数据库切换。

官方地址:
https://baomidou.com/pages/a61e1b/#dynamic-datasource

简介:

  • 支持数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
  • 支持数据库敏感配置信息 加密 ENC()。
  • 支持每个数据库独立初始化表结构schema和数据库database。
  • 支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。
  • 支持 自定义注解 ,需继承DS(3.2.0+)。
  • 提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。
  • 提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。
  • 提供 自定义数据源来源 方案(如全从数据库加载)。
  • 提供项目启动后 动态增加移除数据源 方案。
  • 提供Mybatis环境下的 纯读写分离 方案。
  • 提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
  • 支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
  • 提供 **基于seata的分布式事务方案。
  • 提供 本地多数据源事务方案。

引入pom:

        
            com.baomidou
            mybatis-plus-boot-starter
            3.5.1
        

        
            com.baomidou
            dynamic-datasource-spring-boot-starter
            3.5.1
        

如果需要连不同的数据库,需要引入各个数据库的连接依赖包

   
   
            mysql
            mysql-connector-java
            8.0.22
   

  
        
            com.microsoft.sqlserver
            mssql-jdbc
            8.4.1.jre8
        

yml配置:

spring:
  datasource:
    dynamic:
      primary: db1 #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        db1:
          url: jdbc:sqlserver://localhost:1433;DatabaseName=inventory_engine
          username: root
          password: xxx
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver  # 3.2.0开始支持SPI可省略此配置
        db2:
          url: jdbc:mysql://localhost:3306/inventory_engine?characterEncoding=utf-8&serverTimezone=UTC
          username: root
          password: xxx
          driver-class-name: com.mysql.cj.jdbc.Driver  # 3.2.0开始支持SPI可省略此配置

新建DB1Service类,用于验证是否可以切换不同的数据源对数据库进行操作,在db1中建了表test1,包含字段user_name,sex,在db2中建了表test2,字段name,sex

在方法上使用@DS注解,即可实现数据源的切换,此注解可以用在类上或者方法上,方法上的注解优先于类上注解

@Service
public class DB1Service {

    @Autowired
    private JdbcTemplate jdbcTemplate;


    public void insertTest1(){
        jdbcTemplate.execute("insert into test1(user_name,sex) values ('zhangsan',1)");
    }

    @DS("db2")
    public void insertTest2(){
        jdbcTemplate.execute("insert into test2(name,sex) values ('lisi',1)");
    }
}
注解 结果
没有@DS 默认数据源
@DS(“dsName”) dsName可以为组名也可以为具体某个库的名称

新建测试Controller,模拟接口调用

@RestController
public class MyController {

    @Autowired
    private DB1Service db1Service;

    @RequestMapping("/test")
    public String test(){
        db1Service.insertTest1();
        db1Service.insertTest2();
        return "hello,world";
    }
}

结果:
test1表:
SpringBoot多数据源切换_第1张图片

test2表:
SpringBoot多数据源切换_第2张图片

你可能感兴趣的:(spring,boot,mybatis,java)