成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

Springboot整合多數(shù)據(jù)源代碼示例詳解

瀏覽:6日期:2023-05-03 16:35:52

最近有個(gè)老項(xiàng)目想逐步將新業(yè)務(wù)的數(shù)據(jù)放到新的數(shù)據(jù)庫,以前的業(yè)務(wù)還得連接以前的數(shù)據(jù)庫,于是需要整合多數(shù)據(jù)源 。

多數(shù)據(jù)源實(shí)際上是繼承了AbstractRoutingDataSource類,這個(gè)類最終實(shí)現(xiàn)了DataSource接口,DataSource里只有一個(gè)getConnection方法,數(shù)據(jù)庫每次訪問的時(shí)候都要先通過這個(gè)方法獲取連接,所有多數(shù)據(jù)源就是每次訪問數(shù)據(jù)庫之前動態(tài)的改變數(shù)據(jù)源。

在請求前改變數(shù)據(jù)源當(dāng)然需要用到SpringAOP,自定義注解操作

項(xiàng)目結(jié)構(gòu)

Springboot整合多數(shù)據(jù)源代碼示例詳解

下面上代碼:

首先是依賴:

<!--數(shù)據(jù)庫連接--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--sqlserver--> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.2</version> </dependency> <!--數(shù)據(jù)庫連接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.8</version> </dependency><!--AOP--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>

yml配置數(shù)據(jù)源

server: port: 8888spring: jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss datasource: druid: first: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource jdbc-url: jdbc:mysql://rm-uf6265pj340sc9447oo.mysql.rds.54565.com:3306/dm?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=utf-8 username: username password: password second: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc-url: jdbc:sqlserver://39.104.203.222:1433;DatabaseName=TestTLcom username: root password: 123456mybatis-plus: mapper-locations: classpath*:/mapper/*Mapper.xml type-aliases-package: com.zdyl.dynamicdatasourcedemo.entity global-config: #主鍵類型 0:'數(shù)據(jù)庫ID自增', 1:'用戶輸入ID',2:'全局唯一ID (數(shù)字類型唯一ID)', 3:'全局唯一ID UUID'; id-type: 3 #字段策略 0:'忽略判斷',1:'非 NULL 判斷'),2:'非空判斷' field-strategy: 2 #駝峰下劃線轉(zhuǎn)換 db-column-underline: true #刷新mapper 調(diào)試神器 refresh-mapper: true #數(shù)據(jù)庫大寫下劃線轉(zhuǎn)換 #capital-mode: true #序列接口實(shí)現(xiàn)類配置 #key-generator: com.baomidou.springboot.xxx #邏輯刪除配置 #logic-delete-value: 0 #logic-not-delete-value: 1 #自定義填充策略接口實(shí)現(xiàn) #meta-object-handler: com.baomidou.springboot.xxx #自定義SQL注入器 #sql-injector: com.baomidou.springboot.xxx configuration: map-underscore-to-camel-case: true cache-enabled: false

定義數(shù)據(jù)庫名稱

/** * 數(shù)據(jù)庫名稱 */public interface DataSourceNames { String FIRST = 'first'; String SECOND = 'second';}

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

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource;import java.util.HashMap;import java.util.Map;/** * 動態(tài)數(shù)據(jù)源 */public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public DynamicDataSource(DataSource defaultTargetDataSource, Map<String, DataSource> targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(new HashMap<>(targetDataSources)); super.afterPropertiesSet(); } @Override protected Object determineCurrentLookupKey() { return getDataSource(); } public static String getDataSource() { return contextHolder.get(); } public static void setDataSource(String dataSource) { contextHolder.set(dataSource); } public static void clearDataSource() { contextHolder.remove(); }}

配置多數(shù)據(jù)源

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.DataSourceNames;import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.DynamicDataSource;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import javax.sql.DataSource;import java.util.HashMap;import java.util.Map;/** * 多數(shù)據(jù)源配置 */@Configuration@MapperScan('com.zdyl.dynamicdatasourcedemo.**.mapper*')public class MybatisPluConfig { /** * 數(shù)據(jù)源配置 * @return */ @Bean @ConfigurationProperties(prefix='spring.datasource.druid.first') public DataSource firstDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix='spring.datasource.druid.second') public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } @Bean @Primary public DynamicDataSource dataSource(DataSource firstDataSource, DataSource secondDataSource){ Map<String, DataSource> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceNames.FIRST, firstDataSource); targetDataSources.put(DataSourceNames.SECOND, secondDataSource); return new DynamicDataSource(firstDataSource, targetDataSources); } /** * mybatis-plus分頁插件<br> * 文檔:http://mp.baomidou.com<br> */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }}

