SpringBoot Mybatis Mapper自动切换不同数据源

SpringBoot Mybatis Mapper自动切换不同数据源解决方案

场景:
同一boot服务使用多个数据源的场景并不少见,解决方案也有很多。

解决方案:
例如苞米豆的动态数据源。当时需要使用注解手动切换数据源。但此次介绍的是另一种解决方案,可以根据约定包名自动切换数据源。不喜码字,直接上代码。

数据源配置一

Configuration
@MapperScan(basePackages = "com.dahuatech.user.mapper.distributor", sqlSessionFactoryRef = "DistributorSqlSessionFactory")
public class DistributorDataSourceConfig {

    @RefreshScope
    @Bean(name="distributorDataSource",destroyMethod = "close",initMethod = "init")
    @ConfigurationProperties( "spring.datasource.distributor")
    public DruidDataSource dataSource(){
        return new DruidDataSource();
    }

    @Bean(name = "DistributorSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("distributorDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/dahuatech/user/mapper/distributor/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "DistributorTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("distributorDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "DistributorSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("DistributorSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

数据源配置二

@Configuration
@MapperScan(basePackages = "com.dahuatech.user.mapper.main",sqlSessionFactoryRef = "UserDBDataSqlSessionFactory")
public class UserDataSourceConfig {


    @RefreshScope
    @Bean(name="UserDBDataSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("securityDataSource")DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/dahuatech/user/mapper/main/*.xml"));

        Interceptor interceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect","mysql");
        properties.setProperty("offsetAsPageNum","true");
        properties.setProperty("rowBoundWithCount","true");
        properties.setProperty("reasonable","false");
        properties.setProperty("supportMethodsArguments","true");
        properties.setProperty("params","pageNum=page;pageSize=size");
        interceptor.setProperties(properties);
        bean.setPlugins(new Interceptor[]{interceptor});
        return bean.getObject();
    }

    @Bean(name = "UserDBDataTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("securityDataSource")DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "UserDBDataSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("UserDBDataSqlSessionFactory")SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

目录结构组织在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Spring Boot和MyBatis Plus实现多数据的最简解决方案: 1.在pom.xml文件中添加MyBatis Plus和Druid的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> ``` 2.在application.yml文件中配置数据: ```yaml spring: datasource: master: url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave: url: jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` 3.创建数据配置类: ```java @Configuration @MapperScan(basePackages = "com.example.demo.mapper") public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean public DynamicDataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("slaveDataSource") DataSource slaveDataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceType.MASTER, masterDataSource); targetDataSources.put(DataSourceType.SLAVE, slaveDataSource); return new DynamicDataSource(masterDataSource, targetDataSources); } @Bean public SqlSessionFactory sqlSessionFactory(DynamicDataSource dynamicDataSource) throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); sqlSessionFactory.setDataSource(dynamicDataSource); sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml")); return sqlSessionFactory.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } ``` 4.创建数据类型枚举类: ```java public enum DataSourceType { MASTER, SLAVE } ``` 5.创建动态数据类: ```java public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<DataSourceType> contextHolder = new ThreadLocal<>(); public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } @Override protected Object determineCurrentLookupKey() { return contextHolder.get(); } public static void setDataSourceType(DataSourceType dataSourceType) { contextHolder.set(dataSourceType); } public static void clearDataSourceType() { contextHolder.remove(); } } ``` 6.创建数据切换注解: ```java @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface DataSource { DataSourceType value() default DataSourceType.MASTER; } ``` 7.创建数据切换切面: ```java @Aspect @Component public class DataSourceAspect { @Pointcut("@annotation(com.example.demo.annotation.DataSource)") public void dataSourcePointCut() { } @Before("dataSourcePointCut()") public void before(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); DataSource dataSource = signature.getMethod().getAnnotation(DataSource.class); if (dataSource != null) { DynamicDataSource.setDataSourceType(dataSource.value()); } } @After("dataSourcePointCut()") public void after(JoinPoint joinPoint) { DynamicDataSource.clearDataSourceType(); } } ``` 8.在Mapper接口中使用@DataSource注解指定数据: ```java @DataSource(DataSourceType.MASTER) List<User> selectAllUsers(); @DataSource(DataSourceType.SLAVE) List<User> selectAllUsersFromSlave(); ``` 9.最后,启动Spring Boot应用程序并测试多数据是否正常工作。 --相关问题--: 1. Spring Boot如何集成MyBatis Plus? 2. 如何在Spring Boot中配置

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值