多数据源
使用 Spring Boot 时,默认情况下,配置 DataSource 非常容易。Spring Boot会自动为我们配置好一个 DataSource。
如果在 application.yml 中指定了 spring.datasource 的相关配置,Spring Boot 就会使用该配置创建一个DataSource。如果在 application.yml 中没有指定任何 spring.datasource 的相关配置,Spring Boot 会在 classpath 中搜索 H2、hsqldb 等内存数据库的jar包,如果找到了,就会自动配置一个内存数据库的 DataSource,所以,我们只要引入jar包即可。例如,配置一个 hsqldb 数据源:
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
但是,在某些情况下,如果我们需要配置多个数据源,应该如何在 Spring Boot 中配置呢?
application.yml 配置
spring: application: name: data-multidatasource db1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/spring-boot-jpa username: root password: root db2: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/spring-boot-jpa username: root password: root
分别定义指定的数据源配置,不同类型数据库的配置初始化不一致,下面是 mybatis-plus 的 mysql 工厂注册。这样所有这个 com.mapper.db1 包下面的都会使用这个数据源。
//表示这个类为一个配置类 @Configuration // 配置mybatis的接口类放的地方 @MapperScan(basePackages = "com.mapper.db1", sqlSessionFactoryRef = "test1SqlSessionFactory") public class DataSourceConfig { @Bean(name = "test1DataSource") // 表示这个数据源是默认数据源 @Primary // 读取application.properties中的配置参数映射成为一个对象, prefix表示参数的前缀 @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource getDateSource1() { return DataSourceBuilder.create().build(); } @Bean(name = "test1SqlSessionFactory") // 表示这个数据源是默认数据源 @Primary // @Qualifier表示查找Spring容器中名字为test1DataSource的对象 public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource datasource) throws Exception { //使用mybatisplus不能使用原生SqlSessionFactoryBean,否则会抛出Invalid bound statement (not found) MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); sqlSessionFactory.setDataSource(getDateSource1()); sqlSessionFactory.setPlugins(new Interceptor[]{new PaginationInterceptor()}); sqlSessionFactory.setMapperLocations( new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/test01/*.xml")); MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setJdbcTypeForNull(JdbcType.NULL); configuration.setMapUnderscoreToCamelCase(true); configuration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class); configuration.setCacheEnabled(false); sqlSessionFactory.setConfiguration(configuration); return sqlSessionFactory.getObject(); } @Bean("test1SqlSessionTemplate") // 表示这个数据源是默认数据源 @Primary public SqlSessionTemplate test1sqlsessiontemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sessionfactory) { return new SqlSessionTemplate(sessionfactory); } }
动态数据源
// todo