声明:多数据源就使用而言,比较简单,本文只介绍使用方式,并不作多余解释。
软硬件环境说明:SpringBoot2.0.4RELEASE、IDEA、Windows10
多数据源使用示例:
第一步:在pom.xml中引入相关依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>Abc_MultiDatabase_Demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Abc_MultiDatabase_Demo</name>
<description>SpringBoot多数据源使用测试</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<maven.test.skip>true</maven.test.skip>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- MYSQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- oracle -->
<!-- 注:druid不支持低版本的ojdbc -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>6</version>
</dependency>
<!--druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
<!-- configuration-processor -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第二步:在启动类上关闭数据源自动配置、显式开启事务支持。
第三步:创建相对应的包,将不同数据源的mapper分开存放。
第四步:在系统配置文件中配置相关数据源参数。
# 日志级别
logging.level.com=info
logging.level.com.aspire.mapper=debug
### MySQL数据源(基本配置)
spring.datasource.database-one.jdbc-url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.database-one.username=root
spring.datasource.database-one.password=dengshuai
spring.datasource.database-one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.database-one.hikari.driver-class-name=com.mysql.jdbc.Driver
### Oracle数据源(基本配置)
spring.datasource.database-two.jdbc-url=jdbc:oracle:thin:@localhost:1521:ORCL
spring.datasource.database-two.username=ds123
spring.datasource.database-two.password=ds123
spring.datasource.database-two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.database-two.hikari.driver-class-name=oracle.jdbc.driver.OracleDriver
第五步:编写多数据源配置类(注册DataSource、SqlSessionFactory、SqlSessionTemplate、DataSourceTransactionManager)。
MysqlDatabaseConfig:
package com.aspire.config.database;
import javax.sql.DataSource;
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.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.DependsOn;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
/**
* 数据源配置
* 提示:如果@Bean后面不指定id,那么默认以方法名字为id
*
* @author JustryDeng
* @date 2018年8月30日 上午7:13:33
*/
@Configuration
@MapperScan(basePackages = "com.aspire.mapper.mysqlmapper", sqlSessionTemplateRef = "mysqlSqlSessionTemplate")
public class MysqlDatabaseConfig {
@Bean
/// 根据application.properteis系统配置文件中,对应属性的前缀,指明使用其对应的数据
@ConfigurationProperties(prefix = "spring.datasource.database-one")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@DependsOn("mysqlDataSource")
public SqlSessionFactory mysqlSqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(mysqlDataSource());
return factoryBean.getObject();
}
/**
* DefaultSqlSession和SqlSessionTemplate都实现了SqlSession,但我们
* 注入线程安全的SqlSessionTemplate,而不使用默认的线程不安全的DefaultSqlSession
*/
@Bean
@DependsOn("mysqlSqlSessionFactory")
public SqlSessionTemplate mysqlSqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(mysqlSqlSessionFactory());
}
/** 事务管理器名称 */
public static final String TX_MANAGER_NAME = "mysqlTransactionManager";
/**
* 事务管理器
*/
@Bean(TX_MANAGER_NAME)
@DependsOn("mysqlDataSource")
public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
OracleDatabaseConfig:
package com.aspire.config.database;
import javax.sql.DataSource;
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.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.DependsOn;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
/**
* 数据源配置
* 提示:如果@Bean后面不指定id,那么默认以方法名字为id
*
* @author JustryDeng
* @date 2018年8月30日 上午7:13:33
*/
@Configuration
@MapperScan(basePackages = "com.aspire.mapper.oraclemapper", sqlSessionTemplateRef = "oracleSqlSessionTemplate")
public class OracleDatabaseConfig {
@Bean
/// 根据application.properties系统配置文件中,对应属性的前缀,指明使用其对应的数据
@ConfigurationProperties(prefix = "spring.datasource.database-two")
public DataSource oracleDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@DependsOn("oracleDataSource")
public SqlSessionFactory oracleSqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(oracleDataSource());
return factoryBean.getObject();
}
/**
* DefaultSqlSession和SqlSessionTemplate都实现了SqlSession,但我们
* 注入线程安全的SqlSessionTemplate,而不使用默认的线程不安全的DefaultSqlSession
*/
@Bean
@DependsOn("oracleSqlSessionFactory")
public SqlSessionTemplate oracleSqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(oracleSqlSessionFactory());
}
/** 事务管理器名称 */
public static final String TX_MANAGER_NAME = "oracleTransactionManager";
/**
* 事务管理器
*/
@Bean(TX_MANAGER_NAME)
@DependsOn("oracleDataSource")
public DataSourceTransactionManager oracleTransactionManager(@Qualifier("oracleDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
测试一下:
提示:这里只展示测试时的部分关键信息,详细的测试示例可见文末链接。
无事务查询测试:
事务回滚测试:
用于测试的service-impl:
用于测试的方法:
运行上图方法前的表:
运行上图方法后的表:
多数据源使用示例完毕!