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

您的位置:首頁技術文章
文章詳情頁

Mybatis plus 配置多數據源的實現示例

瀏覽:171日期:2023-10-23 09:06:13

記得面試時候,有面試官會問道,你們多數據源是怎么實現的呀。.......,一陣蒙蔽中,然后說道我們之前項目中,沒有用到多數據源。

所幸,目前做得項目中有一個業務邏輯中,用到多個數據庫數據情況,多數據源華麗上線。

一. mybatis plus

因為我們項目是springboot+mybatis plus,有些人一看,mybatis還知道對吧,mybatis plus是什么鬼,其實字面意思可以理解,就是對mybatis進行一些功能改造,一些封裝升級,然后用起來特別方便。

核心功能的升級主要是以下三點:

支持通用的 CRUD、代碼生成器與條件構造器。

通用 CRUD:定義好 Mapper 接口后,只需要繼承 BaseMapper<T> 接口即可獲得通用的增刪改查功能,無需編寫任何接口方法與配置文件條件構造器:通過 EntityWrapper<T> (實體包裝類),可以用于拼接 SQL 語句,并且支持排序、分組查詢等復雜的 SQL代碼生成器:支持一系列的策略配置與全局配置,比 MyBatis 的代碼生成更好用

二.多數據源配置開始

思路:

1、yml中配置多個數據源信息2、通過AOP切換不同數據源3、配合mybatis plus使用

1、yml配置

spring: aop: proxy-target-class: true auto: true datasource: druid: db1: url: jdbc:mysql://localhost:3306/eboot username: root password: root driver-class-name: com.mysql.jdbc.Driver initialSize: 5 minIdle: 5 maxActive: 20 db2: url: jdbc:oracle:thin:@192.168.136.222:ORCL username: sa password: sa123456 driver-class-name: oracle.jdbc.OracleDriver initialSize: 5 minIdle: 5 maxActive: 20

2、啟動多個數據源

@EnableTransactionManagement //開啟事務@Configuration //spring中常用到注解,與xml配置相對立。是兩種加載bean方式@MapperScan('com.df.openapi.**.mapper.db*') // 掃描mapperdao的地址public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// paginationInterceptor.setLocalPage(true); // 由于版本問題,有些類可能招不到這個方法,需要升級jar包 return paginationInterceptor; } @Bean(name = 'db1') @ConfigurationProperties(prefix = 'spring.datasource.druid.db1') public DataSource db1() { return DruidDataSourceBuilder.create().build(); } @Bean(name = 'db2') @ConfigurationProperties(prefix = 'spring.datasource.druid.db2') public DataSource db2() { return DruidDataSourceBuilder.create().build(); } /** * 動態數據源配置 * * @return */ @Bean @Primary public DataSource multipleDataSource(@Qualifier('db1') DataSource db1, @Qualifier('db2') DataSource db2) { DynamicDataSource dynamicDataSource = new DynamicDataSource(); Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DBTypeEnum.db1.getValue(), db1); targetDataSources.put(DBTypeEnum.db2.getValue(), db2); dynamicDataSource.setTargetDataSources(targetDataSources); dynamicDataSource.setDefaultTargetDataSource(db2); // 程序默認數據源,這個要根據程序調用數據源頻次,經常把常調用的數據源作為默認 return dynamicDataSource; } @Bean('sqlSessionFactory') public SqlSessionFactory sqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); sqlSessionFactory.setDataSource(multipleDataSource(db1(), db2())); MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setJdbcTypeForNull(JdbcType.NULL); configuration.setMapUnderscoreToCamelCase(true); configuration.setCacheEnabled(false); sqlSessionFactory.setConfiguration(configuration); //PerformanceInterceptor(),OptimisticLockerInterceptor() //添加分頁功能 sqlSessionFactory.setPlugins(new Interceptor[]{paginationInterceptor() });// sqlSessionFactory.setGlobalConfig(globalConfiguration()); //注釋掉全局配置,因為在xml中讀取就是全局配置 return sqlSessionFactory.getObject(); } /* @Bean public GlobalConfiguration globalConfiguration() { GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector()); conf.setLogicDeleteValue('-1'); conf.setLogicNotDeleteValue('1'); conf.setIdType(0); conf.setMetaObjectHandler(new MyMetaObjectHandler()); conf.setDbColumnUnderline(true); conf.setRefresh(true); return conf; }*/}

3、DBType枚舉類

package com.df.openapi.config.db; public enum DBTypeEnum { db1('db1'), db2('db2'); private String value; DBTypeEnum(String value) { this.value = value; } public String getValue() { return value; }}

