电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Mybatis plus 配置多數(shù)據(jù)源的實現(xiàn)示例

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

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

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

一. mybatis plus

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

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

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

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

二.多數(shù)據(jù)源配置開始

思路:

1、yml中配置多個數(shù)據(jù)源信息2、通過AOP切換不同數(shù)據(jù)源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、啟動多個數(shù)據(jù)源

@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(); } /** * 動態(tài)數(shù)據(jù)源配置 * * @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); // 程序默認數(shù)據(jù)源,這個要根據(jù)程序調用數(shù)據(jù)源頻次,經常把常調用的數(shù)據(jù)源作為默認 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、動態(tài)數(shù)據(jù)源決策

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('使用數(shù)據(jù)源 {}', datasource); return datasource;}}

5、設置、獲取數(shù)據(jù)源

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

6、AOP實現(xiàn)的數(shù)據(jù)源切換

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

/** * aop的實現(xiàn)的數(shù)據(jù)源切換<br> * aop切點,實現(xiàn)mapper類找尋,找到所屬大本營以后,如db1Aspect(),則會調用<br> * db1()前面之前的操作,進行數(shù)據(jù)源的切換。 */@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 數(shù)據(jù)源...'); DataSourceContextHolder.setDbType(DBTypeEnum.db1); } @Before('db2Aspect()') public void db2() { log.info('切換到db2 數(shù)據(jù)源...'); DataSourceContextHolder.setDbType(DBTypeEnum.db2); }}

7、mapper層結構

Mybatis plus 配置多數(shù)據(jù)源的實現(xiàn)示例

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、測試結果

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

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

相關文章:
主站蜘蛛池模板: 京港视通报道-质量走进大江南北-京港视通传媒[北京]有限公司 | 菏泽知彼网络科技有限公司| 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 热镀锌槽钢|角钢|工字钢|圆钢|H型钢|扁钢|花纹板-天津千百顺钢铁贸易有限公司 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 真空乳化机-灌装封尾机-首页-温州精灌| 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 铸钢件厂家-铸钢齿轮-减速机厂家-淄博凯振机械有限公司 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 深圳市索富通实业有限公司-可燃气体报警器 | 可燃气体探测器 | 气体检测仪 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 中国产业发展研究网 - 提供行业研究报告 可行性研究报告 投资咨询 市场调研服务 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 智能案卷柜_卷宗柜_钥匙柜_文件流转柜_装备柜_浙江福源智能科技有限公司 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 陕西鹏展科技有限公司| 分轨 | 上传文件,即刻分离人声和伴奏 | 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 真空上料机(一种真空输送机)-百科 | 山东成考网-山东成人高考网| 【连江县榕彩涂料有限公司】官方网站 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 智能交通网_智能交通系统_ITS_交通监控_卫星导航_智能交通行业 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 运动木地板价格,篮球馆体育运动木地板生产厂家_欧氏地板 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 真空上料机(一种真空输送机)-百科|