SpringBoot整合Mybatis-Plus+Druid实现读写分离

需求说明

  1. 给项目导入maven依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.4.1</version>
    </dependency>
  2. 在application.yml中,重新配置数据源的主表和从表连接信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    spring:
    jackson:
    time-zone: GMT+8
    # 主从配置数据源
    datasource:
    dynamic:
    primary: master # 设置默认的数据源或者数据源组,默认值即为master
    datasource:
    master:
    username: ENC(ytrxf1igA4bazqZ6TOOc1A==)
    password: ENC(j/o7k6nZe+yAMoWVWRnjFg==)
    # url: jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false
    url: ENC(HGhXM/YPMbWuzpJU4ih1Fp1odOPrBpp0JZf+3fWXC1UEQuepTvk0tEgOpRL1z0TiK7PJyLw7BaR8vFJeA/jfFk0i3+Vm5pSx5KYFRdOvjvyg4ae+BzmFCi5qdzspZQwGZotZKtjIEls=)
    slave:
    username: ENC(ytrxf1igA4bazqZ6TOOc1A==)
    password: ENC(j/o7k6nZe+yAMoWVWRnjFg==)
    # url: jdbc:mysql://localhost:3307/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    url: ENC(FS523JDxZiuSiZWOxHO4yj0+ZYht3vAgtK/rsXztN4mKJV8KOMN0M34fBKehuJ7jB8rkJoCWptoUqyBrF1pZSevs0OAjFrDXTx31baufuvX5s9Qvbhlk7EiWvaBU0APfXDKLm+5Eivs=)
  3. 完成以上配置使用注解 @DS(“slave”) 即可实现主从切换, “slave” 是yml中配置的从库名字,不加注解默认使用主库 master,注解可以在service和mapper的方法上使用。

  • service层使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @DS("slave")// 执行从表获取数据
    @Override
    public IPage<TabUserInfo> listByPage(Page<TabUserInfo> pageParam, TabUserInfo userInfo) {
    if (userInfo == null){
    return baseMapper.selectPage(pageParam,null);
    }
    QueryWrapper<TabUserInfo> queryWrapper = new QueryWrapper<>();
    String mobile = userInfo.getMobile();
    String name = userInfo.getName();
    queryWrapper
    .like(mobile!=null,"mobile",mobile)
    .like(name!= null,"name", name);

    return baseMapper.selectPage(pageParam,queryWrapper);
    }
  • mapper层使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @DS("slave")
    @Select("<script>" +
    "SELECT mobile,name,id FROM tab_user_info WHERE 1=1" +
    "<if test='mobile != null and mobile != \"\" '>" +
    " AND mobile = #{mobile}" +
    "</if>" +
    " AND age = '18' order by id" +
    "</script>")
    Map<String, Object> selByMobile(String mobile);