springboot+mybatis支持多数据源


BaseDataSourceConfig.java

/**
 * 基础数据源配置
 */
public abstract class BaseDataSourceConfig {

    /**
     * 获得sqlSessionFactory
     *
     * @param datasource:      数据源
     * @param locationPattern: mapper路径
     * @return org.apache.ibatis.session.SqlSessionFactory
     **/
    public SqlSessionFactoryBean getSqlSessionFactory(DataSource datasource, String locationPattern) throws Exception {
        Configuration configuration = new Configuration();
        return new SqlSessionFactoryBean() {{
            setDataSource(datasource);
            setConfiguration(configuration);
            setMapperLocations(new PathMatchingResourcePatternResolver().getResources(locationPattern));
        }};
    }

    /**
     * @Bean 注册Bean对象
     * @Primary 表示默认数据源
     * @ConfigurationProperties 读取properties中的配置参数映射成为一个对象
     */
    public abstract HikariDataSource getDateSource();

    /**
     * @param dataSource 数据源
     * @return SqlSessionFactory
     * @Primary 默认SqlSessionFactory
     */
    public abstract SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception;

    /**
     * 初始化SqlSessionTemplate
     *
     * @param sqlSessionFactory:
     * @return org.mybatis.spring.SqlSessionTemplate
     **/
    public abstract SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory);

    /**
     * 事务管理器
     *
     * @param dataSource:  数据源
     * @return org.springframework.jdbc.datasource.DataSourceTransactionManager
     **/
    public abstract DataSourceTransactionManager transactionManager(DataSource dataSource);
}

ADataSourceConfig.java

/**
 * a数据库数据源
 */
@Configuration
@MapperScan(basePackages = "show.lmm.demo.**.mapper.a", sqlSessionFactoryRef = "aSqlSessionFactory")
public class ADataSourceConfig extends BaseDataSourceConfig {

    /**
     * @Bean 注册Bean对象
     * @Primary 表示默认数据源
     * @ConfigurationProperties 读取properties中的配置参数映射成为一个对象
     */
    @Override
    @Primary
    @Bean(name = "aDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.a")
    public HikariDataSource getDateSource() {
        return new HikariDataSource();
    }

    /**
     * @param dataSource 数据源
     * @return SqlSessionFactory
     * @Primary 默认SqlSessionFactory
     */
    @Override
    @Primary
    @Bean(name = "aSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("aDataSource") DataSource dataSource) throws Exception {
        return getSqlSessionFactory(dataSource, "classpath*:mapper/a/*.xml").getObject();
    }

    @Override
    @Primary
    @Bean("aSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("aSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    /**
     * a数据源事务管理器
     *
     * @param dataSource:  数据源
     * @return org.springframework.jdbc.datasource.DataSourceTransactionManager
     **/
    @Bean(name = TransactionManagerConstant.A_TRANSACTION_MANAGER)
    @Override
    @Primary
    public DataSourceTransactionManager transactionManager(@Qualifier("aDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

BDataSourceConfig.java

@Configuration
@MapperScan(basePackages = "show.lmm.demo.**.mapper.b",
        sqlSessionFactoryRef = "bSqlSessionFactory")
public class BDataSourceConfig extends BaseDataSourceConfig {

    /**
     * @Bean 注册Bean对象
     * @Primary 表示默认数据源
     * @ConfigurationProperties 读取properties中的配置参数映射成为一个对象
     */
    @Override
    @Bean(name = "bDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.b")
    public HikariDataSource getDateSource() {
        return new HikariDataSource();
    }

    /**
     * @param dataSource 数据源
     * @return SqlSessionFactory
     * @Primary 默认SqlSessionFactory
     */
    @Override
    @Bean(name = "bSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("bDataSource") DataSource dataSource) throws Exception {
        return getSqlSessionFactory(dataSource, "classpath*:mapper/b/*.xml").getObject();
    }

    @Override
    @Bean("bSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("bSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    /**
     * b数据源事务管理器
     *
     * @param dataSource:  数据源
     * @return org.springframework.jdbc.datasource.DataSourceTransactionManager
     **/
    @Bean(name = TransactionManagerConstant.B_TRANSACTION_MANAGER)
    @Override
    public DataSourceTransactionManager transactionManager(@Qualifier("bDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

示例

https://gitee.com/luoye/examples/tree/main/springboot-mybatis-multi-datasource


文章作者: Ming Ming Liu
文章链接: https://www.lmm.show/8/
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ming Ming Liu !
  目录