日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

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

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

項目結(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 #序列接口實現(xiàn)類配置 #key-generator: com.baomidou.springboot.xxx #邏輯刪除配置 #logic-delete-value: 0 #logic-not-delete-value: 1 #自定義填充策略接口實現(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 { /** * 切點 */ @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ù)源代碼示例詳解

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

至此就整合完了

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

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品中文字幕亚洲欧美| 国产麻豆精品| av免费不卡国产观看| 国产精品v一区二区三区| 久久一二三区| 久久久久久黄| 黄色在线一区| 久久国产精品亚洲77777| 亚洲一区二区三区高清| 免费观看久久av| 一区三区视频| 日韩精品一区二区三区av| 香蕉国产精品| 国产亚洲永久域名| 老鸭窝毛片一区二区三区| 免费成人av在线播放| 日韩精品一区二区三区中文在线| 日本99精品| 国产午夜久久av| 国产极品一区| 成人片免费看| 亚洲天堂日韩在线| 欧美片第1页综合| 丝袜诱惑一区二区| 99视频精品视频高清免费| 蜜桃一区二区三区在线| 久久精品资源| 久久av在线| 欧美黑人巨大videos精品| 成人在线免费观看网站| 在线亚洲激情| 粉嫩av一区二区三区四区五区 | 国产日韩一区二区三区在线播放| 国产精品伦理久久久久久| 日韩视频中文| 国产一区二区三区四区大秀| 免费视频国产一区| 国产在线视频欧美一区| 免费国产亚洲视频| 欧美羞羞视频| 国产精品地址| 日韩一区精品字幕| 亚洲永久av| 久久激情五月婷婷| 西西人体一区二区| 91免费精品| 欧美精品导航| 久久国产麻豆精品| 在线观看亚洲精品福利片| 日本aⅴ亚洲精品中文乱码 | 日韩成人三级| 国产精品美女久久久久久不卡| 另类国产ts人妖高潮视频| 国产福利电影在线播放| 久久av电影| 久久久91麻豆精品国产一区| 久久亚洲欧美| 9久re热视频在线精品| 色一区二区三区| 国内精品麻豆美女在线播放视频| 国产精品**亚洲精品| 国产日韩亚洲欧美精品| 日本成人中文字幕| 日韩中文字幕| 亚洲精品美女91| 日韩欧美四区| 91免费精品国偷自产在线在线| 日韩精品1区2区3区| 欧美一区激情| 国产91欧美| 亚洲精品88| 国产91久久精品一区二区| 中文字幕在线高清| 日韩精品久久久久久久电影99爱| 日本韩国欧美超级黄在线观看| 日韩欧美自拍| 亚洲午夜久久久久久尤物| 亚洲精华国产欧美| 日本成人在线视频网站| 久久的色偷偷| 日韩欧美不卡| 欧美资源在线| 久久免费影院| 伊人久久婷婷| 国产精品亚洲欧美| 色88888久久久久久影院| 欧美日韩激情在线一区二区三区| 久久香蕉精品| 四虎8848精品成人免费网站| 国内亚洲精品| 91成人福利| 久久激情中文| 日本麻豆一区二区三区视频| 精品久久视频| 西西人体一区二区| 日韩成人精品一区| 蜜臀精品一区二区三区在线观看| 欧美日韩1区2区3区| 新版的欧美在线视频| 日本 国产 欧美色综合| 精品一级视频| 亚洲国内精品| 嫩草伊人久久精品少妇av杨幂| 亚洲va中文在线播放免费| 日韩免费精品| 国产精品7m凸凹视频分类| 国产精品三p一区二区| 夜久久久久久| 天堂8中文在线最新版在线| 日韩av中文在线观看| av高清一区| 韩日一区二区| 国产精品尤物| 91精品日本| 亚欧成人精品| 亚洲欧美日韩国产一区二区| 欧美国产小视频| 国产美女精品视频免费播放软件| 日韩中文字幕麻豆| 99riav1国产精品视频| 亚洲精品福利电影| 捆绑调教日本一区二区三区| 国产精品玖玖玖在线资源| 亚洲精品中文字幕99999| 亚洲一区二区动漫| 亚洲精品小说| 欧美精品一线| 黑丝一区二区| 亚洲欧美日韩视频二区| 午夜影院欧美| 日本 国产 欧美色综合| 国产一区91| 欧美日韩中文字幕一区二区三区| 精品网站999| 久久久久久久欧美精品| 中文字幕日韩欧美精品高清在线| 国产日韩中文在线中文字幕| 精品国产乱码| 久久成人一区| 亚洲精品第一| 国产精品视频一区二区三区| 五月精品视频| 蜜桃一区二区三区在线| 亚洲影视一区| 欧美永久精品| 中文字幕在线看片| 亚洲一区二区三区高清| 日精品一区二区三区| 欧美日一区二区在线观看| 国产在线不卡一区二区三区| 日韩不卡在线观看日韩不卡视频 | 国产一区二区三区四区大秀| 亚洲www啪成人一区二区| 欧美日韩视频免费观看| 午夜欧美理论片| 日韩天堂av| 免费一区二区三区在线视频| 日韩影院二区| 综合国产在线| 精品久久91| 一区在线免费观看| 国产乱论精品| 欧美日韩国产高清| 国产精品99久久免费| 欧美一区二区性| 国产日韩欧美在线播放不卡| 欧美二三四区| 国产精品午夜一区二区三区| 国产在线不卡| 国产在线一区不卡| 亚洲在线成人| 国产在线观看www| 日韩精品一级| 亚洲第一区色| 国产精品xxx在线观看| 国产精品毛片| 99久久激情| 91麻豆国产自产在线观看亚洲| 亚洲一二三区视频| 欧美亚洲在线日韩| 精品亚洲自拍| 国产精品s色| 欧美亚洲一区二区三区| 国产精品三上| 久久激情网站| 国产成人77亚洲精品www| 国产精品99精品一区二区三区∴ | 成人在线视频免费看| 欧美日韩调教| 视频国产精品| 亚欧洲精品视频在线观看| 久久国产99| 亚洲一区二区网站| 九一国产精品| 亚洲精品.com| 婷婷六月综合| 性一交一乱一区二区洋洋av| 国产精品视区| av不卡在线看| 日韩在线观看中文字幕|