015 Spring Boot配置MyBatis多数据源

可能一个项目需要连接多个数据库,就代表有多个数据源,在项目中多数据源通过分包或注解来划分,这里用分包的方式配置

多数据源理论上是可以引入无数多个的,但是限制于硬件的条件不可能做到引入无限多个数据源。

在编写多数据源的配置文件时,就不能按照默认的方式编写数据库配置了,如下所示,标红的部分是绝对不能改的,而黑色的前缀部分爱咋写咋写。注意在编写url的时候和单数据源不一样,单数据源是url,多数据源是jdbc-url

spring.datasource.database1.jdbc-url=jdbc:mysql://127.0.0.1:3306/jwt
spring.datasource.database1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.database1.username=root
spring.datasource.database1.password=root
spring.datasource.database1.moonlight.poolMaximumActiveConnections=400
spring.datasource.database1.moonlight.poolMaximumIdleConnections=200
spring.datasource.database1.moonlight.poolMaximumCheckoutTime=20000

在application.properties配置文件里添加两个数据源的配置内容:

###数据源1,连接jwt数据库
spring.datasource.database1.url=jdbc:mysql://127.0.0.1:3306/jwt?useUnicode=true&characterEncoding=utf-8
spring.datasource.database1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.database1.username=root
spring.datasource.database1.password=root
spring.datasource.database1.moonlight.poolMaximumActiveConnections=400
spring.datasource.database1.moonlight.poolMaximumIdleConnections=200
spring.datasource.database1.moonlight.poolMaximumCheckoutTime=20000
###数据源2,连接test数据库
spring.datasource.database2.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.database2.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.database2.username=root
spring.datasource.database2.password=root
spring.datasource.database2.moonlight.poolMaximumActiveConnections=400
spring.datasource.database2.moonlight.poolMaximumIdleConnections=200
spring.datasource.database2.moonlight.poolMaximumCheckoutTime=20000

创建读取database1数据源的类,database2数据源同理,无非是把下列代码的database1改为database2(idea替换的快捷键:Ctrl+R),注意用多数据源就不要在Spring Boot的启动类上用@MapperScan注解扫mapper了。

/**
 * 读取数据源1的配置文件,连接jwt数据库,用@MapperScan指定扫包范围和sqlSessionFactory对象的名称
 */
@Configuration
@MapperScan(basePackages = "com.blacktv.springboot.database.database1", sqlSessionFactoryRef = "database1SqlSessionFactory")
public class DataSourceConfig1 {

    /**
     * 本方法会返回一个名字为database1DataSource的bean到Spring IoC
     * 读取在application.properties里配置的以application.properties为前缀的数据源
     *
     * @return
     */
    @Bean(name = "database1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.database1")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 获取database1的会话工厂,返回一个名为database1SqlSessionFactory的bean到Spring IoC
     *
     * @param dataSource
     * @return
     */
    @Bean(name = "database1SqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("database1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        /**
         * 如果需要扫描mapper.xml文件解开下列代码的注释,填写正确的mapper.xml文件的目录
         * sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/database1/*.xml"));
         */
        return sqlSessionFactoryBean.getObject();
    }

    /**
     * database1的事务管理,会返回一个名为database1TransactionManager的bean到Spring IoC
     *
     * @param dataSource
     * @return
     */
    @Bean(name = "database1TransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("database1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * SqlSessionTemplate 是 MyBatis-Spring 的核心。 这个类负责管理 MyBatis 的 SqlSession,
     * 调用 MyBatis 的 SQL 方法, 翻译异常。 SqlSessionTemplate 是线程安全的。
     * 会返回一个名为database1SqlSessionTemplate的bean到Spring IoC
     * @param sqlSessionFactory
     * @return
     */
    @Bean(name = "database1SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("database1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

创建完数据源后,在数据源指定的包下进行对该数据源增删改查就完事了。

如果启动项目时出现这样的异常(Spring Boot2不会出现,1会出现 ):

more than one 'primary' bean found among candidates: [database1DataSource, database2DataSource]

这说明Spring Boot找不到默认数据源,随便选一个数据源添加@Primary注解就好

由此看出多数据源配置成功,然后测试一下多数据源的事务,先来看数据源1

数据源1和2的事务都成功回滚了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值