springBoot+MyBatis分包方式实现多数据源

将mapper以及mapper的xml形式文件,置于特定的包下,根据包扫描路径来实现数据来源的区分:

环境配置:

spring.datasource.db1.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.db1.jdbcUrl=jdbc:mysql://xxxxxx/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
spring.datasource.db1.username=root
spring.datasource.db1.password=root

spring.datasource.db2.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.db2.jdbcUrl=jdbc:mysql://xxxxxx/mybatis?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.db2.username=root
spring.datasource.db2.password=root

DataSourceConfig :

@Configuration
public class DataSourceConfig {

    @MapperScan(basePackages = "com.example.simplejobdemo.repository.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
    public static class DataSourceConfig1{

        @Primary
        @Bean("db1DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.db1")
        public DataSource dataSourceDefault() {
            return DataSourceBuilder.create()
                    .build();
        }
        @Primary
        @Bean("db1SqlSessionFactory")
        public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/*.xml"));
            return bean.getObject();
        }

        // 配置事务
        @Bean(name = "db1TransactionManager")
        public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
            DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
            dataSourceTransactionManager.setRollbackOnCommitFailure(true);
            dataSourceTransactionManager.setGlobalRollbackOnParticipationFailure(true);
            return dataSourceTransactionManager;
        }

        @Primary
        @Bean("db1SqlSessionTemplate")
        public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }

    @MapperScan(basePackages = "com.example.simplejobdemo.repository.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")
    public static class DataSourceConfig2{
        @Bean("db2DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.db2")
        public DataSource dataSourceSlave() {
            return DataSourceBuilder.create()
                    .build();
        }
        @Bean("db2SqlSessionFactory")
        public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml"));
            return bean.getObject();
        }

        @Bean(name = "db2TransactionManager")
        public DataSourceTransactionManager db2TransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {
            DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
            dataSourceTransactionManager.setRollbackOnCommitFailure(true);
            dataSourceTransactionManager.setGlobalRollbackOnParticipationFailure(true);
            return dataSourceTransactionManager;
        }

        @Bean("db2SqlSessionTemplate")
        public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
            return new SqlSessionTemplate(sqlSessionFactory);
        }

    }

}

@MapperScan(basePackages = "com.example.simplejobdemo.repository.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")

当执行的是com.example.simplejobdemo.repository.db1包下的mapper使用的就是db1数据源,

@MapperScan(basePackages = "com.example.simplejobdemo.repository.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")

当执行的是com.example.simplejobdemo.repository.db2包下的mapper使用的就是db2数据源

你可能感兴趣的:(数据库,MySQL,mybatis,spring,boot,java)