引入依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
配置文件
增加多数据源配置, 每个数据源拥有自己的标识,如下面配置中的mysql_1、mysql_2、mysql_3 primary指定主数据源,即默认数据源,多数据源在使用中不指定数据源则只会使用默认数据源,可以在方法或类上指定数据源,使用@DS(“mysql_3”)。 数据源切换原理为aop, spring托管的bean在调用方法时若存在@DS切点则会进行数据源切换,多个切点会覆盖,如Service方法上使用了@DS,则会进行一次数据源切换,方法中使用了一个包含@DS的mapper,则调用mapper时会再次进行数据源切换。 @DS方法上优先于类上使用,类上使用@DS则对所有方法有效,方法上再次使用@DS则会覆盖类的@DS。
spring:
datasource:
dynamic:
primary: mysql_1
datasource:
mysql_1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/my_log?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
username: root
password: 133133
mysql_2:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/mydb?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
username: root
password: 133133
mysql_3:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/my_security?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
username: root
password: 133133
代码
启动类增加mapper扫描
@MapperScan(basePackages = "cn.spring.dynamic.mapper")
@SpringBootApplication
public class CnSpringDynamicApplication {
public static void main(String[] args) {
SpringApplication.run(CnSpringDynamicApplication.class, args);
}
}
创建mapper,并应用多数据源配置,指定数据源
@DS("mysql_3")
@Repository
public interface UserMapper {
UserEntity queryUser(@Param("username") String username);
@DS("mysql_2")
List<UserEntity> queryUserList(@Param("username") String username);
}
mapper对应的xml sql
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.spring.dynamic.mapper.UserMapper">
<select id="queryUser" resultType="cn.spring.dynamic.entity.UserEntity">
SELECT * FROM USER t WHERE t.username=#{username} LIMIT 1
</select>
<select id="queryUserList" resultType="cn.spring.dynamic.entity.UserEntity">
SELECT * FROM USER t WHERE t.username=#{username}
</select>
</mapper>
测试类
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class MyTest {
@Autowired
private UserMapper userMapper;
@Test
public void testQuery() {
UserEntity user = this.userMapper.queryUser("test");
System.out.println(JSONObject.toJSONString(user));
List<UserEntity> userList = this.userMapper.queryUserList("test");
System.out.println(JSONObject.toJSONString(userList));
}
}
执行结果 第一个查询成功,使用数据源mysql_3 查询my_security数据库 第二个查询报错,queryUserList方法因为指定了数据源为mysql_2,查询mydb数据库,这个库没有建user表,报错了
同一个方法中两个查询使用了不同的两个数据源,可以看到数据源切换成功了
关于多数据源切换原理介绍可以看看另一篇《mybatis plus动态数据源切换及查询过程浅析》
|