成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_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国内精品久久久久久久
一本色道久久| 国产亚洲欧美在线| 国产丝袜美腿一区二区三区| 国产剧情一区二区三区| 亚洲专区在线| 亚洲精品福利视频网站| 国产精品v欧美精品v日韩精品| 久久亚洲综合色一区二区三区| 成人午夜看片网址| 日韩欧美中文字幕一区| 国产精品系列在线播放| 欧美一区三区二区| 国产成人av电影在线播放| 欧美精品在线观看一区二区| 麻豆精品一区二区三区| 在线影视一区二区三区| 日本一道高清亚洲日美韩| 91国偷自产一区二区开放时间| 秋霞电影网一区二区| 国产寡妇亲子伦一区二区| 6080国产精品一区二区| 国产成人av网站| 欧美mv日韩mv国产网站app| 国产精品1区2区3区| 欧美α欧美αv大片| av一区二区不卡| 欧美xxxxxxxxx| 成人高清免费观看| 精品不卡在线视频| 欧美一区二区| 亚洲婷婷国产精品电影人久久| 韩日精品视频| 亚洲一区二区不卡免费| 色欧美乱欧美15图片| 久久精品国产久精国产| 欧美精品三级日韩久久| 成人三级伦理片| 国产亚洲欧美在线| 国产精品videosex极品| 有码一区二区三区| 色狠狠一区二区三区香蕉| 亚洲成人av中文| 欧美综合久久久| 韩国一区二区三区| 精品少妇一区二区三区日产乱码| 99久久er热在这里只有精品15| 欧美极品美女视频| 亚洲欧洲精品一区二区| 视频一区在线视频| 欧美美女一区二区三区| 成人免费毛片嘿嘿连载视频| 国产精品色在线| 国产精品久久久久毛片大屁完整版 | 欧美激情日韩| 亚洲免费大片在线观看| 色综合av在线| 高清在线观看日韩| 国产三级一区二区| 国产久一道中文一区| 麻豆专区一区二区三区四区五区| 日韩一级免费观看| 黄色成人在线网址| 亚洲高清不卡在线| 欧美丰满少妇xxxxx高潮对白 | 一本大道综合伊人精品热热| 国内一区二区在线| 国产亚洲精品免费| 国产欧美另类| 国内精品国产成人国产三级粉色| 国产亚洲福利社区一区| 国产亚洲永久域名| 国产一区 二区 三区一级| 中国色在线观看另类| 久久欧美肥婆一二区| 国产精品中文字幕日韩精品| 国产精品免费视频网站| 久久xxxx| gogo大胆日本视频一区| 亚洲一卡二卡三卡四卡无卡久久| 欧美人狂配大交3d怪物一区| 国产自产在线视频一区| 久久国产综合精品| 欧美国产视频在线| 欧洲av一区二区嗯嗯嗯啊| www.日韩av| 亚洲一区二区三区中文字幕| 91精品在线一区二区| 在线国产精品一区| 国内精品不卡在线| **性色生活片久久毛片| 欧美电影一区二区| 伊人成人在线| 国产精品白丝jk白祙喷水网站| 亚洲精品成人在线| xfplay精品久久| 老牛国产精品一区的观看方式| 99久久er热在这里只有精品15 | 国产一区二区三区美女| 国产精品国产馆在线真实露脸| 在线观看欧美日本| 亚洲国产精选| 国产成a人亚洲精| 亚洲午夜精品网| www国产精品av| 快she精品国产999| 国产精品二区在线| 久久91精品国产91久久小草| 国产精品高潮呻吟| 日韩一区二区精品| 国产精品裸体一区二区三区| 成人av网站免费观看| 男男视频亚洲欧美| 成人免费一区二区三区视频| 51精品国自产在线| 亚洲欧美久久| 欧美日韩高清免费| 国产成人午夜99999| 日韩黄色一级片| 国产精品麻豆网站| 日韩一区二区三区视频在线观看 | 欧美在线观看一区二区| 亚洲经典一区| 91亚洲精品乱码久久久久久蜜桃| 日本女优在线视频一区二区 | 日本午夜一本久久久综合| 国产亚洲欧美色| 欧美情侣在线播放| 老鸭窝毛片一区二区三区| 午夜国产精品视频| 国产精品亚洲一区二区三区妖精 | 欧美不卡一卡二卡免费版| 国精产品一区一区三区mba桃花| 亚洲五码中文字幕| 中文字幕av一区二区三区高| 日韩精品中文字幕一区二区三区 | 精品理论电影在线| 在线观看不卡一区| 国产精品一级久久久| 欧美私人啪啪vps| 成人黄色a**站在线观看| 免播放器亚洲一区| 亚洲一区二区三区美女| 亚洲欧美在线aaa| 国产亚洲精品资源在线26u| 日韩一区二区免费在线电影| 欧美性一级生活| 久久久久久亚洲精品不卡4k岛国| 99视频精品免费观看| 激情一区二区| 成人综合在线视频| 久久99精品久久久久婷婷| 日本欧美大码aⅴ在线播放| 亚洲综合免费观看高清在线观看| 国产精品麻豆一区二区| 亚洲精品在线电影| 日韩欧美一区在线观看| 欧美日韩一区二区三区免费看| 蜜桃av噜噜一区二区三区| 国产一区二区高清不卡| 亚洲日韩成人| 亚洲无吗在线| 国产一区观看| 国内在线观看一区二区三区| 色综合久久综合网欧美综合网| 91一区在线观看| 92精品国产成人观看免费| 成人a免费在线看| 国产成人免费视频网站| 国产精品99久久久久久久vr | 高清不卡在线观看av| 国产寡妇亲子伦一区二区| 久久99久久久欧美国产| 美女一区二区三区在线观看| 久久精品国产精品亚洲红杏| 黄色精品一二区| 国产一区二区剧情av在线| 麻豆精品蜜桃视频网站| 美国十次综合导航| 久久99精品久久只有精品| 久久精品久久精品| 九九视频精品免费| 国产中文字幕精品| 国产一区高清在线| 国产电影精品久久禁18| 国产99久久久国产精品免费看 | 欧美日韩国产欧美日美国产精品| 欧美日韩激情一区| 91精品蜜臀在线一区尤物| 欧美一区二区美女| 欧美mv日韩mv国产网站| 久久久精品黄色| 国产精品黄色在线观看| 亚洲视频电影在线| 亚洲精品va在线观看| 亚洲午夜精品久久久久久久久| 午夜不卡av在线| 黄页视频在线91| av动漫一区二区| 国内精品久久国产| 亚洲综合社区|