MyBatis-Plus與Druid結(jié)合Dynamic-datasource實(shí)現(xiàn)多數(shù)據(jù)源操作數(shù)據(jù)庫(kù)的示例
MyBatis-Plus 官網(wǎng):https://baomidou.com/
MyBatis-Plus 官方文檔:https://baomidou.com/pages/24112f/
dynamic-datasource 文檔(付費(fèi)):https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
創(chuàng)建數(shù)據(jù)庫(kù)
在這里我分別創(chuàng)建了兩個(gè)數(shù)據(jù)庫(kù):
test1
和test2
,并分別創(chuàng)建相同結(jié)構(gòu)的數(shù)據(jù)表User
,當(dāng)然,你也可以根據(jù)實(shí)際情況創(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 '用戶賬號(hào)', `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;
分別向兩個(gè)數(shù)據(jù)庫(kù)中插入數(shù)據(jù):
-- ---------------------------- -- 數(shù)據(jù)庫(kù) test1 插入記錄 -- ---------------------------- INSERT INTO `user` VALUES (100, 'wangwu', '王五', 'wangwu@qq.com', '123456'); INSERT INTO `user` VALUES (101, 'zhaoliu', '趙六', 'zhaoliu@qq.com', '123456'); -- ---------------------------- -- 數(shù)據(jù)庫(kù) test2 插入記錄 -- ---------------------------- INSERT INTO `user` VALUES (100, 'zhangsan', '張三', 'zhangsan@qq.com', '123456'); INSERT INTO `user` VALUES (101, 'lisi', '李四', 'lisi@qq.com', '123456');
添加依賴
接下來(lái)我們需要在pom.xml
文件中添加所需的依賴項(xiàng)。包括MyBatis-Plus、Dynamic Datasource、Druid和MySQL驅(qū)動(dòng)程序的依賴:
<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ū)動(dòng)程序 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>最新版本</version> </dependency> </dependencies>
注:請(qǐng)確保將最新版本
替換為實(shí)際使用的版本號(hào)。
配置數(shù)據(jù)源
在application.yml
或application.properties
文件中配置數(shù)據(jù)源信息。以下是一個(gè)示例的application.yml
配置:
spring: #數(shù)據(jù)源配置 datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: statViewServlet: enabled: true # 設(shè)置白名單,不填則允許所有訪問(wèn) allow: url-pattern: /druid/* # 控制臺(tái)管理用戶名和密碼 login-username: helloworld login-password: 123456 dynamic: druid: initial-size: 10 # 連接池初始大小 max-active: 100 # 連接池最大連接數(shù) min-idle: 10 # 連接池最小空閑連接數(shù) max-wait: 60000 # 獲取連接的最大等待時(shí)間,單位為毫秒 pool-prepared-statements: true # 是否緩存PreparedStatement,默認(rèn)為true max-pool-prepared-statement-per-connection-size: 20 # 每個(gè)連接緩存Statement的最大數(shù)目 time-between-eviction-runs-millis: 60000 # 連接回收器運(yùn)行的時(shí)間間隔,單位為毫秒 min-evictable-idle-time-millis: 300000 # 連接在池中最小空閑的時(shí)間,達(dá)到此值后將被移除,單位為毫秒 test-while-idle: true # 空閑連接檢測(cè)是否可用,默認(rèn)為true test-on-borrow: false # 取連接時(shí)檢測(cè)連接是否可用,默認(rèn)為false test-on-return: false # 還連接時(shí)檢測(cè)連接是否可用,默認(rèn)為false validationQuery: "select 1" # 驗(yàn)證連接的SQL語(yǔ)句 filters: stat,wall # 連接過(guò)濾器,用于統(tǒng)計(jì)和防火墻功能 stat: log-slow-sql: true # 是否打印慢SQL日志 slow-sql-millis: 1000 # 慢SQL的閾值時(shí)間,單位為毫秒 merge-sql: false # 是否合并SQL,默認(rèn)為false wall: multi-statement-allow: true # 是否允許一次執(zhí)行多條語(yǔ)句,默認(rèn)為true primary: test1 #主數(shù)據(jù)源,在代碼中不指定數(shù)據(jù)源時(shí)默認(rèn)為該主數(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
這里示例配置了兩個(gè)數(shù)據(jù)源,分別是user
和admin
。你可以根據(jù)實(shí)際情況進(jìn)行配置。
編寫(xiě) Mapper
編寫(xiě) Mapper 接口和對(duì)應(yīng)的 XML 文件:創(chuàng)建 Mapper 接口,并使用 MyBatis-Plus 提供的注解來(lái)定義數(shù)據(jù)庫(kù)操作。例如:
@Mapper public interface UserMapper extends BaseMapper<User> { // 定義數(shù)據(jù)庫(kù)操作方法 }
<!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <!-- 編寫(xiě)SQL語(yǔ)句 --> </mapper>
編寫(xiě) Service
在 UserService 接口中,定義了兩個(gè)方法:
getUsersFromTest1Db()
:返回一個(gè)List類型的列表,表示從test1數(shù)據(jù)庫(kù)中獲取用戶信息。getUsersFromTest2Db()
:返回一個(gè)List類型的列表,表示從test2數(shù)據(jù)庫(kù)中獲取用戶信息。
public interface UserService extends IService<User> { /** * 從test1數(shù)據(jù)庫(kù)中獲取用戶信息 */ List<User> getUsersFromTest1Db() ; /** * 從test2數(shù)據(jù)庫(kù)中獲取用戶信息 */ List<User> getUsersFromTest2Db() ; }
編寫(xiě) UserServiceImpl 實(shí)現(xiàn)類實(shí)現(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ù)庫(kù)中的 user 表,所以我們需要在查詢時(shí)切換數(shù)據(jù)源,Dynamic-datasource
提供了注解的方式切換數(shù)據(jù)源,即我們?cè)谏鲜鍪纠惺褂玫?code>@DS注解來(lái)為每個(gè)方法指定數(shù)據(jù)源。
這樣,當(dāng)調(diào)用getUsersFromTest1Db()
方法時(shí),會(huì)使用名為test1
的數(shù)據(jù)源進(jìn)行數(shù)據(jù)庫(kù)操作;而調(diào)用getUsersFromTest2Db()
方法時(shí),則會(huì)使用名為test2
的數(shù)據(jù)源。
編寫(xiě) Controller
編寫(xiě)一個(gè)控制器類 UserController,使用@RestController注解標(biāo)記為控制器組件,表示它可以處理HTTP請(qǐng)求,并將結(jié)果直接響應(yīng)給客戶端。
在類中使用@Autowired注解將UserService依賴注入到UserController中,以便在方法中使用UserService對(duì)象。
user1List()方法使用@GetMapping注解,指定了路徑為"/test1-list",表示當(dāng)客戶端發(fā)送GET請(qǐng)求到該路徑時(shí),會(huì)執(zhí)行該方法。在方法體內(nèi)部,調(diào)用userService的getUsersFromTest1Db方法,以獲取用戶列表,并將結(jié)果作為L(zhǎng)ist類型返回給客戶端。
userList()方法同樣使用@GetMapping注解,指定了路徑為"/test2-list",表示當(dāng)客戶端發(fā)送GET請(qǐng)求到該路徑時(shí),會(huì)執(zhí)行該方法。在方法體內(nèi)部,調(diào)用userService的getUsersFromTest2Db方法,以獲取用戶列表,并將結(jié)果作為L(zhǎng)ist類型返回給客戶端。
@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
在項(xiàng)目啟動(dòng)類上添加Mapper
掃描注解:
@MapperScan("com.hw.mapper") @SpringBootApplication public class HelloWorldApplication { public static void main(String[] args) { SpringApplication.run(HelloWorldApplication.class, args); } }
在配置文件中添加X(jué)ML路徑:
mybatis-plus: # 指定 Mapper XML 文件所在路徑 mapper-locations: classpath*:mapper/*.xml
測(cè)試
啟動(dòng)項(xiàng)目,查看控制臺(tái)輸出日志,可以看到已經(jīng)初始化兩個(gè)數(shù)據(jù)源,主數(shù)據(jù)源就是我們?cè)谂渲梦募兄付ǖ?nbsp;primary: test1
:
使用 ApiFox 分別訪問(wèn)兩個(gè)接口,分別返回不同數(shù)據(jù)源的數(shù)據(jù)信息:
訪問(wèn)/test1-list
:
訪問(wèn)/test2-list
:
到此這篇關(guān)于MyBatis-Plus與Druid結(jié)合Dynamic-datasource實(shí)現(xiàn)多數(shù)據(jù)源操作數(shù)據(jù)庫(kù)的示例的文章就介紹到這了,更多相關(guān)MyBatis-Plus Druid Dynamic-datasource多數(shù)據(jù)源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring cloud學(xué)習(xí)入門(mén)之config配置教程
這篇文章主要給大家介紹了關(guān)于spring cloud學(xué)習(xí)入門(mén)之config配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring cloud具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09SpringBoot3集成Swagger3的詳細(xì)教程
Swagger 3(OpenAPI 3.0)提供了更加強(qiáng)大和靈活的API文檔生成能力,本教程將指導(dǎo)您如何在Spring Boot 3項(xiàng)目中集成Swagger3,并使用Knife4j作為UI界面,需要的朋友可以參考下2024-03-03使用javaMail實(shí)現(xiàn)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了使用javaMail實(shí)現(xiàn)發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08IntelliJ IDEA中如何構(gòu)建Spring Boot的項(xiàng)目
這篇文章主要介紹了IntelliJ IDEA中如何構(gòu)建Spring Boot的項(xiàng)目問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java/Spring項(xiàng)目的包開(kāi)頭為什么是com詳解
這篇文章主要介紹了Java/Spring項(xiàng)目的包開(kāi)頭為什么是com的相關(guān)資料,在Java中包命名遵循域名反轉(zhuǎn)規(guī)則,即使用公司的域名反轉(zhuǎn)作為包的前綴,以確保其全球唯一性和避免命名沖突,這種規(guī)則有助于邏輯分層、代碼可讀性提升和標(biāo)識(shí)代碼來(lái)源,需要的朋友可以參考下2024-10-10Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解
這篇文章主要介紹了Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解
Spring?Cloud?Gateway旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的、統(tǒng)一的?API?路由管理方式。Spring?Cloud?Gateway?作為?Spring?Cloud?生態(tài)系中的網(wǎng)關(guān),它不僅提供統(tǒng)一的路由方式,并且基于?Filter?鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點(diǎn)和限流等2022-10-10