Spring Boot整合Mybatis配置多數據源

Spring Boot 專欄:https://blog.csdn.net/dkbnull/category_9278145.html
Spring Cloud 專欄:https://blog.csdn.net/dkbnull/category_9287932.html
GitHub:https://github.com/dkbnull/SpringBootDemo
Gitee:https://gitee.com/dkbnull/SpringBootDemo

多數據源即動態數據源,隨著項目開發逐漸擴大,單個數據源、單一數據源已經無法滿足需求項目的支撐需求。

或是單一數據庫無法承載大數據量的訪問,需使用多個數據庫進行數據的讀寫分離;

或是某些特殊業務需求,需操作不同的數據庫。

在 Spring Boot整合MyBatis連接數據庫 文章中,展示了Spring Boot整合MyBatis連接數據庫的方法,基于此,Spring Boot 整合MyBatis 配置多數據源。

0 開發環境

  • JDK:1.8
  • Spring Boot:2.1.1.RELEASE
  • MySQL:5.7.13

1 引入依賴

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version><scope>runtime</scope>
</dependency><!--lombok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope>
</dependency>

2 引入數據源

server:port: 8090
spring:datasource:master:jdbc-url: jdbc:mysql://127.0.0.1:3306/test_master?characterEncoding=utf8&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverslave:jdbc-url: jdbc:mysql://127.0.0.1:3306/test_slave?characterEncoding=utf8&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
#
mybatis:mapper-locations: classpath:mapper/**/*.xmltype-aliases-package: cn.wbnull.springbootdemo.entity

該配置方式下,需要操作的兩個數據庫的Mapper需放置在不同文件夾下,如下圖所示:
在這里插入圖片描述

3 配置master庫的源連接

@Configuration
@MapperScan(basePackages = "cn.wbnull.springbootdemo.mapper.master", sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {@Primary@Bean("masterDataSource")@ConfigurationProperties(prefix = "spring.datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Primary@Bean("masterDataSourceTransactionManager")public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Primary@Bean("masterSqlSessionFactory")public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();sqlSessionFactory.setDataSource(dataSource);Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml");sqlSessionFactory.setMapperLocations(resources);return sqlSessionFactory.getObject();}
}

4 配置slave庫的源連接

