mybatisPlus多数据源方案

背景

在微服务李娜一般一个服务只有一个数据源,但是在有的老项目或者一些特定场景需要多数据源链接不同的数据库,本文以mybatisPlus为基础给出解决方案

多数据源场景分类

  • 情形一:项目启动就确定了
  • 情形一:一些sass系统里面动态确定的,比如说运行时建立的数据源,还有一些报表场景也是如此 本文暂不讨论相关

解决方案(本人都有使用过):

1.mybatisPlus官网提供的 提供框架,使用是使用注解切换 缺点很大,不建议

2.使用sharding等分库分表工具,这个是可以用来当做多数据源的解决方案的

3.分包 本文使用次方案

项目环境

springboot3.x mybatisPlus3.5.3(低于该版本会有问题,因为spring有的类被删除了会报错)

讲道理23年使用springboot3.x不应该使用mybatis的,mybatis目前还不支持native编译,但是本文属于后端项目,不适用native也无所谓

配置文件

master配置

@Configuration
@MapperScan(basePackages = "com.git.mapper.mysql", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDataSourceConfig {

    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hikari.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
        //MybatisSqlSessionFactoryBean这个要换成mybatisPlus的,不然没有一些通用sql的功能
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setGlobalConfig(masterGlobalConfig());
        sessionFactoryBean.setPlugins(masterPlusInterceptor());
        sessionFactoryBean.setVfs(SpringBootVFS.class);
        //还能设置xml扫描路径,别名配置等,本文比较野直接注解
        return sessionFactoryBean.getObject();
    }

    @Bean("masterTransactionManager")
    @Primary
    // 数据源事务管理器
    public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "masterSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean("masterGlobalConfig")
    public GlobalConfig masterGlobalConfig() {
        GlobalConfig globalConfig = new GlobalConfig();
        return globalConfig;
    }

    /**
     * 分页插件
     */
    @Bean("masterPlusInterceptor")
    public MybatisPlusInterceptor masterPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

slave配置

@Configuration
@MapperScan(basePackages = "com.git.mapper.sqlserver", sqlSessionTemplateRef = "slaveSqlSessionTemplate")
public class SlaveDataSourceConfig {
    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hikari.slave")
    public DataSource slaveDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setGlobalConfig(slaveGlobalConfig());
        sessionFactoryBean.setPlugins(slavePlusInterceptor());
        sessionFactoryBean.setVfs(SpringBootVFS.class);
        return sessionFactoryBean.getObject();
    }

    @Bean("slaveTransactionManager")
    // 数据源事务管理器
    public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "slaveSqlSessionTemplate")
    public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean("slaveGlobalConfig")
    public GlobalConfig slaveGlobalConfig() {
        GlobalConfig globalConfig = new GlobalConfig();
        return globalConfig;
    }

    /**
     * 分页插件
     */
    @Bean("slavePlusInterceptor")
    public MybatisPlusInterceptor slavePlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQL_SERVER));
        return interceptor;
    }
}

mapper包配置

使用与普通的mybatisPlus一样

在这里插入图片描述

注意事项

手动配置多数据源不会配置何解?

直接看mybatisPlus的自动配置

com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration#sqlSessionFactory

关联文章:

spring如何管理mybatis的事务

mybatis源码考究二(sqlsession线程安全和缓存失效)

本文为原创,转载请申明

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MybatisPlus 支持多数据源配置,可以通过配置多个数据源来实现对不同数据库的读写操作。下面是一个简单的多数据源配置示例: 1. 配置多个数据源 ```java @Configuration public class DataSourceConfig { @Bean(name = "dataSource1") @ConfigurationProperties(prefix = "spring.datasource.ds1") public DataSource dataSource1() { return DataSourceBuilder.create().build(); } @Bean(name = "dataSource2") @ConfigurationProperties(prefix = "spring.datasource.ds2") public DataSource dataSource2() { return DataSourceBuilder.create().build(); } } ``` 2. 配置 MybatisPlus 的数据源和事务管理器 ```java @Configuration @MapperScan(basePackages = "com.example.mapper") public class MybatisPlusConfig { @Autowired @Qualifier("dataSource1") private DataSource dataSource1; @Autowired @Qualifier("dataSource2") private DataSource dataSource2; @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dynamicDataSource()); return factoryBean.getObject(); } @Bean public DataSource dynamicDataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); Map<Object, Object> dataSourceMap = new HashMap<>(); dataSourceMap.put("dataSource1", dataSource1); dataSourceMap.put("dataSource2", dataSource2); dynamicDataSource.setTargetDataSources(dataSourceMap); dynamicDataSource.setDefaultTargetDataSource(dataSource1); return dynamicDataSource; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dynamicDataSource()); } } ``` 3. 配置数据源的路由策略 ```java public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceKey(); } } ``` 4. 在需要切换数据源的地方设置数据源的 key ```java public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public static void setDataSourceKey(String dataSourceKey) { contextHolder.set(dataSourceKey); } public static String getDataSourceKey() { return contextHolder.get(); } public static void clearDataSourceKey() { contextHolder.remove(); } } ``` 这样就可以在不同的操作中切换不同的数据源了。例如: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getAllUsersFromDataSource1() { DataSourceContextHolder.setDataSourceKey("dataSource1"); return userMapper.selectAll(); } public List<User> getAllUsersFromDataSource2() { DataSourceContextHolder.setDataSourceKey("dataSource2"); return userMapper.selectAll(); } } ``` 以上是一个简单的 MybatisPlus 多数据源配置示例,具体实现可以根据自己的业务需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值