Spring Boot + mybatic + 多数据源 自动切换

写在开篇

Spring boot 最大的特点就是简化开发(去xml配置)。故这篇所实现的也是配置些注解,并无大量的xml配置。

外甥打灯笼--照旧上代码

依赖其他依赖省去。    

<dependency>
	<groupId>com.zaxxer</groupId>
	<artifactId>HikariCP</artifactId>
</dependency>

数据源配置:多数据源配置要求必须有一个主配置,多个辅配置

/**
 * Created by echo on 2017/3/21.
 */
@Configuration
@ComponentScan(basePackageClasses = DalModule.class)
@MapperScan(basePackages = "com.livecho.dal.mapper.one", sqlSessionFactoryRef = "oneSqlSessionFactory")
public class DalModule {

    @Value("${demo-one.db-driver}")
    private String driver;

    @Value("${demo-one.db-url}")
    private String jdbcUrl;

    @Value("${demo-one.db-username}")
    private String dbUser;

    @Value("${demo-one.db-password}")
    private String dbPassword;

    @Bean(name = "oneDataSource")
    @Primary
    public DataSource dataSource() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName(driver);
        hikariConfig.setJdbcUrl(jdbcUrl);
        hikariConfig.setUsername(dbUser);
        hikariConfig.setPassword(dbPassword);
        hikariConfig.setPoolName("springHikariCP");
        hikariConfig.setAutoCommit(false);
        hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
        hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
        hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        hikariConfig.addDataSourceProperty("useServerPrepStmts", "true");

        hikariConfig.setMinimumIdle(1);
        hikariConfig.setMaximumPoolSize(20);
        hikariConfig.setConnectionInitSql("SELECT 1");

        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        return dataSource;
    }

    @Bean
    @Primary
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean("demo-one")
    @Primary
    public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
        return new TransactionTemplate(transactionManager);
    }

    @Bean(name = "oneSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("oneDataSource") DataSource oneDataSource) throws Exception {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(oneDataSource);
        sessionFactory.setFailFast(true);
        sessionFactory.setMapperLocations(resolver.getResources("classpath:/config/one/*Mapper.xml"));
        return sessionFactory.getObject();
    }

说明:

    @Configuration:自动配置。等同于spring的xml配置文件。

    @Value:注入 springBoot的application.properties配置的属性值

    @MapperScan:指定要扫描的Mapper类的包路径。

    @Primary:注解的实例 优先其他实例被注入。

副配置

@Configuration
@ComponentScan(basePackageClasses = DalModuleTwo.class)
@MapperScan(basePackages = "com.livecho.dal.mapper.two", sqlSessionFactoryRef = "twoSqlSessionFactory")
public class DalModuleTwo {

    @Value("${demo-two.db-driver}")
    private String driver;

    @Value("${demo-two.db-url}")
    private String jdbcUrl;

    @Value("${demo-two.db-username}")
    private String dbUser;

    @Value("${demo-two.db-password}")
    private String dbPassword;

    @Bean(name = "twoDataSource")
    public DataSource dataSource() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName(driver);
        hikariConfig.setJdbcUrl(jdbcUrl);
        hikariConfig.setUsername(dbUser);
        hikariConfig.setPassword(dbPassword);
        hikariConfig.setPoolName("springHikariCP");
        hikariConfig.setAutoCommit(false);
        hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
        hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
        hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        hikariConfig.addDataSourceProperty("useServerPrepStmts", "true");

        hikariConfig.setMinimumIdle(1);
        hikariConfig.setMaximumPoolSize(20);
        hikariConfig.setConnectionInitSql("SELECT 1");

        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean("demo-two")
    public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
        return new TransactionTemplate(transactionManager);
    }

    @Bean(name = "twoSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("twoDataSource") DataSource twoDataSource) throws Exception {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(twoDataSource);
        sessionFactory.setFailFast(true);
        sessionFactory.setMapperLocations(resolver.getResources("classpath:/config/two/*Mapper.xml"));
        return sessionFactory.getObject();
    }

和主配置的区别:

    1、少了@Primary这个注解

    2、sqlSessionFactory的名称区别开

    3、mapper.xml的路径 区别开

    4、mapperScan 扫描包地址 区别开

数据源配置

demo-one:
  db-driver: com.mysql.jdbc.Driver
  db-url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf8
  db-username: root
  db-password: root

demo-two:
  db-driver: com.mysql.jdbc.Driver
  db-url: jdbc:mysql://127.0.0.1:3306/demoTwo?useUnicode=true&characterEncoding=utf8
  db-username: root
  db-password: root

 

 

 

 

项目结构图:

 

总结说明:

    1、配置简单:

        a、application.properties配置多个数据源

        b、配置多个数据库连接池(必须有一主@Primary)

        c、注意不同数据库的表mapper、dao、xml对象存放不同路径

    2、不影响开发流程:

        a、不用在调用mapper处指定数据源。

        b、业务开发流程不变。controller->service->serviceImpl->repository->repositoryImpl->mapper->xml

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值