1.配置多数据源后需要注意的地方
2.配置说明
目录
1.配置多数据源后需要注意的地方
2.配置说明
多数据源的实现方法比较多,基于springboot和mybatis的情况下,有基于AOP进行动态数据源配置的实现,也有直接通过配置不同的SqlSessionFactory去扫描不同目录去实现,也有通过dynamic-datasource-spring-boot-starter去实现。此外,还有通过各种第三方开源组件例如ShardingSphere实现的多数据源配置。本文着重介绍通过不同的SqlSessionFactory去实现多数据源配置。
1.配置多数据源后需要注意的地方
Springboot配置MybatisPlus(或Mybaits)多数据源后,常见的功能使用可能需要关注几个地方。
1.1数据源配置变化
eg:
单数据源 | 多数据源 | |
数据源url | -url |
...
1.2 分页问题
使用多数据源后,分页可能会失效,这个时候需要重新往SqlSessionFactory注册分页拦截器。从MyBatis-Plus 3.4.0开始,不再使用旧版本的PaginationInterceptor ,而是使用MybatisPlusInterceptor。
首先配置分页拦截器Bean
import ;
import ;
import ;
import ;
import ;
/**
*
* @Description // 多数据源配置时,多种配置会失效。
* 例如mybatisplus分页插件、数据库字段下换线自动转驼峰格式失效
* @Date 2023/5/10
**/
@Configuration
public class MyBatisPlusConfig {
/**
* mybatis-plus分页插件
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
(new PaginationInnerInterceptor());
return interceptor;
}
}
然后将分页拦截器配置到SqlSessionFactory
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @Author wengguochao@
* @Description // 配置mybatis的SessionFactory和SessionTemplate
* @Date 2023/5/10
**/
@Configuration
@MapperScan(value = ".db1",sqlSessionFactoryRef = "sqlSessionFactoryBeanOne")
public class MybatisConfigOne {
@Resource
@Qualifier("dsOne")
DataSource dsOne;
@Resource
private MybatisPlusInterceptor mybatisPlusInterceptor;
@Bean
SqlSessionFactory sqlSessionFactoryBeanOne() throws Exception {
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
(dsOne);
(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/**/*.xml"));
// 多数据源控制台打印sql,配置任意一个数据源即可
MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
();
(mybatisConfiguration);
// 设置分页插件
(mybatisPlusInterceptor);
return ();
}
@Bean
SqlSessionTemplate sqlSessionTemplate1() throws Exception {
return new SqlSessionTemplate(sqlSessionFactoryBeanOne());
}
}
1.3 IDEA控制台不打印Sql日志
多数据源需要手动配置SQL打印,选择任意一个SqlSessionFactoryBean注册日志打印即可。代码请参考1.2代码块
2.配置说明
Maven配置部分说明:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0" xmlns:xsi="http:///2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId></groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.11</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId></groupId>
<artifactId>springboottest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboottest</name>
<description>Demo project for Spring Boot</description>
<properties>
<>8</>
</properties>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--MybatisPlus引入-->
<dependency>
<groupId></groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.31</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId></groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId></groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.1配置DataSource
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @Author wengguochao@
* @Description //
* @Date 2023/5/10
**/
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties("")
public DataSource dsOne(){
return ().type().build();
// return ().build();
}
@Bean
@ConfigurationProperties("")
public DataSource dsTwo(){
// return ().type().build();
return ().build();
}
}
2.2 Springboot配置文件配置数据源信息
#mybatis多数据源
-url=jdbc:mysql://.:3339/testSys?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
=root
=123456
-class-name=
#mybatis多数据源[ 多数据源源需要注意url和driver-class与单数据源的区别]
-url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
#-url=jdbc:mysql://.:3340/testSys?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
=root
=123456
-class-name=
2.3配置SqlSessionFactoryBean、分页插件
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @Author wengguochao@
* @Description // 配置mybatis的SessionFactory和SessionTemplate
* @Date 2023/5/10
**/
@Configuration
@MapperScan(value = ".db1",sqlSessionFactoryRef = "sqlSessionFactoryBeanOne")
public class MybatisConfigOne {
@Resource
@Qualifier("dsOne")
DataSource dsOne;
@Resource
private MybatisPlusInterceptor mybatisPlusInterceptor;
@Bean
SqlSessionFactory sqlSessionFactoryBeanOne() throws Exception {
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
(dsOne);
(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/**/*.xml"));
// 多数据源控制台打印sql,配置任意一个数据源即可
MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
();
(mybatisConfiguration);
// 设置分页插件
(mybatisPlusInterceptor);
return ();
}
@Bean
SqlSessionTemplate sqlSessionTemplate1() throws Exception {
return new SqlSessionTemplate(sqlSessionFactoryBeanOne());
}
}
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @Author wengguochao@
* @Description // 配置mybatis的SessionFactory和SessionTemplate
* @Date 2023/5/10
**/
@Configuration
@MapperScan(value = ".db2",sqlSessionFactoryRef = "sqlSessionFactoryBeanTwo")
public class MybatisConfigTwo {
@Resource
@Qualifier("dsTwo")
DataSource dsTwo;
@Resource
private MybatisPlusInterceptor mybatisPlusInterceptor;
@Bean
SqlSessionFactory sqlSessionFactoryBeanTwo() throws Exception {
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
(dsTwo);
(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/**/*.xml"));
// 设置分页插件
(mybatisPlusInterceptor);
return ();
}
@Bean
SqlSessionTemplate sqlSessionTemplate2() throws Exception {
return new SqlSessionTemplate(sqlSessionFactoryBeanTwo());
}
}
import ;
import ;
import ;
import ;
import ;
/**
* @Author wengguochao@
* @Description // 多数据源配置时,多种配置会失效。
* 例如mybatisplus分页插件、数据库字段下换线自动转驼峰格式失效
* @Date 2023/5/10
**/
@Configuration
public class MyBatisPlusConfig {
/**
* mybatis-plus分页插件
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
(new PaginationInnerInterceptor());
return interceptor;
}
}
至此,基本配置就完成了。需要注意的是,SqlSessionFactoryBean创建的时候,指定了扫描指定的目录,这个需要自行调整即可。至于Controller、Service、Dao层,就跟平时单数据源那样使用即可,比较简单,此处不做进一步论述。