springboot配置多数据源有哪些步骤?

2020-04-20 16:11:18 java常见问答 8482

大家了解数据源吗?在springboot中如何配置多数据源呢?今天小编给大家带来了知识哦,通过springboot的配置,引申到mybatis以及mybatis plus插件是如何配置多数据源的?

首先是配置文件

采用的yml配置文件,其他类型配置文件同理配置了两个数据源,一个名字叫都是datasource1数据源,一个名字叫datasource2数据源。

spring: #数据源配置
datasource:
    ds1: #数据源1
driver - class - name: com.mysql.jdbc.Driver# mysql的驱动你可以配置别的关系型数据库
url: jdbc: mysql: //ip:3306/db1 #数据源地址
    username: root# 用户名
password: root# 密码
ds2: #数据源2
driver - class - name: com.mysql.jdbc.Driver# mysql的驱动你可以配置别的关系型数据库
url: jdbc: mysql: //ip:3307/db2#数据源地址
    username: root# 用户名
password: root# 密码

多数据源配置

添加一个Springboot的配置类

/**
 * 多数据源配置
 */
@Configurationpublic class DataSourceConfig
{
    //主数据源配置 ds1数据源
    @Primary
    @Bean(name = "ds1DataSourceProperties")
    @ConfigurationProperties(prefix = "spring.datasource.ds1")
    public DataSourceProperties ds1DataSourceProperties()
    {
        return new DataSourceProperties();
    }
    //主数据源 ds1数据源
    @Primary
    @Bean(name = "ds1DataSource")
    public DataSource ds1DataSource(@Qualifier("ds1DataSourceProperties") DataSourceProperties dataSourceProperties)
    {
        return dataSourceProperties.initializeDataSourceBuilder()
            .build();
    }
    //第二个ds2数据源配置
    @Bean(name = "ds2DataSourceProperties")
    @ConfigurationProperties(prefix = "spring.datasource.ds2")
    public DataSourceProperties ds2DataSourceProperties()
    {
        return new DataSourceProperties();
    }
    //第二个ds2数据源
    @Bean("ds2DataSource")
    public DataSource ds2DataSource(@Qualifier("ds2DataSourceProperties") DataSourceProperties dataSourceProperties)
    {
        return dataSourceProperties.initializeDataSourceBuilder()
            .build();
    }
}

JdbcTemplate多数据源配置

/**
 * JdbcTemplate多数据源配置
 * 依赖于数据源配置
 *
 * @see DataSourceConfig
 */
@Configurationpublic class JdbcTemplateDataSourceConfig
{
    //JdbcTemplate主数据源ds1数据源
    @Primary
    @Bean(name = "ds1JdbcTemplate")
    public JdbcTemplate ds1JdbcTemplate(@Qualifier("ds1DataSource") DataSource dataSource)
    {
        return new JdbcTemplate(dataSource);
    }
    //JdbcTemplate第二个ds2数据源
    @Bean(name = "ds2JdbcTemplate")
    public JdbcTemplate ds2JdbcTemplate(@Qualifier("ds2DataSource") DataSource dataSource)
    {
        return new JdbcTemplate(dataSource);
    }
}

添加一个Springboot配置类

mybatis 多数据源配置

增加一个SpringBoot配置类

mybatis多数据源的原理是根据不同包,调用不同的数据源,你只需要把你的mapper.java和mapper.xml写在某个package中,springboot自动帮你实现数据源切换

核心代码就这句

@MapperScan(basePackages = "com.web.ds2.**.dao", sqlSessionTemplateRef = "ds2SqlSessionTemplate")

用来指定包扫描指定sqlSessionTemplateRef

和sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/web/ds2/**/*.xml"));

用来指定mapper.xml的路径

详细配置代码如下

/**
 * Mybatis主数据源ds1配置
 * 多数据源配置依赖数据源配置
 * @see  DataSourceConfig
 */