@Configuration
@MapperScan(basePackages = "cn.wbnull.springbootdemo.mapper.slave", sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveDataSourceConfig {@Bean("slaveDataSource")@ConfigurationProperties(prefix = "spring.datasource.slave")public DataSource slaveDataSource() {return DataSourceBuilder.create().build();}@Bean("slaveDataSourceTransactionManager")public DataSourceTransactionManager slaveDataSourceTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean("slaveSqlSessionFactory")public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();sqlSessionFactory.setDataSource(dataSource);Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/*.xml");sqlSessionFactory.setMapperLocations(resources);return sqlSessionFactory.getObject();}
}

5 測試

5.1 新建數據庫表

CREATE SCHEMA `test_master` DEFAULT CHARACTER SET utf8mb4 ;CREATE TABLE `test_master`.`user` (`id` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(45) NOT NULL,PRIMARY KEY (`id`));INSERT INTO `test_master`.`user` (`name`) VALUES ('張三');
INSERT INTO `test_master`.`user` (`name`) VALUES ('李四');
INSERT INTO `test_master`.`user` (`name`) VALUES ('王五');
INSERT INTO `test_master`.`user` (`name`) VALUES ('周六');CREATE SCHEMA `test_slave` DEFAULT CHARACTER SET utf8mb4 ;CREATE TABLE `test_slave`.`user_info` (`id` INT NOT NULL AUTO_INCREMENT,`userCode` VARCHAR(20) NOT NULL,`userName` VARCHAR(45) NULL,`password` VARCHAR(40) NOT NULL,PRIMARY KEY (`id`));INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('1', 'zhangsan', '張三三', 'zhangsan');
INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('2', 'lisi', '李四四', 'lisi');
INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('3', 'wangwu', '王五五', 'wangwu');
INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('4', 'zhouliu', '周六六', 'zhouliu');

5.2 新建實體類

@Data
public class User {private int id;private String name;
}
@Data
public class UserInfo {private Integer id;private String userCode;private String userName;private String password;
}

5.3 新建Mapper

@Repository
public interface UserMapper {void add(@Param("user") User user);List<User> query();void update(@Param("id") int id, @Param("name") String name);void delete(@Param("id") int id);
}
@Repository
public interface UserInfoMapper {List<User> query();
}

5.4 新建映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wbnull.springbootdemo.mapper.master.UserMapper"><!-- 通用查詢映射結果 --><resultMap id="BaseResultMap" type="cn.wbnull.springbootdemo.entity.User"><id column="id" property="id"/><result column="name" property="name"/></resultMap><!-- 通用查詢結果列 --><sql id="Base_Column_List">id, name</sql><insert id="add">INSERT INTO user(<include refid="Base_Column_List"/>)VALUES(#{user.id},#{user.name})</insert><select id="query" resultMap="BaseResultMap">SELECT * FROM user</select><update id="update">UPDATE user SET name = '${name}' WHERE id = '${id}'</update><update id="delete">DELETE FROM user where id = '${id}'</update>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wbnull.springbootdemo.mapper.slave.UserInfoMapper"><!-- 通用查詢映射結果 --><resultMap id="BaseResultMap" type="cn.wbnull.springbootdemo.entity.UserInfo"><id column="id" property="id" /><result column="userCode" property="userCode" /><result column="userName" property="userName" /><result column="password" property="password" /></resultMap><!-- 通用查詢結果列 --><sql id="Base_Column_List">id, userCode, userName, password</sql><select id="query" resultMap="BaseResultMap">SELECT * FROM user_info</select>
</mapper>

5.5 新建Service

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public String add(String name) {User user = new User();user.setName(name);userMapper.add(user);return "操作成功";}public List<User> query() {return userMapper.query();}public String update(int id, String name) {userMapper.update(id, name);return "操作成功";}public String delete(int id) {userMapper.delete(id);return "操作成功";}
}
@Service
public class UserInfoService {@Autowiredprivate UserInfoMapper userInfoMapper;public List<User> query() {return userInfoMapper.query();}
}

5.6 新建Controller

@RestController
@RequestMapping("user")
public class UserController {@Autowiredpublic UserService userService;@PostMapping(value = "add")public String add(@RequestParam(value = "name") String name) {return userService.add(name);}@PostMapping(value = "query")public List<User> query() {return userService.query();}@PostMapping(value = "update")public String update(@RequestParam(value = "id") int id, @RequestParam(value = "name") String name) {return userService.update(id, name);}@PostMapping(value = "delete")public String delete(@RequestParam(value = "id") int id) {return userService.delete(id);}
}
@Controller
@RequestMapping("userInfo")
public class UserInfoController {@Autowiredpublic UserInfoService userInfoService;@PostMapping(value = "query")public List<User> query() {return userInfoService.query();}
}

5.7 測試

使用Postman測試,輸出結果如下

5.8.1 master select

在這里插入圖片描述

5.8.2 master insert

在這里插入圖片描述

數據庫中插入成功

在這里插入圖片描述

5.8.3 master update

在這里插入圖片描述

數據庫中更新成功

在這里插入圖片描述

5.8.4 master delete

在這里插入圖片描述

數據庫中刪除成功

在這里插入圖片描述

5.8.5 slave select

在這里插入圖片描述

截至這里,Spring Boot已經成功整合MyBatis多數據源,并連接上了數據庫,且測試正常。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【HTML5】瀏覽器不能顯示字體報錯Failed to decode downloaded font問題解決

把網上的項目中字體通過鏈接保存下來在本地上使用&#xff0c;在本地服務器上運行站點發現&#xff0c;用Chrome瀏覽器訪問的時候&#xff0c;出現錯誤提示不能正常顯示字體&#xff0c;怎么解決呢&#xff0c;看看怎么搞。 文章目錄 發現問題提示警告提示錯誤 字體檢查打開文件…

【C++】每周一題——2024.3.3

題目 Cpp 【問題描述】 字符環&#xff08;來源&#xff1a;NOI題庫&#xff09;。有兩個由字符構成的環&#xff0c;請寫一個程序&#xff0c;計算這兩個字符環上最長公共字符串的長度。例如&#xff0c;字符串“ABCEFAGADEGKABUVKLM”的首尾連在一起&#xff0c;構成一個環&a…

k8s常見的命令集錦

Kubernetes&#xff08;K8s&#xff09;是一個開源的容器編排系統&#xff0c;它提供了一系列的命令行工具 kubectl 來管理和操作集群中的資源。以下是一些常見的 kubectl 命令集錦&#xff1a; kubectl get&#xff1a;用于獲取集群中的資源對象信息&#xff0c;如pods、nodes…

112.路徑總和

// 定義一個名為 Solution 的類 class Solution {// 定義一個名為 hasPathSum 的公共方法&#xff0c;接收一個 TreeNode 類型的根節點 root 和一個整數 targetSum 作為參數// 方法返回一個布爾值&#xff0c;表示從根節點開始是否存在一條路徑&#xff0c;使得路徑上所有節點的…

18個驚艷的可視化大屏(第12輯):智慧校園與教育方向

智慧校園可視化大屏通過數據可視化技術&#xff0c;將學校各個方面的數據信息進行展示&#xff0c;可以提高信息公開透明度、優化校園管理、提高學生教育質量和提高校內活動宣傳效果等。 1提高信息公開透明度&#xff1a; 通過大屏幕展示校園各個方面的數據信息&#xff0c;可…

mysql 字符串的拆分之 substring_index()函數

語法 substring_index(string,delimiter,number) string &#xff1a; 要分隔的字符串。 delimiter &#xff1a; 分隔符 number &#xff1a;分隔符位置 注意 number 可以為正數&#xff0c;也可以為負數。 正數時是指的是從左向右數&#xff0c;第 number 個分隔符左…

大唐杯學習筆記:Day3

1.1 SA組網和NSA組網 SA組網(非獨立組網)是指使能5G網絡不需要其他移動通信系統的輔助,可以獨立進行工作。NSA組網(獨立組網)是指使能5G網絡需要其他移動通信系統的輔助,如果輔助缺失,那么5G網絡不可以獨立進行工作,通常而言5G網絡建設階段,NSA組網方式是在表明5G網絡的使用需…

奔跑吧,前端er!前端五大方向技能羅列,webGL、AI、桌面、游戲

經常看到頭條上前端們爭論各種框架的優劣&#xff0c;然后相互爭吵不休&#xff0c;其實技術也好&#xff0c;框架也好&#xff0c;都是服務于項目需求的&#xff0c;爭論的鐵子們都站在自己的項目角度來品評工具&#xff0c;肯定是公說公有理婆說婆有理啦。 技術和框架是中性的…

編程之美_目錄

編程之美 0&#xff09;0_0_常用函數庫 0&#xff09;0_1_測試函數總結 1&#xff09;1.1 數據結構之 數組 2&#xff09;1.2 數據結構之 字符串 3&#xff09;1.3 數據結構之 鏈表 4&#xff09;1.4 數據結構之 隊列 5&#xff09;1.5 數據結構之 棧 5&#xff09;1.6 …

【latex】\IEEEpubid版權聲明與正文內容重疊

問題描述 撰寫IEEE Trans論文時&#xff0c;出現版權聲明文字\IEEEpubid與正文內容重疊的問題&#xff1a; 原因分析&#xff1a; 在使用模板時&#xff0c;不小心將以下命令刪除了&#xff1a; \IEEEpubidadjcol 解決方案&#xff1a; 在需要換頁的位置附近添加以上命令&…

在Jupyter-lab中使用RDKit畫分子2D圖

在Jupyter-lab中使用RDKit畫分子2D圖 在做完分子對接后&#xff0c;想看看篩選后的分子的結構。因此想利用Jupyter-lab來畫分子的2D圖。 1. 安裝Jupyter-lab與RDKit 系統&#xff1a;Win11已安裝conda RDKit 是一個功能強大、靈活易用的化學信息學工具包&#xff0c;廣泛應…

w30使用python調用shell腳本

使用python腳本去實現永恒之藍漏洞攻擊 實驗環境 攻擊工具&#xff1a;pythonmsfconsole 靶場&#xff1a;win7 和 kali實驗目的 演示python腳本調用過程 實驗步驟 1.寫一個永恒之藍的攻擊腳本&#xff0c;定義為blue.rc use exploit/windows/smb/ms17_010_eternalblue …

Spark(2)-基礎tranform算子(一)

一、算子列表 編號名稱1map算子2flatMap算子3filter算子4mapPartitions算子5mapPartitionsWithIndex算子6keys算子7values算子8mapValues算子9flatMaplValues算子10union算子11reducedByKey算子12combineByKey算子13groupByKey算子14foldByKey算子15aggregateByKey算子16Shuff…

深度學習工具之tokens計算器

1.什么是Token Token是GPT處理文本的基本單位。Token可以是一個字、一個詞語或特定語言中的一個字符。它們負責將輸入的文本數據轉換為 GPT 可以處理的數據格式。每個 GPT 模型都有一個預設的最大 Tokens 數量&#xff0c;例如&#xff0c;GPT-3 每次調用允許處理的最大 Token…

韋東山嵌入式Liunx入門驅動開發五

文章目錄 一、驅動程序基石1-1 休眠與喚醒1-2 POLL機制1-3 異步通知(1) 異步通知程序解析(2) 異步通知機制內核代碼詳解 1-4 阻塞與非阻塞1-5 定時器(1) 內核函數(2) 定時器時間單位 1-6 中斷下半部 tasklet 本人學習完韋老師的視頻&#xff0c;因此來復習鞏固&#xff0c;寫以…

華為OD技術面試案例7-2024年

記錄一下我面試od的面試過程. 1、第一個是hr電話面試, 其實也就是od的hr致電, 簡單了解一下個人情況, 問我要一些個人信息, 這塊沒啥問題; 2、第二個就是機考了, 根據我提供的信息, od的hr給我發了一個機考的鏈接, 并告訴我7天內有效, 可以在考試之前先刷刷題, 刷題地址參考…

《幻獸帕魯》游戲對服務器性能的具體要求是什么?

《幻獸帕魯》游戲對服務器性能的具體要求是什么&#xff1f; CPU&#xff1a;官方最低要求為i5-3570K&#xff0c;但在多人游玩時可能會有明顯卡頓。此外&#xff0c;還有建議選擇4核或更高性能的處理器&#xff0c;以確保游戲運行流暢。 內存&#xff1a;對于不同人數的聯機&…

超越想象:人工智能的奇跡與可能性

超越想象&#xff1a;人工智能的奇跡與可能性 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;作為當今科技領域的熱門話題&#xff0c;其奇跡和可能性正在不斷被揭示和拓展&#xff0c;超越了人們的想象。從智能機器人到自動駕駛汽車&#xff0c;從語…

蘋果ios群控軟件開發常用源代碼分享!

在移動軟件開發領域&#xff0c;蘋果設備由于其封閉性和安全性受到了廣大開發者的青睞&#xff0c;然而&#xff0c;這也為開發者帶來了一些挑戰&#xff0c;特別是在進行群控軟件開發時。 群控軟件是指可以同時控制多臺設備的軟件&#xff0c;這在自動化測試、批量操作等場景…

數據要素:數字化轉型中的新“金礦”及其發展潛力

作為一名在數字化轉型項目中摸爬滾打的實踐者&#xff0c;我們見證了數據從簡單的信息處理工具逐漸演變為驅動經濟社會發展的關鍵要素。近日&#xff0c;多部門聯合發布的《“數據要素”三年行動計劃&#xff08;2024—2026年&#xff09;》更是將數據要素的重要性提升到了新的…