下面就是自定義注解

import java.lang.annotation.*;/** * 多數(shù)據(jù)源注解 * AOP攔截此注解更換數(shù)據(jù)源 */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface CurDataSource { String name() default '';}

AOP

import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.DataSourceNames;import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.DynamicDataSource;import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.annotation.CurDataSource;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.core.Ordered;import org.springframework.stereotype.Component;import java.lang.reflect.Method;/** * 多數(shù)據(jù)源,切面處理類 * AOP攔截多數(shù)據(jù)源注解 @CurDataSource 注解更換數(shù)據(jù)源 */@Slf4j@Aspect@Componentpublic class DataSourceAspect implements Ordered { /** * 切點(diǎn) */ @Pointcut('@annotation(com.zdyl.dynamicdatasourcedemo.dynamicdatasource.annotation.CurDataSource)') public void dataSourcePointCut() { } @Around('dataSourcePointCut()') public Object around(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); CurDataSource curDataSource = method.getAnnotation(CurDataSource.class); if (curDataSource == null) { DynamicDataSource.setDataSource(DataSourceNames.FIRST); log.info('set datasource is ' + DataSourceNames.FIRST); } else { DynamicDataSource.setDataSource(curDataSource.name()); log.info('set datasource is ' + curDataSource.name()); } try { return point.proceed(); } finally { DynamicDataSource.clearDataSource(); log.info('clean datasource'); } } @Override public int getOrder() { return 1; }}

最后主啟動了去掉數(shù)據(jù)源自動加載

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

最后我們來跑起來請求一下,測試一下是否正確

@RestControllerpublic class CfgDeviceController { @Resource CfgDeviceService cfgDeviceService; @Resource CfgChargeStartInfoService cfgChargeStartInfoService; @CurDataSource(name = DataSourceNames.FIRST) @GetMapping('/test') public void getUser() { CfgDevice byId = cfgDeviceService.getById(19); System.out.println(byId.toString()); } @CurDataSource(name = DataSourceNames.SECOND) @GetMapping('/test1') public void getUser1() { CfgChargeStartInfo byId = cfgChargeStartInfoService.getById(1); System.out.println(byId.toString()); }}

Springboot整合多數(shù)據(jù)源代碼示例詳解

**如果不加注解,使用默認(rèn)數(shù)據(jù)源

