SpringBoot-应用篇-多数据源操作数据库
...大约 4 分钟
SpringBoot-应用篇-多数据源操作数据库
构建环境
- Mybatis-plus
- Druid 数据库连接池
- dynamic-datasource
数据表构建
分别向两个数据库中创建相同的数据表user(或者根据不同的情况创建不同结构的数据表),并插入数据
# 分别向数据库db_test_01、db_test_02 创建数据表
-- ----------------------------
-- User 表结构
-- ----------------------------
CREATE TABLE `user` (
`user_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`user_name` varchar(30) NOT NULL COMMENT '用户账号',
`nick_name` varchar(30) NOT NULL COMMENT '用户昵称',
`email` varchar(50) NULL DEFAULT '' COMMENT '用户邮箱',
`password` varchar(100) NULL DEFAULT '' COMMENT '密码',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
# 插入数据
-- ----------------------------
-- 数据库 db_test_01 插入记录
-- ----------------------------
INSERT INTO `user` VALUES (100, 'wangwu', '王五', 'wangwu@qq.com', '123456');
INSERT INTO `user` VALUES (101, 'zhaoliu', '赵六', 'zhaoliu@qq.com', '123456');
-- ----------------------------
-- 数据库 db_test_02 插入记录
-- ----------------------------
INSERT INTO `user` VALUES (100, 'zhangsan', '张三', 'zhangsan@qq.com', '123456');
INSERT INTO `user` VALUES (101, 'lisi', '李四', 'lisi@qq.com', '123456');
多数据源项目构建实例
1.项目构建
构建springboot项目,整合mybatis-plus、druid、dynamic-datasource相关依赖,版本参考maven官方仓库
pom.xml
<dependencies>
<!-- MySQL驱动程序 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>最新版本</version>
</dependency>
<!-- Mybatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
<!-- Dynamic Datasource -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
</dependencies>
项目配置:application.yml
spring:
#数据源配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver # MySQL连接驱动配置
druid: # druid 相关配置
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: helloworld
login-password: 123456
dynamic:
druid:
initial-size: 10 # 连接池初始大小
max-active: 100 # 连接池最大连接数
min-idle: 10 # 连接池最小空闲连接数
max-wait: 60000 # 获取连接的最大等待时间,单位为毫秒
pool-prepared-statements: true # 是否缓存PreparedStatement,默认为true
max-pool-prepared-statement-per-connection-size: 20 # 每个连接缓存Statement的最大数目
time-between-eviction-runs-millis: 60000 # 连接回收器运行的时间间隔,单位为毫秒
min-evictable-idle-time-millis: 300000 # 连接在池中最小空闲的时间,达到此值后将被移除,单位为毫秒
test-while-idle: true # 空闲连接检测是否可用,默认为true
test-on-borrow: false # 取连接时检测连接是否可用,默认为false
test-on-return: false # 还连接时检测连接是否可用,默认为false
validationQuery: "select 1" # 验证连接的SQL语句
filters: stat,wall # 连接过滤器,用于统计和防火墙功能
stat:
log-slow-sql: true # 是否打印慢SQL日志
slow-sql-millis: 1000 # 慢SQL的阈值时间,单位为毫秒
merge-sql: false # 是否合并SQL,默认为false
wall:
multi-statement-allow: true # 是否允许一次执行多条语句,默认为true
primary: test1 # 主数据源,在代码中不指定数据源时默认为该主数据源(取决于datasource的配置)
datasource:
test1: # 数据源配置 此处test1对应为db_test_01(test1可自定义名称,和对应的数据源配置关联绑定即可)
url: jdbc:mysql://localhost:3306/db_test_01
username: root
password: 123456
test2: # 数据源 (对应为db_test_02)
url: jdbc:mysql://localhost:3306/db_test_02
username: root
password: 123456
2.编写测试样例
model 层
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("user")
public class User {
@TableId("user_id")
private Integer userId;
@TableField("user_name")
private String userName;
@TableField("nick_name")
private String nickName;
@TableField("email")
private String email;
@TableField("password")
private String password;
}
mapper 层
/**
* UserMapper 定义数据库操作方法
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
service 层
public interface UserService extends IService<User> {
// 从 指定的 test1 数据源获取数据
public List<User> findAllByTest1();
// 从 指定的 test2 数据源获取数据
public List<User> findAllByTest2();
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
@Autowired
private UserMapper userMapper;
@DS("test1") // 指定数据源为test1
@Override
public List<User> findAllByTest1() {
return userMapper.selectList(null);
}
@DS("test2") // 指定数据源为test2
@Override
public List<User> findAllByTest2() {
return userMapper.selectList(null);
}
}
controller层
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
// 测试数据源1
@GetMapping("/findAllByTest1")
public String findAllByTest1() {
List<User> userList = userService.findAllByTest1();
log.info("userList:{}", JSONObject.toJSONString(userList));
return "success";
}
// 测试数据源2
@GetMapping("/findAllByTest2")
public String findAllByTest2() {
List<User> userList = userService.findAllByTest2();
log.info("userList:{}", JSONObject.toJSONString(userList));
return "success";
}
}
启动项目,查看启动日志确认动态数据源配置是否正常加载
接口测试
访问:http://localhost:8080/api/user/findAllByTest1 确认检索返回的信息
访问:http://localhost:8080/api/user/findAllByTest2 确认检索返回的信息
Powered by Waline v3.1.3