前言
最近工作需要配置多数据源,然后又想使用mybatisplus的分页插件,一开始分页插件一直不生效,查阅一些资料后解决了这个问题。写下这篇文章帮助其他有需要的人,同时做一个记录。
一、引入相关依赖
要使用mybatisplus的话需要导入mybatisplus的依赖包。
另外,3.4.3.4版本要使用分页插件的话,需要引入mybatisplus的扩展包。
xml
<!-- mybatisplus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
<scope>compile</scope>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.3.4</version>
</dependency>
二、配置多数据源
在application.yml中配置多数据源的话,就不能像单数据源一样只写一个数据库配置了。
写多个数据源配置的话,还要记得数据库连接不能使用url,应该使用jdbc-url。
然后给这个每个数据库一个命名,如以下代码所示,命名为ds1和ds2。
yaml
spring:
datasource:
ds1:
jdbc-url:
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
ds2:
jdbc-url:
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
然后,单数据库的话,springboot可以直接读取,但多数据源就需要自己写配置来读取配置信息。
java
@Configuration
@MapperScan(basePackages = "org.example.mapper.xycmall", sqlSessionFactoryRef = "sqlSessionFactory1")
public class Mybatis1Config {
@Bean(name = "ds1")
@ConfigurationProperties(prefix = "spring.datasource.ds1")
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory1")
public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("ds1") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setPlugins(mybatisPlusInterceptor);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:*/mapper/xycmall/*.xml"));
return bean.getObject();
}
}
java
@Configuration
@MapperScan(basePackages = "org.example.mapper.test", sqlSessionFactoryRef = "sqlSessionFactory2")
public class Mybatis2Config {
//首先配置数据库连接信息
@Bean(name = "ds2")
@ConfigurationProperties(prefix = "spring.datasource.ds2")
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
//然后配置数据库连接工厂,每个数据库对应一个工厂
@Bean(name = "sqlSessionFactory2")
public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("ds2") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
//因为是mybatisPlus,所以用MybatisSqlSessionFactoryBean
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
//配置插件,不然分页插件无效
bean.setPlugins(mybatisPlusInterceptor);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:*/mapper/test/*.xml"));
return bean.getObject();
}
}
java
@Configuration
public class MybatisPlusConfig {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
如上述代码一样,读取了ds1和ds2的数据库配置信息。并且,扫描的包范围也不一样,org.example.mapper.xycmall包下的mapper使用的是ds1的数据库。org.example.mapper.test使用的是ds2的数据库。
然后因为要使用mybatisplus,所以创建的SqlSessionFactory 返回的是MybatisSqlSessionFactoryBean 。
接着因为要使用分页插件,所以还需要一个MybatisPlusConfig来配置分页插件,并且每个SqlSessionFactory 都要配置分页插件,这样分页插件才会生效。