背景

之前做数据抽取的时候,搭了一个mybatis动态数据源切换的架子。方便他们写抽取的代码。今天同事问我,架子里面的mybatisplus的IPage失效了是什么问题。想了一下,应该是写动态数据源的时候,我自定义的mybatis的配置覆盖了已有的配置。于是我让他先把我写的配置进行删除,看是否正常。得到回复,删除后正常。那么到此问题原因找到,接下来的解决方法,只要在配置中增加分页器即可。

解决方案

建立一个分页器的bean配置

@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}

我们随便自定义一个类即可,这里主要是将这个类作为一个bean交给spring容器管理。

在sqlSessionFactory中注入

    @Bean(name="sessionFactory")
public SqlSessionFactory sessionFactory(
@Qualifier("bigDataDataSource") DataSource bigDataDataSource,
@Qualifier("branchDataSource") DataSource branchDataSource,
@Qualifier("basicDataSource") DataSource basicDataSource,
org.apache.ibatis.session.Configuration config) throws Exception{
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
//构造方法,解决动态数据源循环依赖问题。
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.addInterceptor(new PaginationInterceptor());
sessionFactoryBean.setConfiguration(configuration);
sessionFactoryBean.setConfiguration(config);
sessionFactoryBean.setDataSource(this.DataSource(bigDataDataSource,branchDataSource, basicDataSource));
return sessionFactoryBean.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
public class Test1DataSourceBean { @Value("${spring.datasource.test1.driver-class-name}")
private String test1Driver; @Value("${spring.datasource.test1.url}")
private String test1Url; @Value("${spring.datasource.test1.username}")
private String test1Username; @Value("${spring.datasource.test1.password}")
private String test1Password; @Bean(name="test1DataSource")
public DataSource test1DataSource() throws Exception{
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(test1Driver);
dataSource.setJdbcUrl(test1Url);
dataSource.setUsername(test1Username);
dataSource.setPassword(test1Password);
return dataSource;
}
}
@Configuration
public class Test2DataSourceBean { @Value("${spring.datasource.test2.driver-class-name}")
private String test2Driver; @Value("${spring.datasource.test2.url}")
private String test2Url; @Value("${spring.datasource.test2.username}")
private String test2Username; @Value("${spring.datasource.test2.password}")
private String test2Password; @Bean(name="test2DataSource")
public DataSource test2DataSource() throws Exception{
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(test2Driver);
dataSource.setJdbcUrl(test2Url);
dataSource.setUsername(test2Username);
dataSource.setPassword(test2Password);
return dataSource;
}
}
@Configuration
public class Test3DataSourceBean { @Value("${spring.datasource.test3.driver-class-name}")
private String test3Driver; @Value("${spring.datasource.test3.url}")
private String test3Url; @Value("${spring.datasource.test3.username}")
private String test3Username; @Value("${spring.datasource.test3.password}")
private String test3Password; @Bean(name="test3DataSource")
public DataSource test3DataSource() throws Exception{
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(test3Driver);
dataSource.setJdbcUrl(test3Url);
dataSource.setUsername(test3Username);
dataSource.setPassword(test3Password);
return dataSource;
}
}

定义一个枚举类管理数据源

public enum DatabaseType {

    test1("test1", "test1"),
test2("test2", "test2"),
test3("test3","test3"); private String name;
private String value; DatabaseType(String name, String value){
this.name = name;
this.value = value;
} public String getName(){
return name;
} public String getValue(){
return value;
}
}

定义一个线程安全的数据源容器

public class DatabaseContextHolder {

    private static final ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<>();

    public static void setDatabaseType(DatabaseType type){
contextHolder.set(type);
} public static DatabaseType getDatabaseType(){
return contextHolder.get();
}
}

定义动态数据源

public class DynamicDataSource extends AbstractRoutingDataSource{

    protected Object determineCurrentLookupKey() {
return DatabaseContextHolder.getDatabaseType();
}
}

mybatis配置类

网上的很多文章配置出来都会产生数据源循环依赖的问题,这里解决了这个问题。

@Configuration
@MapperScan(basePackages="cn.test.jichi", sqlSessionFactoryRef="sessionFactory")
public class MybatisConfig { /**
* @Description:设置动态数据源
*/
@Bean(name="dynamicDataSource")
@Primary
public DynamicDataSource DataSource(
@Qualifier("test1DataSource") DataSource test1DataSource,
@Qualifier("test2DataSource") DataSource test2DataSource,
@Qualifier("test3DataSource") DataSource test3DataSource){
Map<Object, Object> targetDataSource = new HashMap<>();
targetDataSource.put(DatabaseType.test1, test1DataSource);
targetDataSource.put(DatabaseType.test2, test2DataSource);
targetDataSource.put(DatabaseType.test3, test3DataSource);
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(targetDataSource);
dataSource.setDefaultTargetDataSource(test1DataSource);
return dataSource;
} /**
* @Description:根据动态数据源创建sessionFactory
*/
@Bean(name="sessionFactory")
public SqlSessionFactory sessionFactory(
@Qualifier("test1DataSource") DataSource test1DataSource,
@Qualifier("test2DataSource") DataSource test2DataSource,
@Qualifier("test3DataSource") DataSource test3DataSource) throws Exception{
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
//构造方法,解决动态数据源循环依赖问题。
sessionFactoryBean.setDataSource(this.DataSource(test1DataSource,test2DataSource, test3DataSource));
return sessionFactoryBean.getObject();
}
}

提供一个示例

    public void testDymnaicDatasource(){
//不切换数据源默认是自己的。
System.out.println("-----默认数据源");
DemoEntity totalCount = demoMapper.getTotalCount();
String nameCount1 = totalCount.getNameCount();
String ageCount2 = totalCount.getAgeCount();
System.out.println("nameCount:"+nameCount1);
System.out.println("ageCount:"+ageCount2);
//数据源切换为branch
System.out.println("-----数据源为test2");
DynamicDataSourceUtils.chooseBranchDataSource();
Integer nameCount = demoMapper.getNameCount();
Integer ageCount = demoMapper.getAgeCount();
System.out.println("nameCount:"+nameCount);
System.out.println("ageCount:"+ageCount);
//数据源为basic
System.out.println("-----数据源为test3");
DynamicDataSourceUtils.chooseBasicDataSource();
Integer ageCount1 = demoMapper.getAgeCount();
System.out.println("ageCount:"+ageCount1); }

总结

至此我们标题探讨的问题就已经解决了,同时给大家提供了动态数据源的解决方案。

SpringBoot集成Mybatis动态多数据源后,MybatisPlus的IPage失效的问题解决方案的更多相关文章

  1. SpringBoot 集成 Mybatis 使用 Druid数据源 MySQL数据库

    思路: 1.创建项目 项目结构如下: 2.导入相应包 POM.xml文件如下: <?xml version="1.0" encoding="UTF-8"? ...

  2. SpringBoot集成Mybatis配置动态数据源

    很多人在项目里边都会用到多个数据源,下面记录一次SpringBoot集成Mybatis配置多数据源的过程. pom.xml <?xml version="1.0" encod ...

  3. SpringBoot学习笔记(三):SpringBoot集成Mybatis、SpringBoot事务管理、SpringBoot多数据源

    SpringBoot集成Mybatis 第一步我们需要在pom.xml里面引入mybatis相关的jar包 <dependency> <groupId>org.mybatis. ...

  4. SpringBoot集成MyBatis底层原理及简易实现

    MyBatis是可以说是目前最主流的Spring持久层框架了,本文主要探讨SpringBoot集成MyBatis的底层原理.完整代码可移步Github. 如何使用MyBatis 一般情况下,我们在Sp ...

  5. springboot整合mybatis的多数据源解决办法

    最近项目有一个非解决不可的问题,我们的项目中的用户表是用的自己库的数据,但是这些数据都是从一个已有库中迁过来的,所以用户信息都是在那个项目里面维护,自然而然我们项目不提供用户注册功能,这就有个问题,如 ...

  6. 0120 springboot集成Mybatis和代码生成器

    在日常开发中,数据持久技术使用的架子使用频率最高的有3个,即spring-jdbc , spring-jpa, spring-mybatis.详情可以看我之前的一篇文章spring操作数据库的3个架子 ...

  7. springboot集成mybatis(逆向工程),热部署以及整合Swagger2

    本文是作者原创,版权归作者所有.若要转载,请注明出处. springboot集成mybatis和mybatis-generator插件 1.新建Springboot项目(略) 2.导入相关依赖 < ...

  8. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  9. springboot集成mybatis(一)

    MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...

随机推荐

  1. top 9 Cloud Computing Failures

    top 9 Cloud Computing Failures Outages, hacks, bad weather, human error and other factors have led t ...

  2. Java中Map/List/Set .

    很实用,分享一下. 简单版本 复杂版本 参考: http://initbinder.com/articles/cheat-sheet-for-selecting-maplistset-in-java. ...

  3. Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf

    文章目录基本介绍BertForTokenClassificationpytorch-crf实验项目参考基本介绍命名实体识别:命名实体识别任务是NLP中的一个基础任务.主要是从一句话中识别出命名实体.比 ...

  4. 2018年NOIP普及组复赛题解

    题目涉及算法: 标题统计:字符串入门题: 龙虎斗:数学题: 摆渡车:动态规划: 对称二叉树:搜索. 标题统计 题目链接:https://www.luogu.org/problem/P5015 这道题目 ...

  5. hdu 1286 找新朋友 (容斥原理 || 欧拉函数)

    Problem - 1286 用容斥原理做的代码: #include <cstdio> #include <iostream> #include <algorithm&g ...

  6. 洛谷P1981 表达式求值 题解 栈/中缀转后缀

    题目链接:https://www.luogu.org/problem/P1981 这道题目就是一道简化的中缀转后缀,因为这里比较简单,只有加号(+)和乘号(*),所以我们只需要开一个存放数值的栈就可以 ...

  7. Laravel 中config的用法

    Laravel的config下一般存放配置信息,可以通过config('key')方法获取指定的数据. 设置值可通过「点」式语法读取,其中包含要访问的文件名以及选项名称. 现在想读取\config\a ...

  8. 2018-8-10-win10-uwp-绑定-OneWay-无法使用

    title author date CreateTime categories win10 uwp 绑定 OneWay 无法使用 lindexi 2018-08-10 19:16:50 +0800 2 ...

  9. C# 命令行如何静默调用 del 删除文件

    如果在 C# 命令行调用 del 删除文件,很多时候会提示是否需要删除,本文告诉大家如何调用命令行的时候静默删除 在C# 命令行 调用 del 删除文件的时候,会提示是否删除,通过在命令行加上 \Q ...

  10. vue-learning:34 - component - 内置组件 - 缓存组件keep-alive

    vue内置缓存组件keep-alive <keep-alive>标签内包裹的组件切换时会缓存组件实例,而不是销毁它们.避免多次加载相应的组件,减少性能消耗.并且当组件在 <keep- ...