国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

mybatisplus快速實(shí)現(xiàn)動態(tài)數(shù)據(jù)源切換

這篇具有很好參考價(jià)值的文章主要介紹了mybatisplus快速實(shí)現(xiàn)動態(tài)數(shù)據(jù)源切換。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.背景
?

  通常一個(gè)系統(tǒng)只需要連接一個(gè)數(shù)據(jù)庫就可以了。但是在企業(yè)應(yīng)用的開發(fā)中往往會和其他子系統(tǒng)交互,特別是對于一些數(shù)據(jù)實(shí)時(shí)性要求比較高的數(shù)據(jù),我們就需要做實(shí)時(shí)連接查詢,而不是做同步。這個(gè)時(shí)候就需要用到多數(shù)據(jù)源。
?

  舉個(gè)簡單的例子某企業(yè)要做訂單網(wǎng)上訂單系統(tǒng)這里面就可以涉及到多個(gè)子系統(tǒng)的連接,比如:產(chǎn)品主數(shù)據(jù)的數(shù)據(jù)源,項(xiàng)目管理系統(tǒng)的數(shù)據(jù)源(項(xiàng)目可以產(chǎn)品訂單)等多個(gè)不同數(shù)據(jù)庫類似的數(shù)據(jù)源,他們可能是ORACLE,SQL SERVER,MYSQL等多種混合數(shù)據(jù)源。
?

  2.多數(shù)據(jù)源概述
?

  基于以上的背景,就會選擇使用多個(gè)數(shù)據(jù)源,一個(gè)數(shù)據(jù)源用于讀一個(gè)數(shù)據(jù)源用于寫?;蛘卟煌臄?shù)據(jù)源混合使用。他的基本思想其實(shí)就是AOP。我們可以通過AOP的思想實(shí)現(xiàn)動態(tài)數(shù)據(jù)源切換,通過這個(gè)AOP思想可適用于多種場景、純粹多庫、讀寫分離、一主多從、混合模式等。

  動態(tài)數(shù)據(jù)源能進(jìn)行自動切換的核心就是spring底層的AbstractRoutingDataSource進(jìn)行數(shù)據(jù)源的路由,只要繼承了這個(gè)類均可看作是一個(gè)數(shù)據(jù)源的實(shí)現(xiàn)。主要實(shí)現(xiàn)方法是determineCurrentLookupkey,該方法只需要返回?cái)?shù)據(jù)源實(shí)例名稱。
?

  3.mybatisplus多數(shù)據(jù)源
?

  我們在項(xiàng)目中用mybatisplus的使用用得比較多,這個(gè)動態(tài)數(shù)據(jù)源切換需要實(shí)現(xiàn)的話,比較麻煩,如果有現(xiàn)成的框架使用則最好不過了。恰好mybatiplus就能實(shí)現(xiàn)。文檔地址如下:
?

  ```properties

  https://baomidou.com/pages/a61e1b/#%E6%96%87%E6%A1%A3-documentation

  https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611

  ```

  4.使用
?

  4.1介紹
?

  dynamic-datasource-spring-boot-starter是一個(gè)基于springboot的快速集成多數(shù)據(jù)源的啟動器。
?

  特性:

  -支持**數(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)建連接)。

  -支持**自定義注解**,需繼承DS3.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ù)方案。**
?

  4.2 約定
?

  1.本框架只做**切換數(shù)據(jù)源**這件核心的事情,并**不限制你的具體操作**,切換了數(shù)據(jù)源可以做任何CRUD。

  2.配置文件所有以下劃線`_`分割的數(shù)據(jù)源**首部**即為組的名稱,相同組名稱的數(shù)據(jù)源會放在一個(gè)組下。

  3.切換數(shù)據(jù)源可以是組名,也可以是具體數(shù)據(jù)源名稱。組名則切換時(shí)采用負(fù)載均衡算法切換。

  4.默認(rèn)的數(shù)據(jù)源名稱為**master**,你可以通過`spring.datasource.dynamic.primary`修改。

  5.方法上的注解優(yōu)先于類上注解。

  6.DS支持繼承抽象類上的DS,暫不支持繼承接口上的DS。
?

  4.3 使用