4、動態數據源決策

package com.df.openapi.config.db; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource {private static final Logger LOGGER = LoggerFactory.getLogger(DynamicDataSource.class);@Overrideprotected Object determineCurrentLookupKey() { String datasource = DataSourceContextHolder.getDbType(); LOGGER.debug('使用數據源 {}', datasource); return datasource;}}

5、設置、獲取數據源

public class DataSourceContextHolder { private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceContextHolder.class); private static final ThreadLocal contextHolder = new ThreadLocal<>(); //實際上就是開啟多個線程,每個線程進行初始化一個數據源 /** * 設置數據源 * @param dbTypeEnum */ public static void setDbType(DBTypeEnum dbTypeEnum) { contextHolder.set(dbTypeEnum.getValue()); } /** * 取得當前數據源 * @return */ public static String getDbType() { return (String) contextHolder.get(); } /** * 清除上下文數據 */ public static void clearDbType() { contextHolder.remove(); }}

6、AOP實現的數據源切換

@Order設置的足夠小是為了讓他先執行

/** * aop的實現的數據源切換<br> * aop切點,實現mapper類找尋,找到所屬大本營以后,如db1Aspect(),則會調用<br> * db1()前面之前的操作,進行數據源的切換。 */@Component@Order(value = -100)@Slf4j@Aspectpublic class DataSourceAspect { @Pointcut('execution(* com.zwyl.bazhong.dao.mapper.db1..*.*(..))') private void db1Aspect() { } @Pointcut('execution(* com.zwyl.bazhong.dao.mapper.db2..*.*(..))') private void db2Aspect() { } @Before('db1Aspect()') public void db1() { log.info('切換到db1 數據源...'); DataSourceContextHolder.setDbType(DBTypeEnum.db1); } @Before('db2Aspect()') public void db2() { log.info('切換到db2 數據源...'); DataSourceContextHolder.setDbType(DBTypeEnum.db2); }}

7、mapper層結構

Mybatis plus 配置多數據源的實現示例

8、寫一個service測試一下

