MybatisPlus的IPage失效的问题解决方案
背景
之前做数据抽取的时候,搭了一个mybatis动态数据源切换的架子。方便他们写抽取的代码。今天同事问我,架子里面的mybatisplus的IPage失效了是什么问题。想了一下,应该是写动态数据源的时候,我自定义的mybatis的配置覆盖了已有的配置。于是我让他先把我写的配置进行删除,看是否正常。得到回复,删除后正常。那么到此问题原因找到,接下来的解决方法,只要在配置中增加分页器即可。
解决方案
建立一个分页器的bean配置
@Bean
publicPaginationInterceptorpaginationInterceptor(){
returnnewPaginationInterceptor();
}
我们随便自定义一个类即可,这里主要是将这个类作为一个bean交给spring容器管理。
在sqlSessionFactory中注入
@Bean(name="sessionFactory")
publicSqlSessionFactorysessionFactory(
@Qualifier("bigDataDataSource")DataSourcebigDataDataSource,
@Qualifier("branchDataSource")DataSourcebranchDataSource,
@Qualifier("basicDataSource")DataSourcebasicDataSource,
org.apache.ibatis.session.Configurationconfig)throwsException{
SqlSessionFactoryBeansessionFactoryBean=newSqlSessionFactoryBean();
//构造方法,解决动态数据源循环依赖问题。
MybatisConfigurationconfiguration=newMybatisConfiguration();
configuration.addInterceptor(newPaginationInterceptor());
sessionFactoryBean.setConfiguration(configuration);
sessionFactoryBean.setConfiguration(config);
sessionFactoryBean.setDataSource(this.DataSource(bigDataDataSource,branchDataSource,basicDataSource));
returnsessionFactoryBean.getObject();
}
文中总结
至此,我们的mybatisplus的分页插件就好使了。下面给大家提供MyBatis多数据源的解决方案。
动态数据源解决方案
数据库配置文件
我们项目使用的是yml形式的配置文件,采用的是hikari的数据库连接池。第一步我们自然是配置多个数据库源头。
我们找到spring的datasource,在下方配置三个数据源。
spring: application: name:dynamicDatasource datasource: test1: driver-class-name:com.mysql.jdbc.Driver url:jdbc:mysql://127.0.0.1:3306/test1?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false username:root password:123456 test2: driver-class-name:com.mysql.jdbc.Driver url:jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false username:root password:123456 test3: driver-class-name:com.mysql.jdbc.Driver url:jdbc:mysql://127.0.0.1:3306/test3?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false username:root password:123456 hikari: leak-detection-threshold:2000
定义数据源实体类
我们可以建立个datasourceBean文件夹专门管理数据源的实体类。
我们这里要建立三个实体类。分别对应test1,test2,test3
@Configuration
publicclassTest1DataSourceBean{
@Value("${spring.datasource.test1.driver-class-name}")
privateStringtest1Driver;
@Value("${spring.datasource.test1.url}")
privateStringtest1Url;
@Value("${spring.datasource.test1.username}")
privateStringtest1Username;
@Value("${spring.datasource.test1.password}")
privateStringtest1Password;
@Bean(name="test1DataSource")
publicDataSourcetest1DataSource()throwsException{
HikariDataSourcedataSource=newHikariDataSource();
dataSource.setDriverClassName(test1Driver);
dataSource.setJdbcUrl(test1Url);
dataSource.setUsername(test1Username);
dataSource.setPassword(test1Password);
returndataSource;
}
}
@Configuration
publicclassTest2DataSourceBean{
@Value("${spring.datasource.test2.driver-class-name}")
privateStringtest2Driver;
@Value("${spring.datasource.test2.url}")
privateStringtest2Url;
@Value("${spring.datasource.test2.username}")
privateStringtest2Username;
@Value("${spring.datasource.test2.password}")
privateStringtest2Password;
@Bean(name="test2DataSource")
publicDataSourcetest2DataSource()throwsException{
HikariDataSourcedataSource=newHikariDataSource();
dataSource.setDriverClassName(test2Driver);
dataSource.setJdbcUrl(test2Url);
dataSource.setUsername(test2Username);
dataSource.setPassword(test2Password);
returndataSource;
}
}
@Configuration
publicclassTest3DataSourceBean{
@Value("${spring.datasource.test3.driver-class-name}")
privateStringtest3Driver;
@Value("${spring.datasource.test3.url}")
privateStringtest3Url;
@Value("${spring.datasource.test3.username}")
privateStringtest3Username;
@Value("${spring.datasource.test3.password}")
privateStringtest3Password;
@Bean(name="test3DataSource")
publicDataSourcetest3DataSource()throwsException{
HikariDataSourcedataSource=newHikariDataSource();
dataSource.setDriverClassName(test3Driver);
dataSource.setJdbcUrl(test3Url);
dataSource.setUsername(test3Username);
dataSource.setPassword(test3Password);
returndataSource;
}
}
定义一个枚举类管理数据源
publicenumDatabaseType{
test1("test1","test1"),
test2("test2","test2"),
test3("test3","test3");
privateStringname;
privateStringvalue;
DatabaseType(Stringname,Stringvalue){
this.name=name;
this.value=value;
}
publicStringgetName(){
returnname;
}
publicStringgetValue(){
returnvalue;
}
}
定义一个线程安全的数据源容器
publicclassDatabaseContextHolder{
privatestaticfinalThreadLocalcontextHolder=newThreadLocal<>();
publicstaticvoidsetDatabaseType(DatabaseTypetype){
contextHolder.set(type);
}
publicstaticDatabaseTypegetDatabaseType(){
returncontextHolder.get();
}
}
定义动态数据源
publicclassDynamicDataSourceextendsAbstractRoutingDataSource{
protectedObjectdetermineCurrentLookupKey(){
returnDatabaseContextHolder.getDatabaseType();
}
}
mybatis配置类
网上的很多文章配置出来都会产生数据源循环依赖的问题,这里解决了这个问题。
@Configuration
@MapperScan(basePackages="cn.test.jichi",sqlSessionFactoryRef="sessionFactory")
publicclassMybatisConfig{
/**
*@Description:设置动态数据源
*/
@Bean(name="dynamicDataSource")
@Primary
publicDynamicDataSourceDataSource(
@Qualifier("test1DataSource")DataSourcetest1DataSource,
@Qualifier("test2DataSource")DataSourcetest2DataSource,
@Qualifier("test3DataSource")DataSourcetest3DataSource){
Map
提供一个示例
publicvoidtestDymnaicDatasource(){
//不切换数据源默认是自己的。
System.out.println("-----默认数据源");
DemoEntitytotalCount=demoMapper.getTotalCount();
StringnameCount1=totalCount.getNameCount();
StringageCount2=totalCount.getAgeCount();
System.out.println("nameCount:"+nameCount1);
System.out.println("ageCount:"+ageCount2);
//数据源切换为branch
System.out.println("-----数据源为test2");
DynamicDataSourceUtils.chooseBranchDataSource();
IntegernameCount=demoMapper.getNameCount();
IntegerageCount=demoMapper.getAgeCount();
System.out.println("nameCount:"+nameCount);
System.out.println("ageCount:"+ageCount);
//数据源为basic
System.out.println("-----数据源为test3");
DynamicDataSourceUtils.chooseBasicDataSource();
IntegerageCount1=demoMapper.getAgeCount();
System.out.println("ageCount:"+ageCount1);
}
总结
至此我们标题探讨的问题就已经解决了,同时给大家提供了动态数据源的解决方案。更多相关MybatisPlusIPage失效内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!