Mybatis-plus多数据源配置的两种方式总结
作者:秋日的晚霞 时间:2023-07-24 05:22:48
1.多数据源配置类
整体项目结构
1).pom.xml 项目依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sz</groupId>
<artifactId>MybatisDataSourcesDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>MybatisDataSourcesDemo</name>
<description>MybatisDataSourcesDemo</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.sz.mybatisdatasourcesdemo.MybatisDataSourcesDemoApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2)多数据源配置类
DataSource -> SqlsessionFactory -> SqlSessionTemplate
-> DataSourceTransactionManager
(1).DS1DataSourceConfig 配置类
@MapperScan(basePackages = "com.sz.mybatisdatasourcesdemo.mapper.ds1",sqlSessionTemplateRef = "db1SqlSessionTemplate")
@Component
public class DS1DataSourceConfig {
@Bean
// 给DataSource 绑定属性值
@ConfigurationProperties(prefix = "ds1")
//创建一个数据源对象 底层通过 BeanUtils.instantiateClass(type); 实例化一个数据源对象
//候选的数据源有
//"com.zaxxer.hikari.HikariDataSource",
//"org.apache.tomcat.jdbc.pool.DataSource", "org.apache.commons.dbcp2.BasicDataSource"
public DataSource ds1DataSource(){
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory ds1SqlsessionFactory (
@Qualifier("ds1DataSource")DataSource dataSource
)throws Exception
{
// 工厂bean SqlSessionFactory
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
//设置数据源
bean.setDataSource(dataSource);
//加载映射文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath*:mybatis/ds1/*.xml"));
return bean.getObject();
}
@Bean
// 数据源事务管理器
public DataSourceTransactionManager db1TransactionManager(@Qualifier("ds1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("ds1SqlsessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
(2).DS2DataSourceConfig 配置类
@MapperScan(basePackages = "com.sz.mybatisdatasourcesdemo.mapper.ds2",sqlSessionTemplateRef = "ds2SqlSessionTemplate")
@Component
public class DS2DataSourceConfig {
@Bean
// 给DataSource 绑定属性值
@ConfigurationProperties(prefix = "ds2")
//创建一个数据源对象 底层通过 BeanUtils.instantiateClass(type); 实例化一个数据源对象
//候选的数据源有
//"com.zaxxer.hikari.HikariDataSource",
//"org.apache.tomcat.jdbc.pool.DataSource", "org.apache.commons.dbcp2.BasicDataSource"
public DataSource ds2DataSource(){
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory ds2SqlsessionFactory (
@Qualifier("ds2DataSource")DataSource dataSource
)throws Exception
{
// 工厂bean SqlSessionFactory
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
//设置数据源
bean.setDataSource(dataSource);
//加载映射文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath*:mybatis/ds2/*.xml"));
return bean.getObject();
}
@Bean
// 数据源事务管理器
public DataSourceTransactionManager ds2TransactionManager(@Qualifier("ds2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public SqlSessionTemplate ds2SqlSessionTemplate(@Qualifier("ds2SqlsessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
3) 多Mapper
ds1 路径下 与 ds2 路径下各一个 mapper文件 分别由 ds1配置类 与 ds2配置类 去扫描生成代理类
4) application.properties 配置文件
用两个数据库模拟不同的数据源
# 应用名称
spring.application.name=MybatisDataSourcesDemo
mybatis-plus.mapper-locations=classpath:mybatis/mapper/ds1/*.xml,classpath:mybatis/mapper/ds2/*.xml
#ds1
ds1.type=com.alibaba.druid.pool.DruidDataSource
ds1.jdbc-url=jdbc:mysql://localhost:3306/ds1?serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=CONVERT_TO_NULL
ds1.username=root
ds1.password=root
ds1.driver-class-name=com.mysql.cj.jdbc.Driver
#ds2
ds2.type=com.alibaba.druid.pool.DruidDataSource
ds2.jdbc-url=jdbc:mysql://localhost:3306/ds2?serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=CONVERT_TO_NULL
ds2.username=root
ds2.password=root
ds2.driver-class-name=com.mysql.cj.jdbc.Driver
5) 测试类
@Autowired
private AnimalService animalService;
@Autowired
private UserService userService;
@Test
void contextLoads() {
animalService.remove(null);
userService.remove(null);
Animal animal = new Animal();
animal.setName("老虎");
animalService.save(animal);
User user = new User();
user.setName("张三");
userService.save(user);
List<Animal> animals = animalService.list();
System.out.println("animals = " + animals);
List<User> userList = userService.list();
System.out.println("userList = " + userList);
}
2.@DS 注解 切换数据源
分别在 ds1和 ds2库中添加 user 表
1) 新增依赖
版本与 mybatis-plus保存一致
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
2) application.yml 配置类
spring:
datasource:
dynamic:
# primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
slave_1:
url: jdbc:mysql://localhost:3306/ds1?serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=CONVERT_TO_NULL
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_2:
url: jdbc:mysql://localhost:3306/ds2?serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=CONVERT_TO_NULL
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
3) 添加 @DS注解 切换数据源
@Service
public class UserServiceImpl
extends ServiceImpl<UserMapper, User>
implements UserService {
@Override
@DS("slave_1")
public List<User> findAllDS1()
{
return this.baseMapper.selectList(null);
}
@Override
@DS("slave_2")
public List<User> findAllDS2()
{
return this.baseMapper.selectList(null);
}
}
4) 测试类
@Test
void testDS()
{
List<User> allDS1 = userService.findAllDS1();
System.out.println("allDS1 = " + allDS1);
List<User> allDS2 = userService.findAllDS2();
System.out.println("allDS2 = " + allDS2);
}
来源:https://blog.csdn.net/JAVAlife2021/article/details/127300879
标签:Mybatisplus,多数据源,配置
0
投稿
猜你喜欢
使用C#获取远程图片 Form用户名与密码Authorization认证的实现
2022-01-22 21:44:06
一篇看懂Java中的Unsafe类
2022-02-13 04:02:38
通过Java实现在Word中创建可填充表单
2023-08-05 21:11:40
基于C#实现的仿windows左侧伸缩菜单效果
2023-01-22 18:44:54
Java中匿名类的两种实现方式
2022-06-17 23:57:05
Spring源码解析之编程式事务
2023-06-20 19:17:49
Java创建线程的七种方法总结(全网最全面)
2023-11-03 14:27:26
Spring Boot web项目的TDD流程
2023-07-06 16:10:10
Java HashMap三种循环遍历方式及其性能对比实例分析
2022-03-22 18:36:45
C# ConfigHelper 辅助类介绍
2023-11-20 21:53:09
SpringBoot整合rockerMQ消息队列详解
2021-10-03 10:55:14
Android搭建grpc环境过程分步详解
2023-02-16 01:41:31
java 单例模式的实例详解
2023-10-08 05:14:08
Android通过代码控制ListView上下滚动的方法
2022-06-29 03:07:57
Android 面试精华题目总结
2021-08-13 22:15:44
Java实战之敏感词过滤器
2022-01-18 10:32:03
Java的SPI机制实例详解
2021-08-15 08:47:41
java基于UDP实现在线聊天功能
2021-06-08 00:01:44
springboot注册拦截器所遇到的问题
2023-01-17 21:18:30
Java在web页面上的编码解码处理及中文URL乱码解决
2023-08-25 11:10:19