?

  4.3.1準(zhǔn)備數(shù)據(jù)庫

 docker run --name mysq -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7

  創(chuàng)建2個(gè)數(shù)據(jù)庫

create database test1;
create database test2;


use test2;

-- auto-generated definition
create table tb_user
(
    id   int auto_increment
        primary key,
    name varchar(200) null
);

insert into tb_user values(1,"wangwu");


use test1;

-- auto-generated definition
create table tb_user
(
    id   int auto_increment
        primary key,
    name varchar(200) null
);
insert into tb_user values(1,"zhangsan");

  一個(gè)作為主庫一個(gè)作為從庫。
?

  4.3.2 springboot創(chuàng)建工程
?

  添加依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itheima</groupId>
    <artifactId>dynamic</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.21</version>
        </dependency>
    </dependencies>
</project>

  啟動類:

package com.itheima;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DynamicApplication {
    public static void main(String[] args) {
        SpringApplication.run(DynamicApplication.class,args);
    }
}

  4.3.3配置yml

spring:
  datasource:
    dynamic:
      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ù)源
      datasource:
        master:
          url: jdbc:mysql://192.168.211.253:3306/test1
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0開始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://192.168.211.253:3306/test2
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        #......省略
        #以上會配置一個(gè)默認(rèn)庫master,一個(gè)組slave下有兩個(gè)子庫slave_1

  4.3.4使用注解來切換數(shù)據(jù)源
?

  使用**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");
  }
}

  4.3.5創(chuàng)建CSD

  po:

package com.itheima.po;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("tb_user")
public class User {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @TableField("name")
    private String name;
}

  controller

package com.itheima.controller;

import com.itheima.po.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User get(@PathVariable(name="id")Integer id){
        return userService.getById(id);
    }
}

  service

  ```

  public interface UserService{

  User getById

Integer id

;

  }

  ```

package com.itheima.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.itheima.dao.UserDao;
import com.itheima.po.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@DS("slave_1")
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    public User getById(Integer id) {
        return userDao.selectById(id);
    }
}

  注意:如上:DS注解用于指定使用哪一個(gè)數(shù)據(jù)源。
?

  dao

package com.itheima.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.po.User;

public interface UserDao extends BaseMapper<User> {
}

  啟動類:

@SpringBootApplication
@MapperScan(basePackages = "com.itheima.dao")
public class DynamicApplication {
    public static void main(String[] args) {
        SpringApplication.run(DynamicApplication.class,args);
    }
}

  4.3.6測試
?

  +當(dāng)使用DS注解指定master的時(shí)候:

  ```

  Service

  DS

"master"

  public class UserServiceImpl implements UserService{

  Autowired

  private UserDao userDao;

  Override

  public User getById

Integer id

{

  return userDao.selectById

id

;

  }

  }

  ```

  重啟項(xiàng)目,瀏覽器發(fā)送請求:http://localhost:8080/user/1
?

  得到結(jié)果:

  ```

  {"id":1,"name":"zhangsan"}

  ```

  +當(dāng)使用DS注解指定slave_1的時(shí)候

  ```

  Service

  DS

"slave_1"

  public class UserServiceImpl implements UserService{

  Autowired

  private UserDao userDao;

  Override

  public User getById

Integer id

{

  return userDao.selectById

id

;

  }

  }

  ```

  重啟項(xiàng)目,瀏覽器發(fā)送請求:http://localhost:8080/user/1
?

  得到結(jié)果:

{"id":1,"name":"wangwu"}

  測試成功。
?

  5.總結(jié)
?

  使用mybatisplus的動態(tài)數(shù)據(jù)源切換非常方便,只需添加依賴,并在yaml中配置數(shù)據(jù)源的名稱和地址,并在service的實(shí)現(xiàn)類中使用注解來指定實(shí)現(xiàn)切換即可。下一章節(jié)我們來看看如何使用AOP來實(shí)現(xiàn)不需要修改代碼就能動態(tài)切換數(shù)據(jù)源。
?

  +添加依賴

  +添加yaml配置

  +在業(yè)務(wù)方法上或者業(yè)務(wù)類上添加 DS注解文章來源地址http://www.zghlxwxcb.cn/news/detail-459185.html