@Configuration @MapperScan(basePackages = "com.web.ds1.**.dao", sqlSessionTemplateRef = "ds1SqlSessionTemplate") public class MybatisPlusConfig4ds1
{
    //主数据源 ds1数据源
    @Primary
    @Bean("ds1SqlSessionFactory")
    public SqlSessionFactory ds1SqlSessionFactory(@Qualifier("ds1DataSource") DataSource dataSource) throws Exception
    {
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources("classpath*:com/web/ds1/**/*.xml"));
        return sqlSessionFactory.getObject();
    }
    @Primary
    @Bean(name = "ds1TransactionManager")
    public DataSourceTransactionManager ds1TransactionManager(@Qualifier("ds1DataSource") DataSource dataSource)
    {
        return new DataSourceTransactionManager(dataSource);
    }
    @Primary
    @Bean(name = "ds1SqlSessionTemplate")
    public SqlSessionTemplate ds1SqlSessionTemplate(@Qualifier("ds1SqlSessionFactory") SqlSessionFactory sqlSessionFactory)
    {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
/**
 * Mybatis  第二个ds2数据源配置
 * 多数据源配置依赖数据源配置
 * @see  DataSourceConfig
 */
@Configuration @MapperScan(basePackages = "com.web.ds2.**.dao", sqlSessionTemplateRef = "ds2SqlSessionTemplate") public class MybatisPlusConfig4ds2
{
    //ds2数据源
    @Bean("ds2SqlSessionFactory")
    public SqlSessionFactory ds2SqlSessionFactory(@Qualifier("ds2DataSource") DataSource dataSource) throws Exception
    {
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources("classpath*:com/web/ds2/**/*.xml"));
        return sqlSessionFactory.getObject();
    } //事务支持
    @Bean(name = "ds2TransactionManager")
    public DataSourceTransactionManager ds2TransactionManager(@Qualifier("ds2DataSource") DataSource dataSource)
    {
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean(name = "ds2SqlSessionTemplate")
    public SqlSessionTemplate ds2SqlSessionTemplate(@Qualifier("ds2SqlSessionFactory") SqlSessionFactory sqlSessionFactory)
    {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

mybatis-plus 多数据源配置

mybatis-plus是mybatis的增强版,只增加,不影响。也就是说使用mybatis-plus兼容原来所有的mybatis代码和配置。

相对于mybatis的多数据源配置就是改了下 SqlSessionFactory

核心代码就是修改mybatis为mybatis-plus,如下

 @Bean("ds2SqlSessionFactory")
public SqlSessionFactory ds2SqlSessionFactory(@Qualifier("ds2DataSource") DataSource dataSource) throws Exception
{
    MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
    sqlSessionFactory.setDataSource(dataSource);
    MybatisConfiguration configuration = new MybatisConfiguration();
    configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
    configuration.setJdbcTypeForNull(JdbcType.NULL);
    sqlSessionFactory.setConfiguration(configuration);
    sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources("classpath*:com/web/ds2/**/*.xml"));
    sqlSessionFactory.setPlugins(new Interceptor[]
    {
        new PaginationInterceptor()
            , new PerformanceInterceptor() //                        .setFormat(true),
    });
    sqlSessionFactory.setGlobalConfig(new GlobalConfig()
        .setBanner(false));
    return sqlSessionFactory.getObject();
}

全部配置代码如下

/**
 * Mybatis-plus ds2数据源配置
 * 多数据源配置依赖数据源配置
 * @see  DataSourceConfig
 */
@Configuration @MapperScan(basePackages = "com.web.ds2.**.dao", sqlSessionTemplateRef = "ds2SqlSessionTemplate") public class MybatisPlusConfig4ds2
{
    //ds2数据源
    @Bean("ds2SqlSessionFactory")
    public SqlSessionFactory ds2SqlSessionFactory(@Qualifier("ds2DataSource") DataSource dataSource) throws Exception
    {
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        configuration.setJdbcTypeForNull(JdbcType.NULL);
        sqlSessionFactory.setConfiguration(configuration);
        sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources("classpath*:com/web/ds2/**/*.xml"));
        sqlSessionFactory.setPlugins(new Interceptor[]
        {
            new PaginationInterceptor()
                , new PerformanceInterceptor() //                        .setFormat(true),
        });
        sqlSessionFactory.setGlobalConfig(new GlobalConfig()
            .setBanner(false));
        return sqlSessionFactory.getObject();
    }
    @Bean(name = "ds2TransactionManager")
    public DataSourceTransactionManager ds2TransactionManager(@Qualifier("ds2DataSource") DataSource dataSource)
    {
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean(name = "ds2SqlSessionTemplate")
    public SqlSessionTemplate ds2SqlSessionTemplate(@Qualifier("ds2SqlSessionFactory") SqlSessionFactory sqlSessionFactory)
    {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
/**
 * Mybatis-plus 主数据源ds1配置
 * 多数据源配置依赖数据源配置
 * @see  DataSourceConfig
 */
@Configuration @MapperScan(basePackages = "com.web.ds1.**.dao", sqlSessionTemplateRef = "ds1SqlSessionTemplate") public class MybatisPlusConfig4ds1
{
    //主数据源 ds1数据源
    @Primary
    @Bean("ds1SqlSessionFactory")
    public SqlSessionFactory ds1SqlSessionFactory(@Qualifier("ds1DataSource") DataSource dataSource) throws Exception
    {
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        configuration.setJdbcTypeForNull(JdbcType.NULL);
        sqlSessionFactory.setConfiguration(configuration);
        sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources("classpath*:com/ds1/web/ds1/**/*.xml"));
        sqlSessionFactory.setPlugins(new Interceptor[]
        {
            new PaginationInterceptor()
                , new PerformanceInterceptor() //                        .setFormat(true),
        });
        sqlSessionFactory.setGlobalConfig(new GlobalConfig()
            .setBanner(false));
        return sqlSessionFactory.getObject();
    }
    @Primary
    @Bean(name = "ds1TransactionManager")
    public DataSourceTransactionManager ds1TransactionManager(@Qualifier("ds1DataSource") DataSource dataSource)
    {
        return new DataSourceTransactionManager(dataSource);
    }
    @Primary
    @Bean(name = "ds1SqlSessionTemplate")
    public SqlSessionTemplate ds1SqlSessionTemplate(@Qualifier("ds1SqlSessionFactory") SqlSessionFactory sqlSessionFactory)
    {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

以上就是今天所讲的java常见问答的springboot配置多数据源,想要了解更多,请继续关注本网站。