Mybatis-plus如何快速实现动态数据源切换?

1 背景

通常一个系统只需要连接一个数据库就可以了。但是在企业应用的开发中往往会和其他子系统交互,特别是对于一些数据实时性要求比较高的数据,我们就需要做实时连接查询,而不是做同步。这个时候就需要用到多数据源。 举个简单的例子某企业要做订单网上订单系统这里面就可以涉及到多个子系统的连接,比如:产品主数据的数据源,项目管理系统的数据源(项目可以产品订单)等多个不同数据库类似的数据源,他们可能是ORACLE,SQL SERVER,MYSQL等多种混合数据源。

2 多数据源概述

基于以上的背景,就会选择使用多个数据源,一个数据源用于读 一个数据源用于写。或者不同的数据源混合使用。他的基本思想其实就是AOP。我们可以通过AOP的思想实现 动态数据源切换,通过这个AOP思想可适用于多种场景、纯粹多库、读写分离、一主多从、混合模式等。

动态数据源能进行自动切换的核心就是spring底层的AbstractRoutingDataSource进行数据源的路由,只要继承了这个类均可看作是一个数据源的实现。主要实现方法是 determineCurrentLookupkey(),该方法只需要返回数据源实例名称

3 mybatisplus多数据源

我们在项目中用mybatisplus的使用用得比较多,这个动态数据源切换需要实现的话,比较麻烦,如果有现成的框架使用则最好不过了。恰好mybatiplus就能实现。文档地址如下:

https://baomidou.com/pages/a61e1b/#%E6%96%87%E6%A1%A3-documentation https://www.kancloud.cn/tracy5546/dynamic-datasource/22646114 使用4.1 介绍

dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。

特性:

支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库敏感配置信息 加密 ENC()。支持每个数据库独立初始化表结构schema和数据库database。支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。支持 自定义注解 ,需继承DS(3.2.0+)。提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。提供 自定义数据源来源 方案(如全从数据库加载)。提供项目启动后 动态增加移除数据源 方案。提供Mybatis环境下的 纯读写分离 方案。提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。提供 **基于seata的分布式事务方案。提供 本地多数据源事务方案。4.2 约定本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。方法上的注解优先于类上注解。DS支持继承抽象类上的DS,暂不支持继承接口上的DS。4.3 使用4.3.1 准备数据库 docker run –name mysq -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7

创建2个数据库

create database test1; create database test2; use test2; — auto-generated definition create table tb_user ( id int auto_increment primary key, name varchar(200) null ); insert into tb_user values(1,“wangwu”); use test1; — auto-generated definition create table tb_user ( id int auto_increment primary key, name varchar(200) null ); insert into tb_user values(1,“zhangsan”);

一个作为主库 一个作为从库。

4.3.2 springboot创建工程

添加依赖:

<?xml version=”1.0″ encoding=”UTF-8″?> <project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”> <modelVersion>4.0.0</modelVersion> <groupId>com.itheima</groupId> <artifactId>dynamic</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.9.RELEASE</version> <relativePath/> <!– lookup parent from repository –> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency> </dependencies> </project>

启动类:

package com.itheima; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DynamicApplication { public static void main(String[] args) { SpringApplication.run(DynamicApplication.class,args); } } 4.3.3 配置ymlspring: datasource: dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: url: jdbc:mysql://192.168.211.253:3306/test1 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置 slave_1: url: jdbc:mysql://192.168.211.253:3306/test2 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver #……省略 #以上会配置一个默认库master,一个组slave下有两个子库slave_14.3.4 使用注解来切换数据源

使用 @DS 切换数据源,使用方式如下:

@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解

注解

结果

没有@DS

默认数据源

@DS(“dsName”)

dsName可以为组名也可以为具体某个库的名称

例如:

@Service @DS(“slave”) public class UserServiceImpl implements UserService { @Autowired private JdbcTemplate jdbcTemplate; public List selectAll() { return jdbcTemplate.queryForList(“select * from user”); } @Override @DS(“slave_1”) public List selectByCondition() { return jdbcTemplate.queryForList(“select * from user where age >10”); } }4.3.5 创建CSD

po:

package com.itheima.po; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName(“tb_user”) public class User { @TableId(type = IdType.AUTO) private Integer id; @TableField(“name”) private String name; }

controller

package com.itheima.controller; import com.itheima.po.User; import com.itheima.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(“/user”) public class UserController { @Autowired private UserService userService; @GetMapping(“/{id}”) public User get(@PathVariable(name=”id”)Integer id){ return userService.getById(id); } }

service

public interface UserService { User getById(Integer id); } package com.itheima.service.impl; import com.baomidou.dynamic.datasource.annotation.DS; import com.itheima.dao.UserDao; import com.itheima.po.User; import com.itheima.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service @DS(“slave_1”) public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User getById(Integer id) { return userDao.selectById(id); } }

