二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。

上一章简单介绍了SpringBoot整合MyBatisPlus(十四),如果没有看过,​​请观看上一章​​

工作中,在业务的发展或业务数据隔离的场景下,通常需要一个项目中引入多个数据源,

但SpringBoot默认的自动化配置是单数据源的,可以通过一些额外的配置,进行处理。

一. 多数据源配置前的工作准备

一.一 准备两个数据库 springboot 和springboot2

springboot 数据库里面存放着 user 表

springboot2 数据库表里面存放着 dept 表

-- 在 springboot 数据库里面 创建 user 表
use springboot;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(15) DEFAULT NULL,
`sex` varchar(20) DEFAULT NULL,
`age` int(6) DEFAULT NULL,
`description` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

-- 在 springboot2 数据库里面 创建 dept 表

CREATE TABLE `dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

一.二 准备对应的实体 User.java 和 Dept.java

User.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
/**
* @param id id编号
* @param name 姓名
* @param sex 性别
* @param age 年龄
* @param description 描述
*/
private Integer id;
private String name;
private String sex;
private Integer age;
private String description;
}

Dept.java

@Data
public class Dept {
/**
* @param id id编号
* @param name 部门名称
*/
private Integer id;
private String name;
}

一.三 JdbcTemplate 的使用

关于 JdbcTemplate 的使用,可以看老蝴蝶以前写的文章: ​​SpringBoot整合JdbcTemplate(五)​​

项目目录:

多数据源配置JdbcTemplate(十五)_spring boot

二. JdbcTemplate 多数据源配置

二.一 pom.xml 文件添加依赖

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

二.二 application.yml 配置多数据源

# 引入 数据库的相关配置
#spring:
# datasource:
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false
# username: root
# password: abc123

# 配置成多数据源的形式
spring:
datasource:
# 配置第一个数据库
one:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: abc123
type: com.alibaba.druid.pool.DruidDataSource
# 配置第二个数据库
two:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot2?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: abc123
type: com.alibaba.druid.pool.DruidDataSource

二.三 DataSource 和 JdbcTemplate 配置

SpringBoot 使用JdbcTemplate, 会默认创建 DataSource, JdbcTemplate

现在,这两个对象,需要我们自己手动配置。 不能让Spring 帮助我们创建了。

二.三.一 配置 DataSource

@Component
public class DataSourceConfig {
/**
* 创建 springboot 的数据库的数据源 DataSource
* @return
*/
@Bean("dataSourceOne")
@ConfigurationProperties("spring.datasource.one")
public DataSource dataSourceOne(){

return DruidDataSourceBuilder.create().build();
}
/**
* 创建 springboot2 的数据库的数据源 DataSource
* @return
*/
@Bean("dataSourceTwo")
@ConfigurationProperties("spring.datasource.two")
public DataSource dataSourceTwo(){

return DruidDataSourceBuilder.create().build();
}
}

二.三.二 配置 JdbcTemplate

@Component
public class JdbcTemplateConfig {
/**
* 创建数据库SpringBoot 对应的 JdbcTemplate.
* 用 @Qualifier 注解 指定使用的是哪一个 Datasource
* @param dataSourceOne
* @return
*/
@Bean("jdbcTemplateOne")
JdbcTemplate jdbcTemplateOne(@Qualifier("dataSourceOne") DataSource dataSourceOne){
return new JdbcTemplate(dataSourceOne);
}
/**
* 创建数据库SpringBoot2 对应的 JdbcTemplate.
* 用 @Qualifier 注解 指定使用的是哪一个 Datasource
* @param dataSourceTwo
* @return
*/
@Bean("jdbcTemplateTwo")
JdbcTemplate jdbcTemplateTwo(@Qualifier("dataSourceTwo") DataSource dataSourceTwo){
return new JdbcTemplate(dataSourceTwo);
}
}

二.四 验证 JdbcTemplate的多数据源配置

二.四.一 创建 service和对应的实现

只实现 插入 和查询全部数据的 实现,进行演示。

二.四.一.一 UserService 接口

public interface UserService {

void addUser(User user);

List<User> listUser();

void addDept(Dept dept);

List<Dept> listDept();
}

二.四.一.二 UserServiceImpl 实现类

@Service
public class UserServiceImpl implements UserService {
// 数据源1 放置到 springboot 数据库里面
@Resource
private JdbcTemplate jdbcTemplateOne;
//数据源2, 放置到 springboot2 数据库里面
@Resource
private JdbcTemplate jdbcTemplateTwo;
@Override
public void addUser(User user) {
//1.sql语句
String sql="insert into user(name,sex,age,description) values(?,?,?,?) ";
//2.调用 update语句,执行方法
jdbcTemplateOne.update(sql,user.getName(),user.getSex(),user.getAge(),
user.getDescription());
}
@Override
public List<User> listUser() {
String sql = "select id,name,sex,age,description from user ";
List<User> userList = jdbcTemplateOne.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet resultSet, int num) throws SQLException {
//根据resultSet 表示结果集, num 表示索引行
User tempUser = new User();
tempUser.setId(resultSet.getInt("id"));
tempUser.setName(resultSet.getString("name"));
tempUser.setSex(resultSet.getString("sex"));
tempUser.setAge(resultSet.getInt("age"));
tempUser.setDescription(resultSet.getString("description"));
return tempUser;
}
});
return userList;
}

@Override
public void addDept(Dept dept) {
//1.sql语句
String sql="insert into dept(name) values(?) ";
//2.调用 update语句,执行方法
jdbcTemplateTwo.update(sql,dept.getName());
}
@Override
public List<Dept> listDept() {
String sql = "select id,name from dept ";
List<Dept> deptList = jdbcTemplateTwo.query(sql, new RowMapper<Dept>() {
@Override
public Dept mapRow(ResultSet resultSet, int num) throws SQLException {
//根据resultSet 表示结果集, num 表示索引行
Dept tempDept = new Dept();
tempDept.setId(resultSet.getInt("id"));
tempDept.setName(resultSet.getString("name"));
return tempDept;
}
});
return deptList;
}
}

注意,在引入 JdbcTemplate 后,执行方法的时候,需要手动指定数据源。

这个时候,数据源的使用,对开发者是有感的。

如果在查询 listDept() 时, 指定的是 jdbcTemplateOne 时,将会报错。

开发者在编写代码时,不能将数据源模板对象 JdbcTemplate 写错。

二.四.二 测试

二.四.二.一 创建测试类

@SpringBootTest
@Log4j2
public class MultipeDataSourceApplicationTests {
@Autowired
private UserService userService;
@Test
public void addUserTest(){
//1. 构建对象
User user=new User();
user.setName("周小欢");
user.setAge(22);
user.setSex("女");
user.setDescription("一个非常可爱的女孩纸");
//2. 添加方法
userService.addUser(user);
log.info("添加员工成功");
}

@Test
public void listUserTest(){
List<User> userList=userService.listUser();
userList.forEach(n->log.info(n));
}
@Test
public void addDeptTest(){
//1. 构建对象
Dept dept=new Dept();
dept.setName("信息管理部");
//2. 添加方法
userService.addDept(dept);
log.info("添加部门成功");
}

@Test
public void listDeptTest(){
List<Dept> deptList=userService.listDept();
deptList.forEach(n->log.info(n));
}
/**
* 数据源切换配置
*/
@Test
public void allDataSourceTest(){
addUserTest();
listDeptTest();
addDeptTest();
listUserTest();
}
}

二.四.二.二 测试数据源

数据库源1

添加

多数据源配置JdbcTemplate(十五)_数据源_02

查询

多数据源配置JdbcTemplate(十五)_多数据源配置Jdbc_03

数据库 springboot 的 user 表里面,也只存储了这一条数据

多数据源配置JdbcTemplate(十五)_spring_04

数据库源2

添加

多数据源配置JdbcTemplate(十五)_数据库_05

查询

多数据源配置JdbcTemplate(十五)_spring boot_06

数据库 springboot2 的 dept 表里面,也只存储了这一条数据

多数据源配置JdbcTemplate(十五)_spring boot_07

数据源切换配置 测试

多数据源配置JdbcTemplate(十五)_spring_08

再次查询数据库表

多数据源配置JdbcTemplate(十五)_数据库_09

多数据源配置JdbcTemplate(十五)_数据库_10

数据源切换配置成功.

本章节的代码放置在 github 上:

​https://github.com/yuejianli/springboot/tree/develop/MultipeDataSource_Jdbc​

谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!