SpringBoot+MyBatis 配置多数据源

本贴最后更新于 1559 天前,其中的信息可能已经时过境迁

1、修改应用的入口

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})  
public class QuestionbanksystemApplication {  
 public static void main(String[] args) {  
 SpringApplication.run(QuestionbanksystemApplication.class, args);  
 }  
}  

  这是因为 SpringBoot 会自动根据依赖来自动配置,但是我们的数据源配置被我们自己自定义配置了,此时 SpringBoot 无法完成自动化配置,因此就会报错,所以此处我们需要排除 DataSourceAutoConfiguration 的自动配置.

2、配置数据源

这里我们配置来两个数据源 一个是 first,一个 second,修改 application.yml 文件

spring:
  datasource:
    #druid相关配置
    druid:
      first:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://aaa:3306/aaa?useUnicode=true&characterEncoding=UTF-8
        username: root
        password: xxx
      second:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://bbb:3306/bbb?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
        username: root
        password: xxx

3、完成数据源配置

这里需要完成 DataSource/SqlSessionFactory/SessionTemp 等对象的注入,需要注意的是,不管配置多少个数据源,其中的一个数据源配置的 Bean 必须使用 @Primary 完成注解.

下面是两个数据源的配置,其中 First 使用了 @Primary 注解

MapperScan 注解的 basePackages 表示了其目录下的 Mapper 使用文件使用该数据源,如 FirstDataSource 中表示 "com.questionbanksystem.dao.test1 下的 Maper 文件将使用 FirstDataSource.

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.questionbanksystem.dao.test1",sqlSessionTemplateRef ="firstSqlSessionTemplate")
public class FirstDataSourceConfig {

    //    创建数据源
    @Bean(name = "firstDS")
    //这里就是application.yml中配置的路径
    @ConfigurationProperties(prefix = "spring.datasource.druid.first")
    @Primary
    public DataSource getFirstDataSource() {
        DataSource build =  DataSourceBuilder.create()
                .driverClassName("com.mysql.jdbc.Driver")
                .url("jdbc:mysql://aaa:3306/aaa?useUnicode=true&characterEncoding=UTF-8")
                .username("root")
                .password("xxx")
                .build();
        return build;
    }


    // 创建SessionFactory
    @Bean(name = "firstSqlSessionFactory")
    @Primary
    public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDS") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean  bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
	//下面是配置mybatis驼峰命名规则自动转换
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session
                .Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        bean.setConfiguration(configuration);
        return bean.getObject();
    }

    // 创建事务管理器

    @Bean("firstTransactionManger")
    @Primary
    public DataSourceTransactionManager firstTransactionManger(@Qualifier("firstDS") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    // 创建SqlSessionTemplate

    @Bean(name = "firstSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate firstSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }


    private Class getType(String type) {
        try {
            return Class.forName(type);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

以及第二个数据源的配置

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.questionbanksystem.dao.test2",sqlSessionTemplateRef ="secondSqlSessionTemplate")
public class SecondDataSourceConfig {

    //    创建数据源
    @Bean(name = "secondDS")
    //这里就是application.yml中配置的路径
    @ConfigurationProperties(prefix = "spring.datasource.druid.second")
    public DataSource getSecondDataSource() {
        DataSource build =  DataSourceBuilder.create()
                .driverClassName("com.mysql.jdbc.Driver")
                .url("jdbc:mysql://bbb:3306/bbb?useUnicode=true&characterEncoding=UTF8&useSSL=false")
                .username("root")
                .password("xxx")
                .build();
        return build;
    }


    // 创建SessionFactory
    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDS") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean  bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
	//下面是配置mybatis驼峰命名规则自动转换
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session
                .Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        bean.setConfiguration(configuration);
        return bean.getObject();
    }

    // 创建事务管理器

    @Bean("secondTransactionManger")
    public DataSourceTransactionManager secondTransactionManger(@Qualifier("secondDS") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    // 创建SqlSessionTemplate

    @Bean(name = "secondSqlSessionTemplate")
    public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    private Class getType(String type) {
        try {
            return Class.forName(type);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

4、实现 Mapper

根据数据源配置的 MappScan 目录中的 basePackages 来创建 Mapper,注意包名,放在正确的位置上.

5、总结

其余的操作和单数据源时没有区别。重点:

  1. mapper 文件的地址,一定和数据源配置中 MappScan 目录中的 basePackages 一致。
  2. 驼峰式命名的转换。之前的配置是在 application.yml
 mybatis:
   configuration:
     map-underscore-to-camel-case: true

可是后来发现配置双数据源之后失效了,所以需要在两个数据源配置文件里重新配置。

    @Bean(name = "firstSqlSessionFactory")
    @Primary
    public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDS") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean  bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //下面是配置mybatis驼峰命名规则自动转换------
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session
                .Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        bean.setConfiguration(configuration);
	//-----------------------------------------
        return bean.getObject();
    }
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...