Mybatis plus Dynamic Datasource 動態(tài)數(shù)據(jù)源及使用方式
1 介紹
dynamic-datasource-spring-boot-starter 是一個(gè)基于springboot的快速集成多數(shù)據(jù)源的啟動器。它跟mybatis-plus是一個(gè)生態(tài)圈里的,很容易集成mybatis-plus。
1.1 特點(diǎn)
- 支持 數(shù)據(jù)源分組 ,適用于多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
- 支持?jǐn)?shù)據(jù)庫敏感配置信息 加密(可自定義) ENC()。
- 支持每個(gè)數(shù)據(jù)庫獨(dú)立初始化表結(jié)構(gòu)schema和數(shù)據(jù)庫database。
- 支持無數(shù)據(jù)源啟動,支持懶加載數(shù)據(jù)源(需要的時(shí)候再創(chuàng)建連接)。
- 支持 自定義注解 ,需繼承DS(3.2.0+)。
- 提供并簡化對Druid,HikariCp,BeeCp,Dbcp2的快速集成。
- 提供對Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等組件的集成方案。
- 提供 自定義數(shù)據(jù)源來源 方案(如全從數(shù)據(jù)庫加載)。
- 提供項(xiàng)目啟動后 動態(tài)增加移除數(shù)據(jù)源 方案。
- 提供Mybatis環(huán)境下的 純讀寫分離 方案。
- 提供使用 spel動態(tài)參數(shù) 解析數(shù)據(jù)源方案。內(nèi)置spel,session,header,支持自定義。
- 支持 多層數(shù)據(jù)源嵌套切換 。(ServiceA >>> ServiceB >>> ServiceC)。
- 提供 基于seata的分布式事務(wù)方案 。
- 提供 本地多數(shù)據(jù)源事務(wù)方案。
1.2 約定
- 本框架只做 切換數(shù)據(jù)源 這件核心的事情,并不限制你的具體操作,切換了數(shù)據(jù)源可以做任何CRUD。
- 配置文件所有以下劃線
_分割的數(shù)據(jù)源 首部 即為組的名稱,相同組名稱的數(shù)據(jù)源會放在一個(gè)組下。 - 切換數(shù)據(jù)源可以是組名,也可以是具體數(shù)據(jù)源名稱。組名則切換時(shí)采用負(fù)載均衡算法切換。
- 默認(rèn)的數(shù)據(jù)源名稱為 master ,你可以通過
spring.datasource.dynamic.primary修改。 - 代碼塊里主動切換>方法上的注解優(yōu)>類上注解(就近原則)。
- DS支持繼承抽象類上的DS,支持繼承接口上的DS。
2 使用方式
2.1 引入依賴
- spring-boot 1.5.x 2.x.x
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>- spring-boot3及以上
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>${version}</version>
</dependency>2.2 配置數(shù)據(jù)源
spring:
datasource:
dynamic:
enabled: true #啟用動態(tài)數(shù)據(jù)源,默認(rèn)true
primary: master #設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組,默認(rèn)值即為master
strict: false #嚴(yán)格匹配數(shù)據(jù)源,默認(rèn)false. true未匹配到指定數(shù)據(jù)源時(shí)拋異常,false使用默認(rèn)數(shù)據(jù)源
grace-destroy: false #是否優(yōu)雅關(guān)閉數(shù)據(jù)源,默認(rèn)為false,設(shè)置為true時(shí),關(guān)閉數(shù)據(jù)源時(shí)如果數(shù)據(jù)源中還存在活躍連接,至多等待10s后強(qiáng)制關(guān)閉
datasource:
master:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver # 3.2.0開始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: ENC(xxxxx) # 內(nèi)置加密,使用請查看詳細(xì)文檔
username: ENC(xxxxx)
password: ENC(xxxxx)
driver-class-name: com.mysql.jdbc.Driver
#......省略
#以上會配置一個(gè)默認(rèn)庫master,一個(gè)組slave下有兩個(gè)子庫slave_1,slave_22.2.1 多主多從
spring:
datasource:
dynamic:
datasource:
master_1:
master_2:
slave_1:
slave_2:
slave_3:2.2.2純粹多庫
spring:
datasource:
dynamic:
datasource:
mysql:
oracle:
sqlserver:
postgresql:
h2:2.2.3混合配置
spring:
datasource:
dynamic:
datasource:
master:
slave_1:
slave_2:
oracle_1:
oracle_2:2.3 使用@DS切換數(shù)據(jù)源
@DS 可以注解在方法上或類上,同時(shí)存在就近原則 方法上注解 優(yōu)先于 類上注解。
| 注解 | 結(jié)果 |
|---|---|
| 沒有@DS | 默認(rèn)數(shù)據(jù)源 |
| @DS("dsName") | dsName可以為組名也可以為具體某個(gè)庫的名稱 |
@Service
@DS("slave")
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List selectAll() {
return jdbcTemplate.queryForList("select * from user");
}
@Override
@DS("slave_1")
public List selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}2.4 使用代碼切換數(shù)據(jù)源
DynamicDataSourceContextHolder 用于動態(tài)切換數(shù)據(jù)源的上下文工具類。在使用多數(shù)據(jù)源的情況下,它可以幫助在運(yùn)行時(shí)選擇要使用的數(shù)據(jù)源。存儲當(dāng)前線程的數(shù)據(jù)源標(biāo)識:
// 切換到slave數(shù)據(jù)庫
DynamicDataSourceContextHolder.push("slave");2.5 添加新的數(shù)據(jù)源
@Resource
private DataSource dataSource;
@Resource
private DefaultDataSourceCreator dataSourceCreator;
public void add(){
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
// 配置數(shù)據(jù)源
DataSourceProperty dataSourceProperty = new DataSourceProperty();
dataSourceProperty.setLazy(true);
dataSourceProperty.setUsername("root");
dataSourceProperty.setPassword("123456");
dataSourceProperty.setUrl(url);
dataSourceProperty.setDriverClassName(driverClassName);
// 添加數(shù)據(jù)源
ds.addDataSource(key, dataSourceCreator.createDataSource(dataSourceProperty));
} 3 使用mybatis創(chuàng)建數(shù)據(jù)庫
定義mapper
@Mapper
public interface DatabaseMapper {
@Select("CREATE DATABASE IF NOT EXISTS ${databaseName}")
void createDatabase( String databaseName);
}執(zhí)行代碼:
// 配置數(shù)據(jù)源
DataSourceProperty dataSourceProperty = new DataSourceProperty();
dataSourceProperty.setLazy(true);
dataSourceProperty.setUsername(username);
dataSourceProperty.setPassword(password);
dataSourceProperty.setUrl(url);
dataSourceProperty.setDriverClassName(driverClassName);
// 創(chuàng)建sqlSessionFactory,配置mapper類
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.addMapper(DatabaseMapper.class);
sqlSessionFactoryBean.setConfiguration(configuration);
sqlSessionFactoryBean.setDataSource(dataSourceCreator.createDataSource(dataSourceProperty));
// 獲取sqlSession
SqlSession sqlSession = Objects.requireNonNull(sqlSessionFactoryBean.getObject()).openSession();
DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);
// 初始化數(shù)據(jù)庫,參數(shù)為數(shù)據(jù)庫名注意要使用 `` 包裹起來。
mapper.createDatabase("`databaseName`");4 使用SpringJDBC運(yùn)行sql腳本
使用SQL腳本中定義的外部資源進(jìn)行初始化或清理數(shù)據(jù)庫。
ResourceDatabasePopulator popular = new ResourceDatabasePopulator();
// xxx.sql 為resource目錄下文件。
popular.addScript(new ClassPathResource("xxx.sql"));
// 傳入數(shù)據(jù)源執(zhí)行sql腳本。
popular.execute(dataSource);到此這篇關(guān)于Mybatis plus Dynamic Datasource 動態(tài)數(shù)據(jù)源及使用方式的文章就介紹到這了,更多相關(guān)Mybatis plus動態(tài)數(shù)據(jù)源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud使用AOP統(tǒng)一處理Web請求日志實(shí)現(xiàn)步驟
這篇文章主要為大家介紹了SpringCloud使用AOP統(tǒng)一處理Web請求日志實(shí)現(xiàn)步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
springboot中如何實(shí)現(xiàn)kafa指定offset消費(fèi)
這篇文章主要介紹了springboot中如何實(shí)現(xiàn)kafa指定offset消費(fèi),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
最新IntelliJ IDEA 2021版配置 Tomcat 8.5 的詳細(xì)步驟
idea開發(fā)工具一直是java環(huán)境最好用,很受廣大開發(fā)者喜愛,今天通過本文給大家分享最新IntelliJ IDEA 2021版配置 Tomcat 8.5 的詳細(xì)步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-06-06
MVC頁面之間參數(shù)傳遞實(shí)現(xiàn)過程圖解
這篇文章主要介紹了MVC頁面之間參數(shù)傳遞實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
maven settings.xml文件的存放及配置(包含了配置阿里云鏡像)
本文詳細(xì)解釋了Maven中settings.xml文件的存放位置,以及用戶級別和全局級別的區(qū)別,重點(diǎn)介紹了localRepository、交互模式、離線模式、插件組、代理設(shè)置、服務(wù)器認(rèn)證、鏡像列表和激活profiles的使用方法,感興趣的可以了解一下2025-09-09
Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案
實(shí)體類中有一個(gè) List<String> 類型的屬性,對應(yīng)于 MySQL 表里的 varchar 字段,使用 MyBatis 添加或查詢時(shí)能互相轉(zhuǎn)換,本文給大家介紹Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案,需要的朋友可以參考下2024-06-06
SpringBoot中的PropertySource原理詳解
這篇文章主要介紹了SpringBoot中的PropertySource原理詳解,PropertySource?是一個(gè)非常重要的概念,它允許您在應(yīng)用程序中定義屬性,并將這些屬性注入到?Spring?環(huán)境中,需要的朋友可以參考下2023-07-07
一文詳解SpringBoot中控制器的動態(tài)注冊與卸載
在項(xiàng)目開發(fā)中,通過動態(tài)注冊和卸載控制器功能,可以根據(jù)業(yè)務(wù)場景和項(xiàng)目需要實(shí)現(xiàn)功能的動態(tài)增加、刪除,提高系統(tǒng)的靈活性和可擴(kuò)展性,下面我們就來看看SpringBoot中控制器動態(tài)注冊和卸載的詳細(xì)教程2025-07-07
Spring Cloud如何切換Ribbon負(fù)載均衡模式
這篇文章主要介紹了Spring Cloud如何切換Ribbon負(fù)載均衡模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Java報(bào)錯(cuò):java.util.concurrent.ExecutionException的解決辦法
在Java并發(fā)編程中,我們經(jīng)常使用java.util.concurrent包提供的工具來管理和協(xié)調(diào)多個(gè)線程的執(zhí)行,va并發(fā)編程中,然而,在使用這些工具時(shí),可能會遇到各種各樣的異常,其中之一就是java.util.concurrent.ExecutionException,本文將詳細(xì)分析這種異常的背景、可能的原因2024-09-09

