MyBatis-Plus與Druid結(jié)合Dynamic-datasource實現(xiàn)多數(shù)據(jù)源操作數(shù)據(jù)庫的示例
MyBatis-Plus 官網(wǎng):https://baomidou.com/
MyBatis-Plus 官方文檔:https://baomidou.com/pages/24112f/
dynamic-datasource 文檔(付費):https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
創(chuàng)建數(shù)據(jù)庫
在這里我分別創(chuàng)建了兩個數(shù)據(jù)庫:
test1和test2,并分別創(chuàng)建相同結(jié)構(gòu)的數(shù)據(jù)表User,當然,你也可以根據(jù)實際情況創(chuàng)建不同結(jié)構(gòu)的數(shù)據(jù)表:-- ---------------------------- -- User 表結(jié)構(gòu) -- ---------------------------- 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;
分別向兩個數(shù)據(jù)庫中插入數(shù)據(jù):
-- ---------------------------- -- 數(shù)據(jù)庫 test1 插入記錄 -- ---------------------------- INSERT INTO `user` VALUES (100, 'wangwu', '王五', 'wangwu@qq.com', '123456'); INSERT INTO `user` VALUES (101, 'zhaoliu', '趙六', 'zhaoliu@qq.com', '123456'); -- ---------------------------- -- 數(shù)據(jù)庫 test2 插入記錄 -- ---------------------------- INSERT INTO `user` VALUES (100, 'zhangsan', '張三', 'zhangsan@qq.com', '123456'); INSERT INTO `user` VALUES (101, 'lisi', '李四', 'lisi@qq.com', '123456');
添加依賴
接下來我們需要在pom.xml文件中添加所需的依賴項。包括MyBatis-Plus、Dynamic Datasource、Druid和MySQL驅(qū)動程序的依賴:
<dependencies>
<!-- Mybatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
<!-- Dynamic Datasource -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
<!-- MySQL驅(qū)動程序 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>最新版本</version>
</dependency>
</dependencies>
注:請確保將最新版本替換為實際使用的版本號。
配置數(shù)據(jù)源
在application.yml或application.properties文件中配置數(shù)據(jù)源信息。以下是一個示例的application.yml配置:
spring:
#數(shù)據(jù)源配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
statViewServlet:
enabled: true
# 設(shè)置白名單,不填則允許所有訪問
allow:
url-pattern: /druid/*
# 控制臺管理用戶名和密碼
login-username: helloworld
login-password: 123456
dynamic:
druid:
initial-size: 10 # 連接池初始大小
max-active: 100 # 連接池最大連接數(shù)
min-idle: 10 # 連接池最小空閑連接數(shù)
max-wait: 60000 # 獲取連接的最大等待時間,單位為毫秒
pool-prepared-statements: true # 是否緩存PreparedStatement,默認為true
max-pool-prepared-statement-per-connection-size: 20 # 每個連接緩存Statement的最大數(shù)目
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 # 連接過濾器,用于統(tǒng)計和防火墻功能
stat:
log-slow-sql: true # 是否打印慢SQL日志
slow-sql-millis: 1000 # 慢SQL的閾值時間,單位為毫秒
merge-sql: false # 是否合并SQL,默認為false
wall:
multi-statement-allow: true # 是否允許一次執(zhí)行多條語句,默認為true
primary: test1 #主數(shù)據(jù)源,在代碼中不指定數(shù)據(jù)源時默認為該主數(shù)據(jù)源
datasource:
test1: #數(shù)據(jù)源 test1
url: jdbc:mysql://localhost:3306/test1
username: root
password: root
test2: #數(shù)據(jù)源 test2
url: jdbc:mysql://localhost:3306/test2
username: root
password: root
這里示例配置了兩個數(shù)據(jù)源,分別是user和admin。你可以根據(jù)實際情況進行配置。
編寫 Mapper
編寫 Mapper 接口和對應(yīng)的 XML 文件:創(chuàng)建 Mapper 接口,并使用 MyBatis-Plus 提供的注解來定義數(shù)據(jù)庫操作。例如:
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 定義數(shù)據(jù)庫操作方法
}
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<!-- 編寫SQL語句 -->
</mapper>
編寫 Service
在 UserService 接口中,定義了兩個方法:
getUsersFromTest1Db():返回一個List類型的列表,表示從test1數(shù)據(jù)庫中獲取用戶信息。getUsersFromTest2Db():返回一個List類型的列表,表示從test2數(shù)據(jù)庫中獲取用戶信息。
public interface UserService extends IService<User> {
/**
* 從test1數(shù)據(jù)庫中獲取用戶信息
*/
List<User> getUsersFromTest1Db() ;
/**
* 從test2數(shù)據(jù)庫中獲取用戶信息
*/
List<User> getUsersFromTest2Db() ;
}
編寫 UserServiceImpl 實現(xiàn)類實現(xiàn)具體的方法:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
private UserMapper userMapper;
@DS("test1") // 指定數(shù)據(jù)源為 test1
public List<User> getUsersFromTest1Db() {
return userMapper.selectList(null);
}
@DS("test2") // 指定數(shù)據(jù)源為 test2
public List<User> getUsersFromTest2Db() {
return userMapper.selectList(null);
}
}
由于我們需要分別查詢 test1 和 test2 數(shù)據(jù)庫中的 user 表,所以我們需要在查詢時切換數(shù)據(jù)源,Dynamic-datasource提供了注解的方式切換數(shù)據(jù)源,即我們在上述示例中使用的@DS注解來為每個方法指定數(shù)據(jù)源。
這樣,當調(diào)用getUsersFromTest1Db()方法時,會使用名為test1的數(shù)據(jù)源進行數(shù)據(jù)庫操作;而調(diào)用getUsersFromTest2Db()方法時,則會使用名為test2的數(shù)據(jù)源。
編寫 Controller
編寫一個控制器類 UserController,使用@RestController注解標記為控制器組件,表示它可以處理HTTP請求,并將結(jié)果直接響應(yīng)給客戶端。
在類中使用@Autowired注解將UserService依賴注入到UserController中,以便在方法中使用UserService對象。
user1List()方法使用@GetMapping注解,指定了路徑為"/test1-list",表示當客戶端發(fā)送GET請求到該路徑時,會執(zhí)行該方法。在方法體內(nèi)部,調(diào)用userService的getUsersFromTest1Db方法,以獲取用戶列表,并將結(jié)果作為List類型返回給客戶端。
userList()方法同樣使用@GetMapping注解,指定了路徑為"/test2-list",表示當客戶端發(fā)送GET請求到該路徑時,會執(zhí)行該方法。在方法體內(nèi)部,調(diào)用userService的getUsersFromTest2Db方法,以獲取用戶列表,并將結(jié)果作為List類型返回給客戶端。
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/test1-list")
public List<User> user1List() {
// 調(diào)用UserService的getUsersFromTest1Db方法獲取用戶列表并返回
return userService.getUsersFromTest1Db();
}
@GetMapping("/test2-list")
public List<User> user2List() {
// 調(diào)用UserService的getUsersFromTest2Db方法獲取用戶列表并返回
return userService.getUsersFromTest2Db();
}
}
配置 MyBatis-Plus
在項目啟動類上添加Mapper掃描注解:
@MapperScan("com.hw.mapper")
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
在配置文件中添加XML路徑:
mybatis-plus: # 指定 Mapper XML 文件所在路徑 mapper-locations: classpath*:mapper/*.xml
測試
啟動項目,查看控制臺輸出日志,可以看到已經(jīng)初始化兩個數(shù)據(jù)源,主數(shù)據(jù)源就是我們在配置文件中指定的 primary: test1:

使用 ApiFox 分別訪問兩個接口,分別返回不同數(shù)據(jù)源的數(shù)據(jù)信息:
訪問/test1-list:

訪問/test2-list:

到此這篇關(guān)于MyBatis-Plus與Druid結(jié)合Dynamic-datasource實現(xiàn)多數(shù)據(jù)源操作數(shù)據(jù)庫的示例的文章就介紹到這了,更多相關(guān)MyBatis-Plus Druid Dynamic-datasource多數(shù)據(jù)源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA中如何構(gòu)建Spring Boot的項目
這篇文章主要介紹了IntelliJ IDEA中如何構(gòu)建Spring Boot的項目問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解
Spring?Cloud?Gateway旨在為微服務(wù)架構(gòu)提供一種簡單有效的、統(tǒng)一的?API?路由管理方式。Spring?Cloud?Gateway?作為?Spring?Cloud?生態(tài)系中的網(wǎng)關(guān),它不僅提供統(tǒng)一的路由方式,并且基于?Filter?鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點和限流等2022-10-10

