二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。
上一章简单介绍了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 多数据源配置
二.一 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
添加
查询
数据库 springboot 的 user 表里面,也只存储了这一条数据
数据库源2
添加
查询
数据库 springboot2 的 dept 表里面,也只存储了这一条数据
数据源切换配置 测试
再次查询数据库表
数据源切换配置成功.
本章节的代码放置在 github 上:
https://github.com/yuejianli/springboot/tree/develop/MultipeDataSource_Jdbc
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!