学习链接

spring整合mybatis的核心思路 & 数据源动态切换 & 多数据源事务控制 - 自己的链接(本篇文章的上篇)

Mybatisplus生成代码配置 & p6spy打印sql & mybatis日志打印 & mybatisplus用法

dynamic-datasource-spring-boot-starter 的gitee地址
dynamic-datasource官方文档(收费)(使用自己的qq登录即可)

SpringBoot多数据源

【Java多数据源实现教程】实现动态数据源、多数据源切换方式

springboot多数据源使用
SpringBoot实现多数据源(六)【dynamic-datasource 多数据源组件】
【Java多数据源实现教程】实现动态数据源、多数据源切换方式
Springboot多数据源配置详解
SpringBoot多数据源配置

基础介绍

简介

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

其支持 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.x.x。

特性

  • 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
  • 支持数据库敏感配置信息 加密 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的分布式事务方案
  • 提供 本地多数据源事务方案(不能和原生spring事务混用)

约定

  • 本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。
  • 配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称相同组名称的数据源会放在一个组下
  • 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换
  • 默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。
  • 方法上的注解优先于类上注解
  • DS支持继承抽象类上的DS,暂不支持继承接口上的DS

使用方法

1. 引入dynamic-datasource-spring-boot-starter

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${version}</version>
</dependency>

2. 配置数据源

以下会配置一个默认库master,一个组slave(组名)下有两个子库slave_1(组名为slave组下的数据源名称slave_1) 和 slave_2(组名为slave组下的数据源名称slave_2)

spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://xx.xx.xx.xx:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置slave_1:url: jdbc:mysql://xx.xx.xx.xx:3307/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_2:url: ENC(xxxxx) # 内置加密,使用请查看详细文档username: ENC(xxxxx)password: ENC(xxxxx)driver-class-name: com.mysql.jdbc.Driver#......省略

其它配置示例

# 多主多从                      纯粹多库(记得设置primary)                   混合配置
spring:                               spring:                               spring:datasource:                           datasource:                           datasource:dynamic:                              dynamic:                              dynamic:datasource:                           datasource:                           datasource:master_1:                             mysql:                                master:master_2:                             oracle:                               slave_1:slave_1:                              sqlserver:                            slave_2:slave_2:                              postgresql:                           oracle_1:slave_3:                              h2:                                   oracle_2:

3. 使用 @DS 切换数据源

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

@Service
@DS("slave")
public class UserServiceImpl implements UserService {@Autowiredprivate 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");}
}

数据源切换示例

简单演示下使用@DS注解,切换指定的数据源

准备数据库

准备2个数据库,一个m_db(作为主库),一个s_db(作为从库),这2个数据库中都有一张account表,表中仅有id和nick_name字段

CREATE TABLE `account` (`id` int(11) NOT NULL AUTO_INCREMENT,`nick_name` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

pom.xml

导入mybatis-plus(不一定要用mybatis-plus,只是因为懒得自己写mapper.xml文件) 和 dynamic-datasource 的依赖

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--父工程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!--项目GAV坐标--><groupId>com.zzhua</groupId><artifactId>sdynamic-datasource-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-demo</name><description>Demo project for Spring Boot</description><!--版本--><properties><java.version>1.8</java.version></properties><dependencies><!--web启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3</version></dependency><dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.9.1</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.1</version></dependency><!--swagger2依赖--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version> 2.7.0</version></dependency><!--swagger-ui第三方依赖--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--打开提示--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!--测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yml

#spring:
#  datasource:
#    type: com.zaxxer.hikari.HikariDataSource
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://127.0.0.1:3306/m_db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
#    username: root
#    password: rootspring:datasource:dynamic:primary: masterstrict: truedatasource:master:url: jdbc:mysql://127.0.0.1:3306/m_db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverhikari:min-idle: 2max-pool-size: 5# 使用下划线, 下划线前面的是组名,整个为数据源标识(若@DS中使用组名, 则会负载均衡该组名下的所有数据源)slave_1:url: jdbc:mysql://127.0.0.1:3306/s_db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:mapper-locations: classpath:mapper/**.xml

SpringbootDemoApplication

开启mybatis的mapper接口扫描

@SpringBootApplication
@MapperScan("com.zzhua.mapper")
public class SpringbootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootDemoApplication.class, args);}}

AccountController

@RestController
@RequestMapping("/account")
public class AccountController {@Autowiredprivate IAccountService accountService;@RequestMapping("createAccount")public Object createAccount(@RequestParam("nickName") String nickName) {Account account = new Account();account.setNickName(nickName);accountService.addAccount(account);return "ok";}@RequestMapping("getAccounts")public List<Account> getAccounts() {return accountService.findAll();}}

IAccountService

public interface IAccountService extends IService<Account> {void addAccount(Account account);List<Account> findAll();}

AccountServiceImpl

