springboot+druid+mybatis plus的多数据源配置
思路
- yml中配置多个数据源信息
- 通过AOP切换不同数据源
- 配合mybatis plus使用
POM依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- <!-- AOP依赖 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-aop</artifactId>
- </dependency>
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>2.0.0</version>
- </dependency>
- <!-- MyBatisPlus -->
- <dependency>
- <groupId>com.baomidou</groupId>
- <artifactId>mybatis-plus-boot-starter</artifactId>
- <version>3.1.0</version>
- </dependency>
- <!--Mysql-->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.6</version>
- <scope>runtime</scope>
- </dependency>
- <!-- Druid依赖 -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid-spring-boot-starter</artifactId>
- <version>1.1.10</version>
- </dependency>
YML配置
- spring:
- aop:
- proxy-target-class: true
- auto: true
- datasource:
- druid:
- es:
- url: jdbc:mysql://192.168.21.181:3306/jarvis
- username: root
- password: 123456
- type: com.alibaba.druid.pool.DruidDataSource
- driver-class-name: com.mysql.jdbc.Driver
- initialSize: 5
- minIdle: 5
- maxActive: 20
- wx:
- initialSize: 5
- minIdle: 5
- maxActive: 20
- type: com.alibaba.druid.pool.DruidDataSource
- driver-class-name: com.mysql.jdbc.Driver
- username: root
- password: 123456
- url: jdbc:mysql://192.168.21.181:3306/jarvis_wx
启动加载多个数据源
- package com.jarvis.config;
- import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
- import com.baomidou.mybatisplus.core.MybatisConfiguration;
- import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
- import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
- import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
- import org.apache.ibatis.plugin.Interceptor;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.type.JdbcType;
- import org.mybatis.spring.annotation.MapperScan;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.Primary;
- import org.springframework.transaction.annotation.EnableTransactionManagement;
- import javax.sql.DataSource;
- import java.util.HashMap;
- import java.util.Map;
- @Configuration
- @EnableTransactionManagement
- @MapperScan("com.jarvis.task.*.mapper")
- public class MybatisPlusConfig {
- /***
- * plus 的性能优化
- */
- @Bean
- public PerformanceInterceptor performanceInterceptor() {
- PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
- /* <!-- SQL 执行性能分析,开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长 --> */
- //performanceInterceptor.setMaxTime(1000);
- /* <!--SQL是否格式化 默认false--> */
- performanceInterceptor.setFormat(false);
- return performanceInterceptor;
- }
- /**
- * mybatis-plus 分页插件
- */
- @Bean
- public PaginationInterceptor paginationInterceptor() {
- PaginationInterceptor page = new PaginationInterceptor();
- page.setDialectType("mysql");
- return page;
- }
- @Bean(name = "esDb")
- @ConfigurationProperties(prefix = "spring.datasource.druid.es" )
- public DataSource esDb () {
- return DruidDataSourceBuilder.create().build();
- }
- @Bean(name = "wxDb")
- @ConfigurationProperties(prefix = "spring.datasource.druid.wx" )
- public DataSource wxDb () {
- return DruidDataSourceBuilder.create().build();
- }
- /**
- * 动态数据源配置
- * @return
- */
- @Bean
- @Primary
- public DataSource multipleDataSource (@Qualifier("esDb") DataSource esDb,
- @Qualifier("wxDb") DataSource wxDb ) {
- DynamicDataSource dynamicDataSource = new DynamicDataSource();
- Map< Object, Object > targetDataSources = new HashMap<>(2);
- targetDataSources.put(DBTypeEnum.ES.getValue(), esDb );
- targetDataSources.put(DBTypeEnum.WX.getValue(), wxDb);
- dynamicDataSource.setTargetDataSources(targetDataSources);
- dynamicDataSource.setDefaultTargetDataSource(esDb);
- return dynamicDataSource;
- }
- @Bean("sqlSessionFactory")
- public SqlSessionFactory sqlSessionFactory() throws Exception {
- MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
- sqlSessionFactory.setDataSource(multipleDataSource(esDb(),wxDb()));
- //sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*/*Mapper.xml"));
- MybatisConfiguration configuration = new MybatisConfiguration();
- //configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
- configuration.setJdbcTypeForNull(JdbcType.NULL);
- configuration.setMapUnderscoreToCamelCase(true);
- configuration.setCacheEnabled(false);
- sqlSessionFactory.setConfiguration(configuration);
- sqlSessionFactory.setPlugins(new Interceptor[]{ //PerformanceInterceptor(),OptimisticLockerInterceptor()
- paginationInterceptor() //添加分页功能
- });
- // sqlSessionFactory.setGlobalConfig(globalConfiguration());
- 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;
- // }
- }
DBType枚举类
- public enum DBTypeEnum {
- ES("es"), WX("wx");
- private String value;
- DBTypeEnum(String value) {
- this.value = value;
- }
- public String getValue() {
- return value;
- }
- }
动态数据源决策
- import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
- public class DynamicDataSource extends AbstractRoutingDataSource {
- /**
- * 取得当前使用哪个数据源
- * @return
- */
- @Override
- protected Object determineCurrentLookupKey() {
- return DbContextHolder.getDbType();
- }
- }
设置、获取数据源
- public class DbContextHolder {
- 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();
- }
- }
AOP实现的数据源切换
- import lombok.extern.slf4j.Slf4j;
- import org.aspectj.lang.annotation.*;
- import org.springframework.core.annotation.Order;
- import org.springframework.stereotype.Component;
- @Component
- @Aspect
- @Order(-100) //这是为了保证AOP在事务注解之前生效,Order的值越小,优先级越高
- @Slf4j
- public class DataSourceSwitchAspect {
- @Pointcut("execution(* com.jarvis.task.db2es.mapper..*.*(..))")
- private void jarvisAspect() {
- }
- @Pointcut("execution(* com.jarvis.task.dt2db.mapper..*.*(..))")
- private void jarvisWxAspect() {
- }
- @Before("jarvisAspect()")
- public void jarvisDb() {
- log.info("切换到ES 数据源...");
- DbContextHolder.setDbType(DBTypeEnum.ES);
- }
- @Before("jarvisWxAspect()")
- public void jarvisWxDb () {
- log.info("切换到WX 数据源...");
- DbContextHolder.setDbType(DBTypeEnum.WX);
- }
- }
mapper层结构
参考
https://www.jianshu.com/p/ff5af6c59365?utm_source=oschina-app
springboot+druid+mybatis plus的多数据源配置的更多相关文章
- 2019-04-09 SpringBoot+Druid+MyBatis+Atomikos 的多数据源配置
前面部分是网上找的,我按照网上写的把自己搭建的过程展示一次 1.引入依赖 目前项目本来使用到了Mybatis plus(在自己的Mapper接口中继承BaseMapper获得基本的CRUD,而不需要增 ...
- Spring Boot 入门系列(二十三)整合Mybatis,实现多数据源配置!
d之前介绍了Spring Boot 整合mybatis 使用注解方式配置的方式实现增删改查以及一些复杂自定义的sql 语句 .想必大家对spring boot 项目中,如何使用mybatis 有了一定 ...
- springboot+druid+mybatis
pom.xml <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId> ...
- springboot v2.0.3版本多数据源配置
本篇分享的是springboot多数据源配置,在从springboot v1.5版本升级到v2.0.3时,发现之前写的多数据源的方式不可用了,捕获错误信息如: 异常:jdbcUrl is requir ...
- Spring Boot + Mybatis多数据源和动态数据源配置
文章转自 https://blog.csdn.net/neosmith/article/details/61202084 网上的文章基本上都是只有多数据源或只有动态数据源,而最近的项目需要同时使用两种 ...
- spring+mybatis最简多数据源配置
作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权所有,欢迎保留原文链接进行转载:) 说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持 ...
- springboot系列十、springboot整合redis、多redis数据源配置
一.简介 Redis 的数据库的整合在 java 里面提供的官方工具包:jedis,所以即便你现在使用的是 SpringBoot,那么也继续使用此开发包. 二.redidTemplate操作 在 Sp ...
- SSM框架、Druid连接池实现多数据源配置(已上线使用)
总体大概流程: 1.配置数据源.账密(账密一致,文章不多阐述) driverClassName = com.mysql.jdbc.Driver validationQuery = SELECT 1 ...
- springboot+Druid+mybatis整合
一.添加Druid.MySQL连接池.mybatis依赖 <!--整合Druid--> <dependency> <groupId>com.alibaba</ ...
随机推荐
- ubuntu docker中crontab任务不执行的问题
problem of task of crontab in docker of ubuntu do not working! 由于各种原因,要在Ubuntu docker上部署crontab任务,如 ...
- Java面试题之“==”和“equals()”方法的区别?
一.“== ”:运算符 1.可以使用在基本数据类型变量和引用数据类型变量中. 2.如果比较的是基本数据类型变量:比较的是两个变量保存的数据是否相等.(不一定类型要相同) 3.如果比较的是引用数据类型变 ...
- LwIP与IPv6
2.0.0中才开始支持IPv6,在此版本中改写了SNMP,但还没有IPv6的统计量.目前最新版本是2.0.2,其中SNMP也没有IPv6统计量(哪些?与IP的统计量有何区别?) 1.4.1中虽然有ip ...
- docker-enter 安装
github : https://github.com/sequenceiq/docker-enter [root@localhost ~]# docker run --rm -v /usr/loca ...
- 大数四则运算之减法运算-----c语言版
/* 分三种情况: 1.减数长度大于被减数 交换减数与被减数,输出负号,方便减 2.减数长度等于被减数(分三种情况) a.减数大于被减数,类似1情况1 b.减数等于被减数,两数相等,直接输出0,完成. ...
- hexo--定制开发
新建页面 hexo new page "新建博文章的名称" 这时会在工程的source目录下新建about目录,里面新建index.md 在主题的_configy.yml中配置新页 ...
- 记网站部署中一个奇葩BUG
网页中引用的文件名不要带 adv 等 近日在写好一个网页后就把他部署到apache上测试,结果用chrome访问时有个背景图片总显示不出来,但是用firefox等却一切正常, 关键是我用windows ...
- Redis-位图
关于位图,可能大家不太熟悉, 那么位图能干啥呢?位图的内容其实就是普通的字符串,也就是byte数组,我们都知道 byte 8 位无符号整数 0 到 255 说个场景.比如你处理一些业务时候,往往会存在 ...
- 【React Native】在网页中打开Android应用程序
React Native官方提供Linking库用于调起其他app或者本机应用.Linking的主要属性和方法有: 属性与方法 canOpenURL(url); 判断设备上是否有已经安装相应应用或可以 ...
- Android中动态改变Listview中字体的颜色
效果如下: 账目显示用的是Listview,要实现的功能为使其根据所在Item是“收入”还是“支出”来把数字设置成绿色或红色 方法是自定义适配器,并重写其中getView()函数,实现如下: //自定 ...