到了這里,關(guān)于mybatisplus快速實(shí)現(xiàn)動態(tài)數(shù)據(jù)源切換的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Spring AOP + 自定義注解 + 動態(tài)數(shù)據(jù)源 實(shí)現(xiàn)主從庫切換&讀寫分離】—— 案例實(shí)戰(zhàn)

    【Spring AOP + 自定義注解 + 動態(tài)數(shù)據(jù)源 實(shí)現(xiàn)主從庫切換&讀寫分離】—— 案例實(shí)戰(zhàn)

    ???????????????????????????????????????????? ?? S p r i n g A O P + 主從數(shù)據(jù)源切換 + 讀寫分離 + 自定義注解案例實(shí)戰(zhàn)! color{#FF1493}{Spring AOP + 主從數(shù)據(jù)源切換 + 讀寫分離 + 自定義注解 案例實(shí)戰(zhàn)!} Sp r in g A OP + 主從數(shù)據(jù)源切換 + 讀寫分離 + 自定義注解案例

    2024年02月15日
    瀏覽(21)
  • springboot整合多數(shù)據(jù)源的配置以及動態(tài)切換數(shù)據(jù)源,注解切換數(shù)據(jù)源

    springboot整合多數(shù)據(jù)源的配置以及動態(tài)切換數(shù)據(jù)源,注解切換數(shù)據(jù)源

    在許多應(yīng)用程序中,可能需要使用多個(gè)數(shù)據(jù)庫或數(shù)據(jù)源來處理不同的業(yè)務(wù)需求。Spring Boot提供了簡便的方式來配置和使用多數(shù)據(jù)源,使開發(fā)人員能夠輕松處理多個(gè)數(shù)據(jù)庫連接。如果你的項(xiàng)目中可能需要隨時(shí)切換數(shù)據(jù)源的話,那我這篇文章可能能幫助到你 ??:這里對于pom文件

    2024年02月10日
    瀏覽(33)
  • Spring Boot + MyBatis-Plus 實(shí)現(xiàn) MySQL 主從復(fù)制動態(tài)數(shù)據(jù)源切換

    Spring Boot + MyBatis-Plus 實(shí)現(xiàn) MySQL 主從復(fù)制動態(tài)數(shù)據(jù)源切換

    MySQL 主從復(fù)制是一種常見的數(shù)據(jù)庫架構(gòu),它可以提高數(shù)據(jù)庫的性能和可用性。 動態(tài)數(shù)據(jù)源切換則可以根據(jù)業(yè)務(wù)需求,在不同場景下使用不同的數(shù)據(jù)源,比如在讀多寫少的場景下,可以通過切換到從庫來分擔(dān)主庫的壓力 。 在本文中,我們將介紹如何在 Spring Boot 中實(shí)現(xiàn) MySQL 動

    2024年02月19日
    瀏覽(27)
  • springboot dynamic-datasource 實(shí)現(xiàn)動態(tài)切換數(shù)據(jù)源-多租戶-配置文件切換-基于dynamic-datasource

    1、實(shí)現(xiàn)動態(tài)切換數(shù)據(jù)源 2、實(shí)現(xiàn)配置多數(shù)據(jù)源 3、實(shí)現(xiàn)讀寫分離也可以用多數(shù)據(jù)源方式 4、選擇 dynamic-datasource集成了很多ORM的框架,其中,使用比較多的是druid,但有一些東西開始收費(fèi)了 druid也可以自行配置,配置多了點(diǎn) 目前版本只支持單一位置加載數(shù)據(jù)源(只能從配置文件或

    2024年02月09日
    瀏覽(17)
  • SpringBoot——動態(tài)數(shù)據(jù)源(多數(shù)據(jù)源自動切換)

    SpringBoot——動態(tài)數(shù)據(jù)源(多數(shù)據(jù)源自動切換)

    日常的業(yè)務(wù)開發(fā)項(xiàng)目中只會配置一套數(shù)據(jù)源,如果需要獲取其他系統(tǒng)的數(shù)據(jù)往往是通過調(diào)用接口, 或者是通過第三方工具比如kettle將數(shù)據(jù)同步到自己的數(shù)據(jù)庫中進(jìn)行訪問。 但是也會有需要在項(xiàng)目中引用多數(shù)據(jù)源的場景。比如如下場景: 自研數(shù)據(jù)遷移系統(tǒng),至少需要新、老兩

    2024年02月16日
    瀏覽(18)
  • SpringBoot動態(tài)切換數(shù)據(jù)源

    SpringBoot動態(tài)切換數(shù)據(jù)源

    ? Spring提供一個(gè)DataSource實(shí)現(xiàn)類用于動態(tài)切換數(shù)據(jù)源—— AbstractRoutingDataSource pom.xml 大概的項(xiàng)目結(jié)構(gòu) 注意:這兩個(gè)事務(wù)管理器,并不能處理分布式事務(wù) 鏈接:https://pan.baidu.com/s/1ymxeKYkI-cx7b5nTQX0KWQ? 提取碼:6bii? --來自百度網(wǎng)盤超級會員V4的分享? ? ? ? ? ? ? ??

    2024年02月06日
    瀏覽(19)
  • SpringBoot從數(shù)據(jù)庫讀取數(shù)據(jù)數(shù)據(jù)源配置信息,動態(tài)切換數(shù)據(jù)源

    SpringBoot從數(shù)據(jù)庫讀取數(shù)據(jù)數(shù)據(jù)源配置信息,動態(tài)切換數(shù)據(jù)源

    ? ? ? ? 首先準(zhǔn)備多個(gè)數(shù)據(jù)庫,主庫smiling-datasource,其它庫test1、test2、test3 ? ? ? ? 接下來,我們在主庫smiling-datasource中,創(chuàng)建表databasesource,用于存儲多數(shù)據(jù)源相關(guān)信息。表結(jié)構(gòu)設(shè)計(jì)如下 ? ? ? ? 創(chuàng)建好表之后,向表databasesource中存儲test1、test2、test3三個(gè)數(shù)據(jù)庫的相關(guān)配置

    2024年01月16日
    瀏覽(36)
  • 實(shí)例講解Spring boot動態(tài)切換數(shù)據(jù)源

    摘要: 本文模擬一下在主庫查詢訂單信息查詢不到的時(shí)候,切換數(shù)據(jù)源去歷史庫里面查詢。 本文分享自華為云社區(qū)《springboot動態(tài)切換數(shù)據(jù)源》,作者:小陳沒煩惱 。 在公司的系統(tǒng)里,由于數(shù)據(jù)量較大,所以配置了多個(gè)數(shù)據(jù)源,它會根據(jù)用戶所在的地區(qū)去查詢那一個(gè)數(shù)據(jù)庫

    2024年02月06日
    瀏覽(26)
  • springboot使用DynamicDataSource來動態(tài)切換數(shù)據(jù)源

    DynamicDataSource是一個(gè)數(shù)據(jù)源路由器,可以根據(jù)上下文動態(tài)選擇數(shù)據(jù)源??梢栽诿總€(gè)請求或線程中將數(shù)據(jù)源設(shè)置為當(dāng)前需要使用的數(shù)據(jù). 創(chuàng)建一個(gè) DynamicDataSource 類,它繼承自 AbstractRoutingDataSource 。在該類中重寫**determineCurrentLookupKey()**方法,該方法返回一個(gè)字符串,用于指示當(dāng)前

    2024年02月05日
    瀏覽(21)
  • SpringBoot整合多數(shù)據(jù)源,并支持動態(tài)新增與切換(詳細(xì)教程)

    SpringBoot整合多數(shù)據(jù)源,并支持動態(tài)新增與切換(詳細(xì)教程)

    推薦文章: ????1、springBoot對接kafka,批量、并發(fā)、異步獲取消息,并動態(tài)、批量插入庫表; ????2、SpringBoot用線程池ThreadPoolTaskExecutor異步處理百萬級數(shù)據(jù); ????3、java后端接口API性能優(yōu)化技巧 ????4、SpringBoot+MyBatis流式查詢,處理大規(guī)模數(shù)據(jù),提高系統(tǒng)的性能和響應(yīng)能力。 一

    2024年02月10日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包