← 返回首页
MybatisPlus基础教程(十六)
发表时间:2021-12-20 20:12:38
多数据源

dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。这是一个第三方 mybatis 扩展库,与 mybatis-plus 本身无关,属于组织参与者小锅盖个人发起的项目,任何行为与 baomidou 组织其它成员无关。

dynamic-datasource特性

实例: 项目结构图如下:

实现步骤:

1.在pom.xml中添加dynamic-datasource依赖

<!--mybatis-plus multi-datasource plugin-->
 <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
      <version>3.5.0</version>
 </dependency>

2.配置数据源

#yml格式配置文档范例
server:
  #端口配置
  port: 8080
  #上下文
  servlet:
    context-path: /multidsdemo
#数据源配置
spring:
  #开启热部署
  devtools:
    restart:
      enabled: true
      #让静态页面也能热部署
      additional-paths: resources/**,static/**,templates/**
  #配置数据源
  datasource:
    #多数据源配置
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave:
          url: jdbc:mysql://localhost:3306/demo?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
    #Springboot2.0 的hikari配置
    hikari:
      minimum-idle: 5
      #空闲连接存活最大时间,默认600000(10分钟)
      idle-timeout: 180000
      #连接池最大连接数,默认是10
      maximum-pool-size: 10
      #此属性控制从池返回的连接的默认自动提交行为,默认值:true
      auto-commit: true
      #连接池名称
      pool-name: MyHikariCP
      #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      max-lifetime: 1800000
      #数据库连接超时时间,默认30秒,即30000
      connection-timeout: 30000
      connection-test-query: SELECT 1
  jpa:
    show-sql: true
    properties:
      hibernate:
        #dialect: org.hibernate.dialect.MySQL5Dialect ,注意这个是不支持事务的方言。
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
        format_sql: true
        #配置懒加载策略
        enable_lazy_load_no_trans: true
        hbm2ddl:
          auto: update

3.使用 @DS 切换数据源

注解 结果
没有@DS 默认数据源
@DS("dsName") dsName可以为组名也可以为具体某个库的名称

UsersService.java

import com.baomidou.mybatisplus.extension.service.IService;
import com.simoniu.mp.multidsdemo.entity.Users;

import java.util.List;

public interface UsersService extends IService<Users> {

    //从Master数据源查询所有用户
    List<Users> queryAllUsersWithMaster();
    //从Salve数据源查询所有用户
    List<Users> queryAllUsersWithSalve();
}

UsersServiceImpl.java


import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.simoniu.mp.multidsdemo.entity.Users;
import com.simoniu.mp.multidsdemo.mapper.UsersMapper;
import com.simoniu.mp.multidsdemo.service.UsersService;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;


@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper,Users> implements UsersService {
    //没有@DS 默认数据源master
    @Override
    public List<Users> queryAllUsersWithMaster() {
        return  super.list(null);
    }

    @Override
    //使用salve数据源
    @DS("slave")
    public List<Users> queryAllUsersWithSalve() {
        return super.list(null);
    }
}

单元测试


import com.simoniu.mp.multidsdemo.entity.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UsersServiceTest {

    @Resource
    private UsersService usersService;

    @Test
    public void testQueryAllUsersWithMaster(){
       List<Users> usersList = usersService.queryAllUsersWithMaster();
       usersList.forEach(System.out::println);
    }

    @Test
    public void testQueryAllUsersWithSalve(){
        List<Users> usersList = usersService.queryAllUsersWithSalve();
        usersList.forEach(System.out::println);
    }
}

测试结果:

//master数据源数据
Users(uid=1, username=管理员, password=123456)
Users(uid=2, username=张三, password=654321)
//salve数据源数据
Users(uid=1, username=admin, password=123456)
Users(uid=2, username=zhangsan, password=654321)