• 08在MyBatis-Plus中配置多数据源


    配置多数据源

    模拟多库场景

    适用于多种场景: 多库(操作的表分布在不同数据库当中),读写分离(有的数据库负责查询的功能,有的数据库负责增删该的功能),一主多从,混合模式等

    第一步: 模拟多库,在mybatis_plus数据库中创建user表,在mybatis_plus_1数据库中创建product表

    --创建mybatis_plus数据库
    CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
    use `mybatis_plus`;
    --创建user表
    CREATE TABLE `t_user` (
        `id` bigint(20) NOT NULL COMMENT '主键ID',
        `name` varchar(30) DEFAULT NULL COMMENT '姓名',
        `age` int(11) DEFAULT NULL COMMENT '年龄',
        `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    --向user表中插入数据
    INSERT INTO t_user (id, name, age, email) VALUES
    (1, 'Jone', 18, 'test1@baomidou.com'),
    (2, 'Jack', 20, 'test2@baomidou.com'),
    (3, 'Tom', 28, 'test3@baomidou.com'),
    (4, 'Sandy', 21, 'test4@baomidou.com'),
    (5, 'Billie', 24, 'test5@baomidou.com');
    --创建mybatis_plus_1数据库
    CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
    use `mybatis_plus_1`;
    --创建product表
    CREATE TABLE t_product(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称',
    price INT(11) DEFAULT 0 COMMENT '价格',
    version INT(11) DEFAULT 0 COMMENT '乐观锁版本号',
    PRIMARY KEY (id)
    );
    --向product表插入数据
    INSERT INTO t_product (id, NAME, price) VALUES (1, '外星人笔记本', 100);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    第二步:在pom.xml文件中引入多数据源使用的依赖

    
    <dependency>
        <groupId>com.baomidougroupId>
        <artifactId>dynamic-datasource-spring-boot-starterartifactId>
        <version>3.5.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    第三步: 在appilcation.yaml文件中添加配置多数据源的配置选项

    spring:
      # 配置数据源信息
      datasource:
        dynamic:
          # 设置默认的数据源或者数据源组,默认值即为master
          primary: master
          # 严格匹配数据源(默认false),true表示如果未匹配到指定数据源时抛异常,false表示如果未匹配到指定的数据源就使用默认的数据源
          strict: false
          datasource:
            master: # 默认数据源
              url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
              driver-class-name: com.mysql.cj.jdbc.Driver
              username: root
              password: 123456
            slave_1: # 其他数据源
              url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
              driver-class-name: com.mysql.cj.jdbc.Driver
              username: root
              password: 123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    第四步: 创建实体类封装表中查询的数据

    //封装用户信息的实体类
    @Data
    @TableName("t_user")
    public class User {
        private Integer id;
        private String name;
        private Integer age;
        private String email;
    }
    //封装产品信息的实体类
    @Data
    @TableName("t_product")
    public class Product {
        private Integer id;
        private String name;
        private Integer price;
        private Integer version;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    第五步: 编写User和Product对应的mapper接口和service接口

    @Repository
    public interface ProductMapper extends BaseMapper<Product> {
    }
    
    @Repository
    public interface UserMapper extends BaseMapper<User> {
    }
    
    public interface UserService extends IService<User> {}
    
    public interface ProductService extends IService<Product> {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    第六步: 创建User和Product实体类对应的service接口的实现类,使用@DS注解指定当前类或方法要操作的数据源

    • @Ds注解使用在方法上或类上(使用在类上表示类中所有的方法默认都有该注解)
    • @Ds注解在类和方法上同时存在则遵循就近原则,方法上指定操作的数据源优先于类上指定操作的数据源
    注解结果
    没有@DS注解操作默认的数据源
    @DS(“dsName”)dsName为要操作的数据源名称
    @Service
    @DS("master") //t_user表在master数据源当中
    public class UserServiceImpl extends ServiceImpl<UserMapper, User> implementsUserService {
    }
    
    @Service
    @DS("slave_1")//t_product表在slave_1数据源当中
    public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第七步: 编写Spring Boot主程序的启动类

    @SpringBootApplication
    @MapperScan("com.atguigu.mybatisplus.mapper")// 扫描mapper接口所在的包
    public class MybatisPlusDatasourceApplication {
        public static void main(String[] args) {
            SpringApplication.run(MybatisPlusDatasourceApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第八步: 由于t_user表和t_product在两个不同的数据库(数据源)中,如果通过一个测试方法可以分别获取到用户数据与商品数据成功说明多库模拟成功

    @SpringBootTest
    public class MybatisPlusDatasourceApplicationTests {
    	@Autowired
    	private UserService userService;
    	@Autowired
    	private ProductService productService;
    	@Test
    	public void testDynamicDataSource(){
            // 输出查询出来的对象
    		System.out.println(userService.getById(1));
    		System.out.println(productService.getById(1));
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    模拟读写分离

    实现读写分离的效果

    • 写操作: 增删改操作的方法加上@DS注解指定操作主库数据源,因为只有主数据源才可以把更新的操作同步到从数据源
    • 读操作: 查询操作的方法指定操作从库数据源
  • 相关阅读:
    【模型推理优化学习笔记】CUDA加速矩阵乘计算
    github提示Permission denied (publickey),如何才能解决
    SpringCloud Nacos + Ribbon 调用服务的 2 种方法!
    计算机网络——常见问题汇总2
    【STM32】STM32中断体系
    php实战案例记录(6)伪静态设置
    基于 FFmpeg 的跨平台视频播放器简明教程(十一):一种简易播放器的架构介绍
    如何抓取AJAX请求
    2022年下半年网络工程师上午真题及答案解析
    Spring事务失效常见场景
  • 原文地址:https://blog.csdn.net/qq_57005976/article/details/132923263