注意:如上:DS注解用于指定使用哪一个数据源。

dao

package com.itheima.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.itheima.po.User; public interface UserDao extends BaseMapper<User> { }

启动类:

@SpringBootApplication @MapperScan(basePackages = “com.itheima.dao”) public class DynamicApplication { public static void main(String[] args) { SpringApplication.run(DynamicApplication.class,args); } }4.3.6测试当使用@DS注解指定master的时候:@Service @DS(“master”) public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User getById(Integer id) { return userDao.selectById(id); } }

重启项目,浏览器发送请求:

http://localhost:8080/user/1

得到结果:

{“id”:1,“name”:“zhangsan”}当使用@DS注解指定slave_1的时候@Service @DS(“slave_1”) public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User getById(Integer id) { return userDao.selectById(id); } }

重启项目,浏览器发送请求:

http://localhost:8080/user/1

得到结果:

{“id”:1,“name”:“wangwu”}

测试成功。

5 总结

使用mybatisplus的动态数据源切换 非常方便,只需添加依赖,并在yaml中配置数据源的名称 和地址,并在service的实现类中使用注解来指定 实现切换即可。下一章节我们来看看如何使用AOP来实现不需要修改代码就能动态切换数据源。

添加依赖添加yaml配置在业务方法上或者业务类上添加@DS注解

免责声明:文章内容来自互联网,本站仅作为分享,不对其真实性负责,如有侵权等情况,请与本站联系删除。
转载请注明出处:Mybatis-plus如何快速实现动态数据源切换? https://www.dachanpin.com/a/cyfx/11443.html

(0)
上一篇 2023-05-12 03:19:11
下一篇 2023-05-12 03:20:50

相关推荐

  • LOL刀妹重做符文怎么选择 2018刀妹暴力符文推荐

      刀妹需要攻速,一个突进型的英雄。   主精密+副主宰的打法,会是更好的符文搭配。   坚毅不倒-坚毅不倒让刀妹血量越少时伤害越高,配合W技能的减伤效果可以很容易反杀对手。   A5创业项目春季招商 好项目招代理无忧   LOL刀妹重做怎么选择?   LOL刀妹重做推荐:   传说欢欣-刀妹是一个技能中穿插普攻的英雄,出装也以半肉AD为主,因此需要更多攻速…

    创业分享 2023-05-19
    4600
  • 为返乡创业铺路搭桥

      习近平总书记指出:“乡村振兴,人才是关键。要积极培养本土人才,鼓励外出能人返乡创业,鼓励大学生村官扎根基层,为乡村振兴提供人才保障。”   近年来,随着党和政府对“大众创业、万众创新”的高度重视,“返乡创业”已经不是一句口号。返乡创业正当其时,乡村振兴前途无限,返乡创业的高校毕业生、农民工已然不同于昔日离家的懵懂少年。经历了城市化浪潮的洗礼,他们已经成为…

    创业分享 2023-05-12
    3500
  • 教育部公布首批50所“全国创新创业典型经验高校”

      为全面贯彻党的十八届三中、四中、五中全会精神,切实落实党中央、国务院关于深化创新创业教育改革、有效做好大学生创新创业工作的重要部署及《国务院办公厅关于深化高等学校创新创业教育改革的实施意见》(国办发〔2015〕36号)的要求,积极发挥典型引领作用,推动全国高校进一步深化创新创业教育改革,不断提升创业指导服务工作质量和水平,有效促进以创新引领创业、创业带动…

    创业分享 2023-05-21
    9500
  • 企业如何找到加盟商?他用3000字讲明白了丨课堂

    记者 王涛 8月17日,由创业黑马主办的“黑马城市合伙人训练营”第6期在北京正式拉开帷幕。本次针对从线上到线下,拓展全国市场的连锁加盟企业的培训为期3天2夜,导师来自翰皇伟业、711、名创优品、凯叔讲故事、麻辣诱惑等知名连锁加盟品牌负责人,40多名创始人学员来自新零售、教育、餐饮、美业等多个行业的企业。 创业家副总裁易涛在开营仪式上发表致辞,他表示,生意的本…

    创业分享 2023-05-16
    9800
  • 疫情对奢侈品消费影响有限,亿奢汇仍具创业优势

      庚子新年的正月因一场疫情防控阻击战而与以往有所不同。近一个多月以来,受新型冠状病毒疫情的影响,全国经济运行发展受到了不小的冲击。受疫情影响最大的行业当属餐饮业和旅游业,其次是消费品行业,而对传统工业甚至农业影响较小。尽管疫情对消费品行业影响较大,但是亿奢汇平台运营专家认为,奢侈品消费市场作为消费品行业的分支,受疫情影响面较小,且在疫情平息后有望迎来爆发式…

    创业分享 2023-05-12
    4800

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信