Mybatis plus 配置多数据源的实现示例
记得面试时候,有面试官会问道,你们多数据源是怎么实现的呀。.......,一阵蒙蔽中,然后说道我们之前项目中,没有用到多数据源。
所幸,目前做得项目中有一个业务逻辑中,用到多个数据库数据情况,多数据源华丽上线。
一.mybatisplus
因为我们项目是springboot+mybatisplus,有些人一看,mybatis还知道对吧,mybatisplus是什么鬼,其实字面意思可以理解,就是对mybatis进行一些功能改造,一些封装升级,然后用起来特别方便。
核心功能的升级主要是以下三点:
支持通用的CRUD、代码生成器与条件构造器。
通用CRUD:定义好Mapper接口后,只需要继承BaseMapper
条件构造器:通过EntityWrapper
代码生成器:支持一系列的策略配置与全局配置,比MyBatis的代码生成更好用
二.多数据源配置开始
思路:
1、yml中配置多个数据源信息
2、通过AOP切换不同数据源
3、配合mybatisplus使用
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的地址 publicclassMybatisPlusConfig{ @Bean publicPaginationInterceptorpaginationInterceptor(){ PaginationInterceptorpaginationInterceptor=newPaginationInterceptor(); //paginationInterceptor.setLocalPage(true);//由于版本问题,有些类可能招不到这个方法,需要升级jar包 returnpaginationInterceptor; } @Bean(name="db1") @ConfigurationProperties(prefix="spring.datasource.druid.db1") publicDataSourcedb1(){ returnDruidDataSourceBuilder.create().build(); } @Bean(name="db2") @ConfigurationProperties(prefix="spring.datasource.druid.db2") publicDataSourcedb2(){ returnDruidDataSourceBuilder.create().build(); } /** *动态数据源配置 * *@return */ @Bean @Primary publicDataSourcemultipleDataSource(@Qualifier("db1")DataSourcedb1, @Qualifier("db2")DataSourcedb2){ DynamicDataSourcedynamicDataSource=newDynamicDataSource(); Map
3、DBType枚举类
packagecom.df.openapi.config.db; publicenumDBTypeEnum{ db1("db1"),db2("db2"); privateStringvalue; DBTypeEnum(Stringvalue){ this.value=value; } publicStringgetValue(){ returnvalue; } }
4、动态数据源决策
packagecom.df.openapi.config.db; importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; publicclassDynamicDataSourceextendsAbstractRoutingDataSource{ privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(DynamicDataSource.class); @Override protectedObjectdetermineCurrentLookupKey(){ Stringdatasource=DataSourceContextHolder.getDbType(); LOGGER.debug("使用数据源{}",datasource); returndatasource; } }
5、设置、获取数据源
publicclassDataSourceContextHolder{ privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(DataSourceContextHolder.class); privatestaticfinalThreadLocalcontextHolder=newThreadLocal<>();//实际上就是开启多个线程,每个线程进行初始化一个数据源 /** *设置数据源 *@paramdbTypeEnum */ publicstaticvoidsetDbType(DBTypeEnumdbTypeEnum){ contextHolder.set(dbTypeEnum.getValue()); } /** *取得当前数据源 *@return */ publicstaticStringgetDbType(){ return(String)contextHolder.get(); } /** *清除上下文数据 */ publicstaticvoidclearDbType(){ contextHolder.remove(); } }
6、AOP实现的数据源切换
@Order设置的足够小是为了让他先执行
/** *aop的实现的数据源切换
*aop切点,实现mapper类找寻,找到所属大本营以后,如db1Aspect(),则会调用
*db1()前面之前的操作,进行数据源的切换。 */ @Component @Order(value=-100) @Slf4j @Aspect publicclassDataSourceAspect{ @Pointcut("execution(*com.zwyl.bazhong.dao.mapper.db1..*.*(..))") privatevoiddb1Aspect(){ } @Pointcut("execution(*com.zwyl.bazhong.dao.mapper.db2..*.*(..))") privatevoiddb2Aspect(){ } @Before("db1Aspect()") publicvoiddb1(){ log.info("切换到db1数据源..."); DataSourceContextHolder.setDbType(DBTypeEnum.db1); } @Before("db2Aspect()") publicvoiddb2(){ log.info("切换到db2数据源..."); DataSourceContextHolder.setDbType(DBTypeEnum.db2); } }
7、mapper层结构
8、写一个service测试一下
@Service publicclassDictServiceImplimplementsIDictService{ @Resource privatePtDictMapperptDictMapper;//来自db1 @Resource privateSysDictMappersysDictMapper;//来自db2 @Override publicvoidgetById(Stringid){ PtDictdict=ptDictMapper.selectById("2bf6257fc8fe483c84c1ad7e89d632f6"); SysDictsysDict=sysDictMapper.getById("49"); System.out.println("123"); } }
9、测试结果
总结:其实整个过程可以理解成,配置多数据源xml中 ------->然后通过加载多数源到spring工厂中-------->然后创建多线程,每个数据源对应一个数据源--------->然后实际调用时候,会先通过aop匹配到某一具体数据源------------->然后实例化当前数据源
到此这篇关于Mybatisplus配置多数据源的实现示例的文章就介绍到这了,更多相关Mybatisplus多数据源内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。