所谓多数据源,就是一个Java EE项目中采用了不同数据库实例中的多个库,或者同一个数据库实例中多个不同的库。比如实现数据库读写分离、分库分表、备份等操作。JdbcTemplate多数据源的配置是比较简单的,因为一个JdbcTemplate对应一个DataSource,开发者只需要手动提供多个DataSource,再手动配置JdbcTemplate即可。
1、添加依赖
具体依赖的添加请参考上一章的介绍。
2、创建两个数据库
3、在 application.properties 中配置多数据源
# 第一个数据源 first
spring.datasource.first.username=root
spring.datasource.first.password=root
spring.datasource.first.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.first.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.first.driverClassName=com.mysql.cj.jdbc.Driver
# 第二个数据源 second
spring.datasource.second.username=root
spring.datasource.second.password=root
spring.datasource.second.jdbcUrl=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.second.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.second.driverClassName=com.mysql.cj.jdbc.Driver
4、数据源配置
@Configuration
public class DatasourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.first")
public DataSource firstDataSource(){
return new HikariDataSource();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.second")
public DataSource secondDataSource(){
return new HikariDataSource();
}
}
5、配置 JdbcTemplate
(1)从前文的样例可以知道,项目只要引入了 spring-jdbc 依赖,如果开发者没有提供 JdbcTemplate 实例时,Spring Boot 默认会提供一个 JdbcTemplate 实例。
(2)如果配置多数据源时,由开发者自己提供 JdbcTemplate 实例,代码如下:
@Configuration
public class JdbcTemplateConfig {
@Bean
public JdbcTemplate firstJdbcTemplate(@Qualifier("firstDataSource")DataSource dataSource){
return new JdbcTemplate(dataSource);
}
@Bean
public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDataSource")DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
6、创建实体
public class User {
private Integer id;
private String name;
private String address;
// 省略 getter 和 setter 方法
}
public class Book {
private Integer id;
private String name;
private String author;
// 省略 getter 和 setter 方法
}
7、创建 Controller
为方便演示,这里不再添加 Dao 层和 Service 层,而是直接将两个 JdbcTemplate 注入到了 Controller 中,然后分别查询两个数据库中的数据。
@RestController
public class TowDataSourceController {
@Resource(name = "firstJdbcTemplate")
private JdbcTemplate first;
@Resource(name = "secondJdbcTemplate")
private JdbcTemplate second;
@PostMapping("/testSave")
public String test(){
first.update("insert into `book`(`name`, `author`) values(?, ?)",
"金瓶梅", "兰陵笑笑生");
second.update("insert into `user`(`name`, `address`) values(?, ?)",
"兰陵笑笑生", "清朝");
return "保存成功";
}
}