Mybatis plus Dynamic Datasource 動態(tài)數(shù)據(jù)源及使用方式
1 介紹
dynamic-datasource-spring-boot-starter 是一個基于springboot的快速集成多數(shù)據(jù)源的啟動器。它跟mybatis-plus是一個生態(tài)圈里的,很容易集成mybatis-plus。
1.1 特點
- 支持 數(shù)據(jù)源分組 ,適用于多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
- 支持數(shù)據(jù)庫敏感配置信息 加密(可自定義) ENC()。
- 支持每個數(shù)據(jù)庫獨立初始化表結構schema和數(shù)據(jù)庫database。
- 支持無數(shù)據(jù)源啟動,支持懶加載數(shù)據(jù)源(需要的時候再創(chuàng)建連接)。
- 支持 自定義注解 ,需繼承DS(3.2.0+)。
- 提供并簡化對Druid,HikariCp,BeeCp,Dbcp2的快速集成。
- 提供對Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等組件的集成方案。
- 提供 自定義數(shù)據(jù)源來源 方案(如全從數(shù)據(jù)庫加載)。
- 提供項目啟動后 動態(tài)增加移除數(shù)據(jù)源 方案。
- 提供Mybatis環(huán)境下的 純讀寫分離 方案。
- 提供使用 spel動態(tài)參數(shù) 解析數(shù)據(jù)源方案。內置spel,session,header,支持自定義。
- 支持 多層數(shù)據(jù)源嵌套切換 。(ServiceA >>> ServiceB >>> ServiceC)。
- 提供 基于seata的分布式事務方案 。
- 提供 本地多數(shù)據(jù)源事務方案。
1.2 約定
- 本框架只做 切換數(shù)據(jù)源 這件核心的事情,并不限制你的具體操作,切換了數(shù)據(jù)源可以做任何CRUD。
- 配置文件所有以下劃線
_分割的數(shù)據(jù)源 首部 即為組的名稱,相同組名稱的數(shù)據(jù)源會放在一個組下。 - 切換數(shù)據(jù)源可以是組名,也可以是具體數(shù)據(jù)源名稱。組名則切換時采用負載均衡算法切換。
- 默認的數(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ù)源,默認true
primary: master #設置默認的數(shù)據(jù)源或者數(shù)據(jù)源組,默認值即為master
strict: false #嚴格匹配數(shù)據(jù)源,默認false. true未匹配到指定數(shù)據(jù)源時拋異常,false使用默認數(shù)據(jù)源
grace-destroy: false #是否優(yōu)雅關閉數(shù)據(jù)源,默認為false,設置為true時,關閉數(shù)據(jù)源時如果數(shù)據(jù)源中還存在活躍連接,至多等待10s后強制關閉
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) # 內置加密,使用請查看詳細文檔
username: ENC(xxxxx)
password: ENC(xxxxx)
driver-class-name: com.mysql.jdbc.Driver
#......省略
#以上會配置一個默認庫master,一個組slave下有兩個子庫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 可以注解在方法上或類上,同時存在就近原則 方法上注解 優(yōu)先于 類上注解。
| 注解 | 結果 |
|---|---|
| 沒有@DS | 默認數(shù)據(jù)源 |
| @DS("dsName") | dsName可以為組名也可以為具體某個庫的名稱 |
@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ù)源的情況下,它可以幫助在運行時選擇要使用的數(shù)據(jù)源。存儲當前線程的數(shù)據(jù)源標識:
// 切換到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運行sql腳本
使用SQL腳本中定義的外部資源進行初始化或清理數(shù)據(jù)庫。
ResourceDatabasePopulator popular = new ResourceDatabasePopulator();
// xxx.sql 為resource目錄下文件。
popular.addScript(new ClassPathResource("xxx.sql"));
// 傳入數(shù)據(jù)源執(zhí)行sql腳本。
popular.execute(dataSource);到此這篇關于Mybatis plus Dynamic Datasource 動態(tài)數(shù)據(jù)源及使用方式的文章就介紹到這了,更多相關Mybatis plus動態(tài)數(shù)據(jù)源內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java使用Swagger文檔報錯“java.lang.NullPointerException:null”
文章描述了一個Java項目中使用Swagger文檔時遇到的問題,每次啟動都報錯,但不影響項目運行,問題原因可能是實體類中@ApiModelProperty有相同的name值或修飾符誤寫,最終通過重寫源碼代碼進行判空處理解決了問題,此經驗僅供參考2026-05-05
JNI實現(xiàn)Java調用C/C++代碼詳細代碼示例
這篇文章主要介紹了JNI實現(xiàn)Java調用C/C++代碼的相關資料,JNI是Java/Kotlin與C/C++語言之間的交互橋梁,用于調用C/C++代碼以解決高性能問題,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-02-02
SpringSecurity中的Filter Chain(過濾器鏈)
Spring Security的Filter Chain是由一系列過濾器組成的管道,每個過濾器執(zhí)行特定的安全功能,Spring Security能夠提供強大而靈活的安全控制機制,從而保護你的應用程序不受各種網(wǎng)絡安全威脅的侵害,本文介紹SpringSecurity中的Filter Chain,感興趣的朋友跟隨小編一起看看吧2024-06-06
Spring Boot2+JPA之悲觀鎖和樂觀鎖實戰(zhàn)教程
這篇文章主要介紹了Spring Boot2+JPA之悲觀鎖和樂觀鎖實戰(zhàn)教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10