@DS("master") // 方法中的@DS注解优先
@Service
public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> implements IAccountService {@Overridepublic void addAccount(Account account) {this.save(account);}@Override@DS("slave") // 填写组名, 会负载均衡// @DS("slave_1")public List<Account> findAll() {return this.list();}}

AccountMapper

public interface AccountMapper extends BaseMapper<Account> {}

AccountMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zzhua.mapper.AccountMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="com.zzhua.entity.Account"><id column="id" property="id" /><result column="nick_name" property="nickName" /></resultMap><!-- 通用查询结果列 --><sql id="Base_Column_List">id, nick_name</sql></mapper>

测试

访问:http://localhost:8080/account/createAccount?nickName=m1,发现数据插入到了m_db数据库中
访问:http://localhost:8080/account/getAccounts,发现查询的是s_db数据库

dynamic-datasource动态数据源学习相关推荐

  1. dynamic动态数据源的使用

    dynamic主要功能就是一个项目可以用到多个数据库 我的springboot 2.4.4 导入dynamic依赖 <!-- dynamic-datasource 多数据源 -->< ...

  2. springboot动态数据源切换(多数据源配置)

    动态数据源切换即多数据源切换,由于业务的需要或者历史的遗留等原因,一个项目中配置了多个数据库,用于查询不同类型的数据,因此我们就需要经常在各个库中切换数据源,接下来我们将进行具体的说明: 项目结构如下 ...

  3. java多个数据库数据进行访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码...

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  4. mysql 多数据源访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  5. 分布式数据层中间件详解:如何实现分库分表+动态数据源+读写分离

    分布式数据层中间件: 1.简介: 分布式数据访问层中间件,旨在为供一个通用数据访问层服务,支持MySQL动态数据源.读写分离.分布式唯一主键生成器.分库分表.动态化配置等功能,并且支持从客户端角度对数 ...

  6. 最简单的动态数据源配置

    动态数据源配置 操作步骤: 一.数据源配置配置方式: 二.动态数据源相关类 1. 枚举类定义如下: 2. 重写查找当前数据源的方法: 3. 用ThreadLocal变量存储查询数据源的字符串: 4. ...

  7. excel学习-数据透视表(自动分组+手动分组+制作动态数据源)

    文章目录 自动分组 日期自动分组 数字自动分组 手动分组 数字手动分组 组合结果修改 文本手动分组 制作动态数据源 数据修改,数量不变 数据数量变化 自动分组 日期自动分组 数字自动分组 手动分组 数 ...

  8. SpringBoot2/SpringBoot/Java动态数据源配置、动态连接池配置、多数据源负载均衡

    Java动态数据源配置.动态连接池配置.多数据源负载均衡 大家好,今天给大家推荐一个自产的连接池插件.废话不多说,本文接口分为以下主题: 1. 插件开发背景: 2. 插件提供的能力: 3. 插件的使用 ...

  9. Spring 下,关于动态数据源的事务问题的探讨

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:青石路 cnblogs.com/youzhibing ...

最新文章

  1. Java架构技术文档:并发编程+设计模式+常用框架+JVM+精选视频
  2. RISC-V有何特别之处?
  3. php压制错误的代码,为什么要压制PHP错误?
  4. 在ASP.NET Core下使用SignalR技术
  5. golang key map 所有_Map的底层实现 为什么遍历Map总是乱序的
  6. java Spring Boot中使用Swagger2构建API文档
  7. 扎实的基础知识、高质量的代码
  8. Android一种常见的布局困扰
  9. docker安装mySQL 8
  10. 墨迹天气html嵌入,墨迹天气怎么添加桌面插件
  11. XRD格式转换 神器
  12. 为什么压缩图片和压缩
  13. 计算机基础操作知识带答案,计算机应用基础知识试题带答案
  14. PDF打印内容缺失问题解决办法
  15. JMokit中的@Mocked与@Injectable区别
  16. Flink SQL 流计算可视化 UI 平台
  17. 基于OpenCv的视频流处理方法
  18. 基于web的员工信息管理系统
  19. tarjan算法求解强连通分量问题
  20. 手电筒安卓_安利一款演唱会必备APP——随手电筒

热门文章

  1. java毕业设计——基于JSP+mysql的图书馆借阅系统设计与实现(毕业论文+程序源码)——图书馆借阅系统
  2. 第一讲、雷达基本公式(matlab)
  3. Alltesting众测平台招募兼职测试工程师,一边学测试,一边赚大钱
  4. Java零钱兑换leetcode
  5. c语言课程设计-计算器
  6. SpringKafka文档 KafkaTemplate
  7. 解决逃离塔科夫0.12.9离线版修改商人可回收所有物品的问题
  8. 将兴趣变现,你会选择什么Dao社区?
  9. STM32—EXTI外部中断
  10. 详解const 用法