至此就整合完了

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人午夜视频免费看| 国产精品亚洲成人| 亚洲欧美成人一区二区三区| 精品视频免费在线| 国产高清精品在线| 日韩电影免费一区| 欧美三级日韩三级| 日韩 欧美一区二区三区| 久久久天天操| 国产成人午夜99999| 国产三级一区二区三区| 欧美日韩国产综合网| 亚洲同性gay激情无套| 欧美综合77777色婷婷| 国产欧美日韩亚州综合| av成人老司机| 成人手机电影网| 欧美视频一区在线| 豆国产96在线|亚洲| 国产亚洲人成网站| 国产午夜精品在线观看| 婷婷开心激情综合| 国产精品亚洲一区| 亚洲你懂的在线视频| 欧美久久久久久久| 自拍偷拍亚洲综合| 欧美一区成人| 欧美日韩在线综合| 欧美不卡一区二区三区| 91精品国产一区二区| 亚洲va国产va欧美va观看| 欧美另类综合| 日韩欧美一二三区| 91丨九色丨尤物| 91精品国模一区二区三区| 久久久久免费| 老司机精品视频导航| 日本精品一区二区三区高清| 一区二区三区四区乱视频| 91视频国产观看| 久久综合999| 日韩限制级电影在线观看| 欧美日韩a区| 欧美精品三级在线观看| 欧美成人免费网站| 亚洲欧美一区二区在线观看| 99久久免费视频.com| 欧美激情一区三区| 亚洲麻豆av| 麻豆成人在线| 精品亚洲porn| 国产欧美日韩另类视频免费观看| 欧美日韩亚洲一区二区三区四区| 中文字幕在线免费不卡| www.在线欧美| 欧美精品第1页| 一区二区三区在线免费视频| 你懂的视频一区二区| 自拍偷拍欧美激情| 欧美色图12p| 91欧美激情一区二区三区成人| 综合色天天鬼久久鬼色| 国产精品女人毛片| 色噜噜久久综合| 欧美男生操女生| 精品国产91洋老外米糕| 日韩精品综合一本久道在线视频| 噜噜爱69成人精品| 国产女人水真多18毛片18精品视频| 午夜精品婷婷| 99久久久久久| 国产伦精品一区二区三区照片91| 久久综合中文| 在线成人午夜影院| 久久先锋资源网| 国产精品久久久久久久久久久免费看 | 欧美日韩国产美| 国产麻豆欧美日韩一区| 成人h动漫精品| 国产日本欧美一区二区| 香蕉久久一区二区不卡无毒影院 | 免费一级欧美片在线播放| 日韩在线卡一卡二| 一区二区三区中文免费| 亚洲区一区二| 国产伦精品一区二区三区视频青涩 | 日韩欧美国产一区二区三区| 国产久卡久卡久卡久卡视频精品| 国产乱一区二区| caoporn国产精品| 久久久99精品久久| 国产在线不卡| 高清不卡在线观看| 免费欧美高清视频| 欧美aaaaaa午夜精品| 亚洲一卡二卡三卡四卡无卡久久| 国产精品久久夜| 亚洲自拍欧美精品| 欧美喷水一区二区| 99久久夜色精品国产网站| 久久天天做天天爱综合色| 欧洲国内综合视频| 精品视频免费在线| 久久综合狠狠综合久久综合88| 精品99一区二区三区| 国产精品久久久久婷婷 | 久久久久国产精品麻豆| 中文字幕永久在线不卡| 亚洲一区欧美一区| 精品一区二区三区久久久| 99精品视频在线观看免费| 欧美综合在线视频| 一区二区精品| 精品sm捆绑视频| 久久精品人人做| 成人精品视频一区| 欧美一级日韩免费不卡| 国产91丝袜在线18| 91精品国产高清一区二区三区 | 精品少妇一区二区三区日产乱码 | 久久97超碰色| 欧美一站二站| 国产高清亚洲一区| 青草av.久久免费一区| 亚洲人123区| 午夜精品一区二区三区免费视频| 大胆欧美人体老妇| 国产精品日韩欧美一区| 日韩欧美一级精品久久| 亚洲gay无套男同| 极品av少妇一区二区| 欧美性生活大片视频| 亚洲最大的成人av| 欧美a级在线| ww久久中文字幕| 精东粉嫩av免费一区二区三区| 欧美连裤袜在线视频| 精品国产乱码久久久久久影片| 精品国产乱码久久久久久蜜臀| 久久精品女人的天堂av| 欧美在线一区二区三区| 国产精品丝袜在线| 狠色狠色综合久久| 欧美三级在线看| 国产裸体歌舞团一区二区| 欧美综合77777色婷婷| 中文字幕巨乱亚洲| 国产乱妇无码大片在线观看| 久久久www| 国产一区二区三区av电影| 久久精品亚洲乱码伦伦中文| 久久久亚洲国产美女国产盗摄| 欧美成人vps| 日韩电影在线观看电影| 色婷婷综合中文久久一本| 日韩欧美一区二区久久婷婷| 国产日韩成人精品| 黄色工厂这里只有精品| 成人欧美一区二区三区黑人麻豆 | 另类小说视频一区二区| 欧美一区二区三区色| 欧美成人性战久久| 欧美搞黄网站| 午夜精品福利一区二区三区av| 久久先锋影音| 国产香蕉久久精品综合网| 99re6热在线精品视频播放速度| 国产精品区一区二区三| 一区二区三区日韩| 欧美午夜电影在线观看 | 欧美色图天堂网| 一本一本久久a久久精品综合妖精| 国产成人欧美日韩在线电影| 日本一道高清亚洲日美韩| 亚洲成av人在线观看| 图片区小说区区亚洲影院| 欧美午夜不卡影院在线观看完整版免费 | 热久久免费视频| 亚洲精品伦理在线| 亚洲国产日韩在线一区模特| 国产欧美一区二区精品秋霞影院| 日韩国产欧美在线视频| 久久青草久久| 日韩毛片一二三区| 成人做爰69片免费看网站| 日韩av二区在线播放| 日韩国产高清在线| 国产在线麻豆精品观看| 免费成人在线网站| 亚洲不卡在线观看| 国产日韩精品一区二区三区在线| 色94色欧美sute亚洲13| 国产日韩欧美| 亚洲国产高清一区二区三区| 91精品欧美福利在线观看| 亚洲国产精品一区在线观看不卡| bt欧美亚洲午夜电影天堂| 午夜激情综合网| 一区二区久久久| 亚洲精品一二三四区|