成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot整合Mybatis-Plus多數據源

數據庫 其他數據庫
MyBatis-Plus則是一個優秀的ORM框架,它為我們封裝了大量的數據庫操作細節,簡化了我們的開發工作,同時也提供了多數據源方案。

一、前言

隨著業務的不斷擴展和復雜度的增加,我們在開發過程中往往需要訪問多個數據庫。比如:我們可能需要同時訪問主數據庫和從數據庫,或者訪問多個獨立的數據庫來處理不同的業務邏輯。這時候,我們就需要使用多數據源來實現對多個數據庫的操作。

MyBatis-Plus則是一個優秀的ORM框架,它為我們封裝了大量的數據庫操作細節,簡化了我們的開發工作,同時也提供了多數據源方案。

  • dynamic-datasource 開源文檔付費,屬于組織參與者小鍋蓋發起的項目。
  • mybatis-mate 企業級付費授權,資料文檔免費。

今天我們以第一種方案來具體說一下怎么實現!

MyBatis-Plus多數據源官網:https://baomidou.com/pages/a61e1b/#dynamic-datasource。

二、簡單搭建測試

1、準備工作

我們先把一些使用的版本列舉一下,方便大家看!

  • Spring Boot:2.7.4
  • dynamic-datasource:3.5.1
  • mybatis-plus:3.5.1

數據庫方面這里就不演示了,我們準備好兩個mysql數據庫:

圖片

2、添加依賴

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.15</version>
</dependency>
<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>

3、yml配置

spring:
  datasource:
    #使用阿里的Druid
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    dynamic:
      primary: master #設置默認的數據源或者數據源組,默認值即為master
      strict: false #嚴格匹配數據源,默認false. true未匹配到指定數據源時拋異常,false使用默認數據源
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/test?serverTimeznotallow=Asia/Shanghai
          username: root
          password:
        slave_1:
          url: jdbc:mysql://127.0.0.1:3306/test1?serverTimeznotallow=Asia/Shanghai
          username: root
          password:

「補充:」

可以繼續多種模式,咱們以簡單的進行演示!

# 多主多從                      純粹多庫(記得設置primary)                   混合配置
spring:                               spring:                               spring:
  datasource:                           datasource:                           datasource:
    dynamic:                              dynamic:                              dynamic:
      datasource:                           datasource:                           datasource:
        master_1:                             mysql:                                master:
        master_2:                             oracle:                               slave_1:
        slave_1:                              sqlserver:                            slave_2:
        slave_2:                              postgresql:                           oracle_1:
        slave_3:                              h2:                                   oracle_2:

4、實體類

@Data
public class Test {

    @TableId
    private Integer id;
    private String name;
    private Integer age;
    private LocalDateTime time;
    private LocalDateTime createdAt;
}

5、多數據源配置Mapper

使用 @DS 切換數據源。@DS 可以注解在方法上或類上,同時存在就近原則 方法上注解 優先于 類上注解。

注解

結果

沒有@DS

默認數據源

@DS("dsName")

dsName可以為組名也可以為具體某個庫的名稱

public interface TestDbMapper extends BaseMapper<Test> {
}
@DS("slave_1")
public interface TestDb2Mapper extends BaseMapper<Test> {
}

注意:

這里@DS可以添加在service中的方法上來切換數據源,也可以像小編一樣加在Mapper接口上!

他們各有優缺點,我們需要權衡利弊進行選擇:

如果一個Service只需要使用一個數據源,或者多個Service方法都需要使用相同的數據源,則建議將@DS注解添加到Mapper接口或XML文件上;如果需要根據不同的業務場景動態切換數據源,則可以選擇在Service方法上使用@DS注解。

當然還有一種情況,一個service方法操作不同的數據源,表結構一樣的話可以使用一個mapper。

在service內部進行切換,我們看到官方注釋,「非必要不要這么使用」!

// 設置當前線程數據源 如非必要不要手動調用,調用后確保最終清除
DynamicDataSourceContextHolder.push("slave_1");
// 獲得當前線程數據源
DynamicDataSourceContextHolder.peek();
// 強制清空本地線程 防止內存泄漏,如手動調用了push可調用此方法確保清除
DynamicDataSourceContextHolder.poll();

完整代碼塊:

@Override
public Result saveTest() {
    Test test = new Test();
    test.setId(1993);
    test.setName("add方法");
    // 切換指定數據源
    DynamicDataSourceContextHolder.push("slave_1");
    testDbMapper.insert(test);
    //查看當前數據源
    log.info(DynamicDataSourceContextHolder.peek());
    //移除數據源,恢復master數據源
    DynamicDataSourceContextHolder.clear();
    testDbMapper.insert(test);
    return Result.success("222");
}

圖片

數據庫展示:

圖片

6、測試

我們還是以把@DS放在mapper類上來進行演示:

@Autowired
private TestDbMapper testDbMapper;
@Autowired
private TestDb2Mapper testDb2Mapper;
@Override
public Result saveTest() {
    Test test = new Test();
    test.setId(1994);
    test.setName("add方法");
    testDbMapper.insert(test);
    testDb2Mapper.insert(test);
    return Result.success("222");
}

圖片

數據庫正常保存到兩個庫,測試通過!

圖片


7、事務問題

在使用多數據源的同時,也帶來了一下事務問題,如果一個方法添加了@Transactional(rollbackFor = Exception.class)事務,默認查詢只會從默認庫來查詢。

這個問題是要解決的,這里小編給幾個思路大家可以試一下!

  • Spring Boot提供了一個基于Atomikos的JTA實現。
  • 可以配置多個DataSourceTransactionManager進行管理事務。

能分開系統來進行數據源的隔離,需要查詢數據可以使用feign來獲取!小編還沒在企業中使用多數據源,缺乏一下關于事務方面的分享,大家有想法或者熟悉的可以留言分享一下自己的經驗!

三、總結

希望這篇博客能夠幫助讀者更好地理解和掌握Spring Boot和MyBatis-Plus多數據源的使用方法,并應用到實際項目中去。同時,也提醒讀者在使用多數據源的時候要注意事項,比如事務管理、連接池配置等,以確保系統的穩定性和可靠性。

責任編輯:姜華 來源: 小王博客基地
相關推薦

2023-01-04 09:33:31

SpringBootMybatis

2024-10-30 10:22:17

2023-09-07 08:39:39

copy屬性數據源

2020-12-31 07:55:33

spring bootMybatis數據庫

2023-12-13 12:20:36

SpringMySQL數據源

2022-05-18 12:04:19

Mybatis數據源Spring

2025-04-14 01:00:00

Calcite電商系統MySQL

2020-06-02 07:55:31

SpringBoot多數據源

2024-12-20 16:49:15

MyBatis開發代碼

2020-03-13 14:05:14

SpringBoot+數據源Java

2020-11-24 09:56:12

數據源讀寫分離

2024-04-30 09:17:06

SpringBootMybatis動態數據源

2023-10-31 07:52:53

多數據源管理后端

2009-08-14 10:26:27

ibatis多數據源

2025-02-27 09:45:47

2022-12-19 07:21:35

Hutool-db數據庫JDBC

2025-05-26 03:20:00

SpringMyBatis數據權限

2025-01-09 11:21:25

2022-05-10 10:43:35

數據源動態切換Spring

2023-07-29 22:02:06

MyBatis數據庫配置
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人深夜福利网站 | 男女精品网站 | 一区二区伦理电影 | 精品一区二区在线观看 | 午夜精品久久久久久久久久久久久 | 精品久久久网站 | 精品在线一区 | 在线一区二区三区 | 操人视频在线观看 | 超碰天天 | 91免费在线视频 | 成人免费观看网站 | 欧美成人精品 | 99视频在线| 中文字幕视频在线观看 | 亚洲一区二区三区在线 | 亚洲国产视频一区二区 | 人人操日日干 | 中文在线一区 | 99久久久国产精品 | 亚洲一页 | 久久精品国产久精国产 | 欧美不卡网站 | 激情网站 | 玖玖色在线视频 | 国产一二三区电影 | 国产成人精品一区二区三区视频 | 一区二区三区精品视频 | 九九亚洲 | 国产成人免费视频 | 日本午夜精品 | 日本成人在线观看网站 | 欧美成人a∨高清免费观看 欧美日韩中 | 中文字幕av一区 | 九九久久99 | 久久毛片 | 亚洲成人免费视频在线观看 | 日韩欧美国产一区二区 | 亚洲一区二区网站 | 成人激情视频在线观看 | 在线日韩|