MyBatis-Plus多数据源

  1. 在线文档
    ------------------------------------------功能------------------------------------------
    1.支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
    2.支持数据库敏感配置信息 加密 ENC()。
    3.支持每个数据库独立初始化表结构schema和数据库database。
    4.支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。
    5.支持 自定义注解 ,需继承DS(3.2.0+)。
    6.提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。
    7.提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。
    8.提供 自定义数据源来源 方案(如全从数据库加载)。
    9.提供项目启动后 动态增加移除数据源 方案。
    10.提供Mybatis环境下的 纯读写分离 方案。
    11.提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
    12.支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
    13.提供 **基于seata的分布式事务方案。
    14.提供 本地多数据源事务方案。
    
    ------------------------------------------约定------------------------------------------
    1.本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。
    2.配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。
    3.切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。
    4.默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。
    5.方法上的注解优先于类上注解。
    6.DS支持继承抽象类上的DS,暂不支持继承接口上的DS。
  2. 项目创建

  3. pom.xml
    <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>3.6.1</version>
    </dependency>
  4. application.yml
    spring:
      datasource:
        dynamic:
          primary: master #设置默认的数据源或者数据源组,默认值即为master
          strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
          datasource:
            master:
              url: jdbc:mysql://localhost:3306/dynamic
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver
            slave_1:
              url: jdbc:mysql://localhost:3307/dynamic
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver
            slave_2:
              url: jdbc:mysql://localhost:3308/dynamic
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver
            oracle:
              url: jdbc:oracle:thin:@192.168.1.97:1521:ORCLCDB
              username: c##oracle19c
              password: 123456
              driver-class-name: oracle.jdbc.driver.OracleDriver
  5. 数据库连接


  6. 数据表创建
    1.MySQL脚本
    DROP TABLE IF EXISTS `Student`;
    CREATE TABLE Student (
      id INT PRIMARY KEY,
      name VARCHAR(255),
      age INT,
      email VARCHAR(255)
    );
    
    2.Oracle脚本
    -- DROP TABLE Student;
    CREATE TABLE Student (
      id NUMBER(10) PRIMARY KEY,
      name VARCHAR2(255),
      age NUMBER(3),
      email VARCHAR2(255)
    );
    选中数据库Ctrl+Shift+Q打开控制台-->粘贴并选中SQL脚本-->Ctrl+Enter执行SQL脚本

  7. 代码生成(MybatisX)
    参考:https://blog.csdn.net/tongxin_tongmeng/article/details/128627980
  8. Mapper扫描
    @SpringBootApplication
    @MapperScan("com.mybatis.plus.mapper")
    public class MybatisPlusApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(MybatisPlusApplication.class, args);
    	}
    
    }
  9. 测试接口
    1.@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。
    2.没有@DS则使用默认数据源,@DS("dsName")中dsName可以为组名也可以为具体某个库的名称。
    @RestController
    @RequestMapping("/student")
    public class StudentController {
    
        @Autowired
        private StudentService studentService;
    
        // 没有@DS则使用默认数据源master
        @GetMapping("/masterSave")
        public Boolean masterSave(@RequestBody Student student) {
            return studentService.save(student);
        }
    
        // 没有@DS则使用默认数据源master
        @GetMapping("/masterList")
        public List<Student> masterList() {
            return studentService.list();
        }
    
        // @DS("dsName")中dsName为组名slave-->slave_1与slave_2交替保存
        @DS("slave")
        @GetMapping("/slaveSave")
        public Boolean slaveSave(@RequestBody Student student) {
            return studentService.save(student);
        }
    
        // @DS("dsName")中dsName为组名slave-->slave_1与slave_2交替查询
        @DS("slave")
        @GetMapping("/slaveList")
        public List<Student> slaveList() {
            return studentService.list();
        }
    
        // @DS("dsName")中dsName为数据源oracle
        @DS("oracle")
        @GetMapping("/oracleSave")
        public Boolean oracleSave(@RequestBody Student student) {
            return studentService.save(student);
        }
    
        // @DS("dsName")中dsName为数据源oracle
        @DS("oracle")
        @GetMapping("/oracleList")
        public List<Student> oracleList() {
            return studentService.list();
        }
    
    }
  10. master创建及查询

    {
        "id": 111,
        "name": "master",
        "age": 111,
        "email": "master"
    }


  11. slave创建及查询

    {
        "id": 222,
        "name": "slave",
        "age": 222,
        "email": "slave"
    }

    {
        "id": 333,
        "name": "slave",
        "age": 333,
        "email": "slave"
    }

    1.向slave数据源组插入数据时,交替向slave_1和slave_2分别插入一条数据。
    2.向slave数据源组查询数据时,交替向slave_1和slave_2分别查询一条数据。

  12. oracle创建及查询

    {
        "id": 444,
        "name": "oracle",
        "age": 444,
        "email": "oracle"
    }


猜你喜欢

转载自blog.csdn.net/tongxin_tongmeng/article/details/129855221