Mybatis plus 配置多数据源的实现示例

记得面试时候,有面试官会问道,你们多数据源是怎么实现的呀。.......,一阵蒙蔽中,然后说道我们之前项目中,没有用到多数据源。

所幸,目前做得项目中有一个业务逻辑中,用到多个数据库数据情况,多数据源华丽上线。

一. 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);
@Override
protected 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
@Aspect
public 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层结构

8、写一个service测试一下

@Service
public 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 多数据源内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatisPlus 自定义sql语句的实现

    一.引言 Good Good Study,Day Day Up MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么那么今天说说MP怎么自定义sql语句吧. 二.配置 自定义的sql当然是写在XML文件中的啦,那么首先来定义xml文件的位置,在yml配置文件如下 mybatis-plus: # 如果是放在src/main/java目录下 classpath:/com/*/*/mapper/*Mapper.xml # 如果是放在resource目录 classpath:

  • 结合mybatis-plus实现简单不需要写sql的多表查询

    项目地址: GITHUB (本地下载) java mybatis 多表查询 简介 实现简单的实体类操作多表,  首先你的项目是使用了mybatis-plus 才可以使用 设计说明 如何关联表? 找第一张表注解为 TableId (mybatis-plus 注解)的属性名, 到每二张表找同样的属性名, 如果没找到,反过来找,如果还没找到,挨个属性找.以此类推,实现关联的前提条件是 主从表的关联例名必须一样 // user 表 @TableId private Integer userId // a

  • SpringBoot整合MybatisPlus的简单教程实现(简单整合)

    最近在研究springboot,顺便就会看看数据库连接这一块的知识 ,所以当我发现有通用Mapper和MybatisPlus这两款网络上比较火的简化mybatis开发的优秀软件之后.就都想试一下,看看哪一款比较适合自己. 先创建一个springboot的项目,可以参考我之前的文章Spring Boot 的简单教程(一) Spring Boot 项目的创建. 创建好springboot之后就需要整合mybatis和mybatis-plus了. 打开pom.xml文件,将最新的mybatis相关的包

  • Mybatis-Plus 搭建与使用入门(小结)

    Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 中文文档 :http://baomidou.oschina.io/mybatis-plus-doc/#/ 本文介绍包括 1)如何搭建 2)代码生成(controller.service.mapper.xml) 3)单表的CRUD.条件查询.分页 基类已经为你做好了 一.如何搭建 1. 首先我们创建一个 springboot 工程 --> https:/

  • Mybatis-Plus自动填充的实现示例

    在常用业务中有些属性需要配置一些默认值,MyBatis-Plus提供了实现此功能的插件.在这里修改user表添加 create_time 字段和 update_time 字段,在User类中添加对应属性. 1.为需要自动填充的属性添加注解 @TableField 提供了4种自动填充策略:DEFAULT,默认不处理.INSERT,插入填充字段.UPDATE,更新填充字段.INSERT_UPDATE,插入和更新填充字段. @Data public class User { private Long

  • spring boot整合mybatis+mybatis-plus的示例代码

    Spring boot对于我来说是一个刚接触的新东西,学习过程中,发现这东西还是很容易上手的,Spring boot没配置时会默认使用Spring data jpa,这东西可以说一个极简洁的工具,可是我还是比较喜欢用mybatis,工具是没有最好的,只有这合适自己的. 说到mybatis,最近有一个很好用的工具--------mybatis-Plus(官网),现在更新的版本是2.1.2,这里使用的也是这个版本.我比较喜欢的功能是代码生成器,条件构造器,这样就可以更容易的去开发了. mybatis

  • Mybatis-Plus 多表联查分页的实现代码

    上一节,简单讲述了 Mybatis-Plus 搭建与使用入门,这一节,简单讲一下如何使用 MP 实现多表分页. 分析 使用的工程,依旧是 spring-boot,关于分页,官网给出了一个单表的demo,其实多表分页实现原理相同,都是通过 mybatis 的拦截器 (拦截器做了什么?他会在你的 sql 执行之前,为你做一些事情,例如分页,我们使用了 MP 不用关心 limit,拦截器为我们拼接.我们也不用关心总条数,拦截器获取到我们 sql 后,拼接 select count(*) 为我们查询总条

  • SpringBoot整合MyBatisPlus配置动态数据源的方法

    MybatisPlus特性 •无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 •损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 •强大的 CRUD 操作:内置通用 Mapper.通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 •支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 •支持多种数据库:支持 MySQL.MariaDB.Ora

  • Mybatis plus 配置多数据源的实现示例

    记得面试时候,有面试官会问道,你们多数据源是怎么实现的呀........,一阵蒙蔽中,然后说道我们之前项目中,没有用到多数据源. 所幸,目前做得项目中有一个业务逻辑中,用到多个数据库数据情况,多数据源华丽上线. 一. mybatis plus 因为我们项目是springboot+mybatis plus,有些人一看,mybatis还知道对吧,mybatis plus是什么鬼,其实字面意思可以理解,就是对mybatis进行一些功能改造,一些封装升级,然后用起来特别方便. 核心功能的升级主要是以下三

  • 通过springboot+mybatis+druid配置动态数据源

    一.建数据库和表 1.数据库demo1放一张user表 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NU

  • springboot mybatis druid配置多数据源教程

    目录 1.项目代码结构 2.导入基本依赖 3.配置多数据源 4.配置类 5.启动类 6.测试使用的表 7.测试表对应的实体类 8.持久层:dao层接口 1.项目代码结构 2.导入基本依赖 记得需要导入mysql驱动mysql-connector-java <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-s

  • SpringBoot Mybatis如何配置多数据源并分包

    看了不少网上关于多数据源的配置,大致可分为两类,分包方式和通过切面方式: 样例已上传至github:https://github.com/dadachao/multids 第一个子项目ds01即时使用分包方式完成多数据源配置. 总结项目中出现的问题和解决办法: 数据库的连接信息: 连接信息是写在db.properties文件中的: #数据库ds1 spring.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver spring.dat

  • 详解Springboot之整合JDBCTemplate配置多数据源

    一.前言 现在在我们的项目中,使用多数据源已经是很常见的,下面,这里总结一下springboot整合jdbcTemplate配置多数据源的代码示例,以方便以后直接使用. 二.配置文件 spring: datasource: datasourceone: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/eesy?serverTimezone=UTC&characterEncoding=utf8&u

  • SpringBoot整合Mybatis Plus多数据源的实现示例

    目录 导读 添加依赖 application.properties 2种方式创建DataSource Master配置,使用druid连接池 Slave配置 启动类 演示 导读 有一个这样子的需求,线上正在跑的业务,由于业务发展需要,需重新开发一套新系统,等新系统开发完成后,需要无缝对接切换,当初具体设计见草图. 添加依赖 <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <

  • springmvc mybatis集成配置示例

    简单之美,springmvc,mybatis就是一个很好的简单集成方案,能够满足一般的项目需求.闲暇时间把项目配置文件共享出来,供大家参看: 1.首先我们来看下依赖的pom: <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.ve

  • 详解SpringBoot和Mybatis配置多数据源

    目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL.在SpringBoot中,配置多数据源的方式十分便捷, 下面开始上代码: 在pom.xml文件中需要添加一些依赖 <!-- Spring Boot Mybatis 依赖 --> <dependency> <groupId>org.mybatis.spring.b

  • 详解Spring Boot整合Mybatis实现 Druid多数据源配置

    一.多数据源的应用场景 目前,业界流行的数据操作框架是 Mybatis,那 Druid 是什么呢? Druid 是 Java 的数据库连接池组件.Druid 能够提供强大的监控和扩展功能.比如可以监控 SQL ,在监控业务可以查询慢查询 SQL 列表等.Druid 核心主要包括三部分: 1. DruidDriver 代理 Driver,能够提供基于 Filter-Chain 模式的插件体系. 2. DruidDataSource 高效可管理的数据库连接池 3. SQLParser 当业务数据量达

  • Spring Boot + Mybatis多数据源和动态数据源配置方法

    网上的文章基本上都是只有多数据源或只有动态数据源,而最近的项目需要同时使用两种方式,记录一下配置方法供大家参考. 应用场景 项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库. 多数据源 首先要将spring boot自带的DataSourceAutoConfiguration禁掉,因为它会读取application.properties文件的spring.datasource.*属性并自动配置单数据源.在@SpringBootApplication注解中添加ex

随机推荐