@Servicepublic class DictServiceImpl implements IDictService { @Resource private PtDictMapper ptDictMapper; //來自db1 @Resource private SysDictMapper sysDictMapper; // 來自db2 @Override public void getById(String id) { PtDict dict = ptDictMapper.selectById('2bf6257fc8fe483c84c1ad7e89d632f6'); SysDict sysDict = sysDictMapper.getById('49'); System.out.println('123'); }}

9、測試結果

總結: 其實整個過程可以理解成,配置多數據源 xml中 -------> 然后通過加載多數源到spring工廠中-------->然后創建多線程,每個數據源對應一個數據源--------->然后實際調用時候,會先通過aop匹配到某一具體數據源------------->然后實例化當前數據源

到此這篇關于Mybatis plus 配置多數據源的實現示例的文章就介紹到這了,更多相關Mybatis plus 多數據源內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线日韩中文| 日本欧美韩国一区三区| 国产美女久久| 国产日产精品一区二区三区四区的观看方式 | 在线 亚洲欧美在线综合一区| 激情久久久久久久| 91精品观看| 在线中文字幕播放| 欧美影院三区| 亚洲在线久久| 国产精品主播| 精品黄色一级片| 91精品国产福利在线观看麻豆| 影院欧美亚洲| 欧美亚洲一区二区三区| 久久精品国产精品亚洲毛片| 日韩高清欧美| 每日更新成人在线视频| 欧美一区成人| 国产亚洲一区二区手机在线观看 | 国产高清精品二区| av高清不卡| 蜜臀国产一区二区三区在线播放| 亚洲精品伊人| 麻豆国产精品一区二区三区| 色婷婷精品视频| 日本中文字幕视频一区| 国产精品久久观看| 美国欧美日韩国产在线播放| 欧美久久久网站| 国产精品nxnn| 99热精品久久| 日韩精品一区二区三区中文字幕| 国产一区二区三区亚洲| 亚洲专区欧美专区| 国产精品宾馆| 99精品99| 精品免费av| 另类激情亚洲| 亚洲天堂资源| 日韩精品1区2区3区| 丝袜av一区| 美女视频黄免费的久久| 亚洲一区二区三区四区五区午夜| 精品网站999| 欧美va天堂在线| 国产精品一区二区精品 | 中文字幕av亚洲精品一部二部| 麻豆国产91在线播放| aⅴ色国产欧美| 精品福利久久久| 日产欧产美韩系列久久99| 欧美韩日一区| 久久国内精品视频| 亚洲精品小说| 四季av一区二区凹凸精品| 亚洲精品进入| 精品免费av在线| 国产精品亚洲欧美日韩一区在线| 亚洲一区中文| 三级精品视频| 高清一区二区三区av| 日韩高清在线不卡| 亚洲一区国产一区| 亚洲第一精品影视| 成人污污视频| 欧美国产日韩电影| 日韩欧美在线精品| 模特精品在线| 国产精品88久久久久久| 精品久久免费| 国产精品极品| 中文字幕一区二区av| 日韩免费小视频| 精品国产成人| 久久亚洲国产精品尤物| 欧美日韩1区| 午夜亚洲福利| 免费久久99精品国产自在现线| 免费污视频在线一区| 91精品麻豆| 日韩精品1区2区3区| 免费看欧美美女黄的网站| 亚洲国产一区二区在线观看| 日韩欧美少妇| 99久久亚洲精品| 久久精品国产68国产精品亚洲| 久久久久伊人| 欧美激情久久久久久久久久久| 亚洲三级毛片| 亚洲免费毛片| 亚洲欧洲av| 日韩欧美另类中文字幕| 日韩精品久久久久久| 日韩av中文字幕一区二区| 日产欧产美韩系列久久99| 中文字幕一区二区三区在线视频| 男人天堂欧美日韩| 蜜臀av一区二区三区| 首页国产欧美久久| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲一区二区免费在线观看| 三级欧美韩日大片在线看| 亚洲精品1区2区| 美国三级日本三级久久99| 在线观看一区| 日韩精品成人在线观看| 日韩av一区二区在线影视| 欧美日本不卡高清| 欧美国产另类| 国产精品成久久久久| 在线精品亚洲欧美日韩国产| 日本а中文在线天堂| 日韩伦理在线一区| 99视频精品全部免费在线视频| 日韩欧美少妇| 婷婷中文字幕一区| 99久久久久国产精品| 国产在线成人| 亚洲免费成人av在线| 日韩精品三级| 国产一区二区三区黄网站 | 最新国产精品| 国产精品一区二区美女视频免费看 | 图片区亚洲欧美小说区| 亚洲少妇一区| 欧美日韩伊人| 福利一区在线| 亚洲免费网址| 欧美另类中文字幕 | 亚洲理论在线| 久久精品国产99| 精品99久久| 99在线精品免费视频九九视| 日韩中文字幕1| 国产精品成人一区二区网站软件| 精品三级国产| 亚洲高清影视| 国产日产精品一区二区三区四区的观看方式| 国产精品毛片视频| 91精品一区二区三区综合| 国产午夜久久| 国产精品大片| 国产精品美女久久久浪潮软件| 国产精品久久久久久久久久久久久久久| 在线天堂资源www在线污| 丝袜脚交一区二区| 欧美国产亚洲精品| 日韩午夜高潮| 国产精品免费精品自在线观看| 亚洲天堂一区二区| 日韩一二三区在线观看| 美女一区网站| 日韩精品亚洲一区二区三区免费| 三上悠亚国产精品一区二区三区 | 麻豆精品在线| 国产免费成人| 日韩国产一区| 国产欧美欧美| 视频在线观看一区| 日韩不卡免费高清视频| 少妇高潮一区二区三区99| 国产超碰精品| 另类综合日韩欧美亚洲| 视频国产精品| 亚洲免费婷婷| 久久久蜜桃一区二区人| 国产精品亚洲欧美一级在线| 蜜桃伊人久久| 国产91精品对白在线播放| 国产欧美日韩一区二区三区在线| 亚洲主播在线| 久久人人精品| 精品一区二区三区的国产在线观看 | 日本欧洲一区二区| 樱桃视频成人在线观看| 欧美色综合网| 综合国产视频| 黄色亚洲大片免费在线观看| yellow在线观看网址| 国产精区一区二区| 在线一区二区三区视频| 国内激情久久| 欧美日韩视频免费观看| 麻豆一区二区99久久久久| 日韩综合小视频| 国产精品美女| 黄色在线一区| 亚洲一级二级| 麻豆视频在线看| 免费亚洲一区| 国产精品观看| 国产精品一区二区免费福利视频| 亚洲人www| 日本欧美在线看| 亚洲欧美久久久| 午夜精品一区二区三区国产| 久久国产直播| 亚洲精品一级二级| 日韩中文首页|