废话不多说,直接上代码,yml文件配置:
server:
port: 8080
spring:
datasource:
primary:
jdbc-url: jdbc:mysql://xxxxxxxxx:3306/xxxx?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
username:test
password: test123
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
minimum-idle: 1
maximum-pool-size: 15
auto-commit: true
idle-timeout: 18000
max-lifetime: 1800000
connection-timeout: 300000
connection-test-query: select 1
secondary:
jdbc-url: jdbc:oracle:thin:@xxxxxxx:1521/xxxx
username: test
password: test123
driver-class-name: oracle.jdbc.driver.OracleDriver
type: com.zaxxer.hikari.HikariDataSource
minimum-idle: 1
maximum-pool-size: 15
auto-commit: true
idle-timeout: 18000
max-lifetime: 1800000
connection-timeout: 300000
connection-test-query: SELECT * from dual
thirdary:
jdbc-url: jdbc:mysql://xxxxxxxxx:3306/xxxxx?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
username: test
password: test123
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
minimum-idle: 1
maximum-pool-size: 15
auto-commit: true
idle-timeout: 18000
max-lifetime: 1800000
connection-timeout: 300000
connection-test-query: select 1
#mybatis:
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:
level:
root: INFO
mysql1,主数据源配置
@Slf4j
@Configuration
@MapperScan(basePackages = MysqlDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDataSourceConfig {
static final String PACKAGE = "com.dev.api.dao.mysql";
static final String MAPPER_LOCATION = "classpath*:dao/mysql/*.xml";
@Primary
@Bean(name = "mysqlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource mysqlDataSource() {
log.info("mysql1配置成功");
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "mysqlTransactionManager")
public DataSourceTransactionManager mysqlTransactionManager() {
return new DataSourceTransactionManager((mysqlDataSource()));
}
@Primary
@Bean(name = "mysqlSqlSessionFactory")
public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDatasource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(mysqlDatasource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(MysqlDataSourceConfig.MAPPER_LOCATION)
);
return sessionFactory.getObject();
}
}
oracle,副数据源
@Slf4j
@Configuration
@MapperScan(basePackages = OracleDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class OracleDataSourceConfig {
static final String PACKAGE = "com.dev.api.dao.oracle";
static final String MAPPER_LOCATION = "classpath*:dao/oracle/*.xml";
@Bean(name = "oracleDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource oracleDataSource() {
log.info("oracle配置成功");
return DataSourceBuilder.create().build();
}
@Bean(name = "oracleTransactionManager")
public DataSourceTransactionManager oracleTransactionManager() {
return new DataSourceTransactionManager(oracleDataSource());
}
@Bean(name = "oracleSqlSessionFactory")
public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource oracleDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(oracleDataSource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(OracleDataSourceConfig.MAPPER_LOCATION)
);
return sessionFactory.getObject();
}
}
mysql,第三数据源配置
@Slf4j
@Configuration
@MapperScan(basePackages = Mysql2DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "mysql2SqlSessionFactory")
public class Mysql2DataSourceConfig {
static final String PACKAGE = "com.dev.api.dao.mysql2";
static final String MAPPER_LOCATION = "classpath*:dao/mysql2/*.xml";
@Bean(name = "mysql2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.thirdary")
public DataSource mysqlDataSource() {
log.info("mysql2配置成功");
return DataSourceBuilder.create().build();
}
@Bean(name = "mysql2TransactionManager")
public DataSourceTransactionManager mysqlTransactionManager() {
return new DataSourceTransactionManager((mysqlDataSource()));
}
@Bean(name = "mysql2SqlSessionFactory")
public SqlSessionFactory mysql2SqlSessionFactory(@Qualifier("mysql2DataSource") DataSource mysqlDatasource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(mysqlDatasource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(Mysql2DataSourceConfig.MAPPER_LOCATION)
);
return sessionFactory.getObject();
}
}
三个数据源对应三个不同的DAO包,PACKAGE路径就是Dao建立的路径,处理该数据库的DAO就放到对应的包里。对应的包里的DAO就是对应配置的数据源,数据库语句我是直接在DAO里用注解写的,比如:
@Mapper
public interface mysqlDao {
@Select("SELECT count(1) FROM user_yg")
public String test();
}
我这里没有XML文件,所以MAPPER_LOCATION的这个就是随便写就好了。调用哪个数据源就调用哪个DAO来执行,就这样。有两个mysql数据源,具体有哪些变动自己看一下,同理可以再配置第四第五个。springboot2.0以上默认的数据库连接池是hikari的,我这里配置了一下,其实可以不用写,一样会启用hikari连接池。项目是MAVEN的,根据具体的数据库版本来配置pom就行了。如果不是就在网上下载对应的jar。
另外只有主数据源有@Primary这个注解,其他没有。