李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
08.MyBatis-Plus多数据源
Leefs
2022-12-23 PM
1731℃
0条
[TOC] ### 一、概述 目前在`SpringBoot`框架基础上多数据源的解决方案大多手动创建多个`DataSource`,后续方案有三种: + 继承`org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource`,使用`AOP`切面注入相应的数据源 ,但是这种做法仅仅适用单`Service`方法使用一个数据源可行,如果单`Service`方法有多个数据源执行会造成误读。 + 通过`DataSource`配置 `JdbcTemplate`Bean,直接使用 `JdbcTemplate`操控数据源。 + 分别通过`DataSource`创建`SqlSessionFactory`并扫描相应的`Mapper`文件和`Mapper`接口。 `MybatisPlus`的多数据源解决方案正是`AOP`,继承了`org.springframework.jdbc.datasource.AbstractDataSource`,有自己对`ThreadLocal`的处理。通过注解切换数据源。也就是说,`MybatisPlus`只支持在单`Service`方法内操作一个数据源。 ### 二、特性 - 支持 **数据源分组** ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。 - 支持数据库敏感配置信息 **加密** 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的分布式事务方案**。 - 提供 **本地多数据源事务方案。** ### 三、约定 1. 本框架只做 **切换数据源** 这件核心的事情,并**不限制你的具体操作**,切换了数据源可以做任何CRUD。 2. 配置文件所有以下划线 `_` 分割的数据源 **首部** 即为组的名称,相同组名称的数据源会放在一个组下。 3. 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。 4. 默认的数据源名称为 **master** ,你可以通过 `spring.datasource.dynamic.primary` 修改。 5. 方法上的注解优先于类上注解。 6. DS支持继承抽象类上的DS,暂不支持继承接口上的DS。 ### 四、数据源配置方式 ```yaml # 多主多从 纯粹多库(记得设置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: ``` ### 五、使用方法 > 目前来模拟一个纯粹多库的一个场景 > > 场景说明:创建两个库,分别为:`mybatis_plus`与`mybatis_plus_1`,使每个库一张表,通过一个测试用例分别获取用户数据与商品数据,如果获取到说明多库模拟成功。 #### 5.1 创建数据库及表 + 创建数据库`mybatis_plus`和表user ```SQL CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus`; CREATE TABLE user ( id bigint(20) NOT NULL COMMENT '主键ID', name varchar(30) DEFAULT NULL COMMENT '姓名', age int(11) DEFAULT NULL COMMENT '年龄', email varchar(50) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 添加测试数据 INSERT INTO user (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com'); ``` + 创建数据库mybatis_plus_1和表product ```SQL CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus_1`; CREATE TABLE product ( id BIGINT(20) NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称', price INT(11) DEFAULT 0 COMMENT '价格', version INT(11) DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 添加测试数据 INSERT INTO product (id, NAME, price) VALUES (1, '外星人笔记本', 100); ``` #### 5.2 引入依赖 新创建一个SpringBoot项目,参考[*02.MyBatis-Plus入门案例*](https://lilinchao.com/archives/2678.html) + 在`pom.xml`中新引入如下依赖 ```xml
com.baomidou
dynamic-datasource-spring-boot-starter
3.5.0
``` #### 5.3 配置多数据源 > 说明:注释掉之前的数据库连接,添加新配置 ```yaml spring: # 配置数据源信息 datasource: dynamic: # 设置默认的数据源或者数据源组,默认值即为master primary: master # 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源 strict: false datasource: master: url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf8&useSSL=false driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 123456 slave_1: url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf8&useSSL=false driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 123456 ``` #### 5.4 创建实体类 + **`User`类** ```java @Data @NoArgsConstructor @AllArgsConstructor public class User { @TableId private Integer id; private String name; private Integer age; private String email; } ``` + **`Product`类** ```java @Data @NoArgsConstructor @AllArgsConstructor public class Product { @TableId private Integer id; private String name; private Integer price; private Integer version; } ``` #### 5.5 创建Mapper + **`UserMapper`接口** ```java public interface UserMapper extends BaseMapper
{ } ``` + **`ProductMapper`接口** ```java public interface ProductMapper extends BaseMapper
{ } ``` #### 5.6 创建Service接口 + **`UserService`接口** ```java public interface UserService extends IService
{ } ``` + **`ProductService`接口** ```java public interface ProductService extends IService
{ } ``` #### 5.7 创建Service实现类 + **`UserServiceImpl`类** ```java import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.lilinchao.mybatisplus.datasource.mapper.UserMapper; import com.lilinchao.mybatisplus.datasource.pojo.User; import com.lilinchao.mybatisplus.datasource.service.UserService; import org.springframework.stereotype.Service; /** * @author lilinchao * @date 2022-12-24 * @description **/ @DS("master") //指定所操作的数据源 @Service public class UserServiceImpl extends ServiceImpl
implements UserService { } ``` + **`ProductServiceImpl`类** ```java import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.lilinchao.mybatisplus.datasource.mapper.ProductMapper; import com.lilinchao.mybatisplus.datasource.pojo.Product; import com.lilinchao.mybatisplus.datasource.service.ProductService; import org.springframework.stereotype.Service; /** * @author lilinchao * @date 2022-12-24 * @description **/ @DS("slave_1") //指定所操作的数据源 @Service public class ProductServiceImpl extends ServiceImpl
implements ProductService { } ``` #### 5.8 启动类 在启动类上添加`@MapperScan`注解 ```java import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.lilinchao.mybatisplus.datasource.mapper") public class MybatisplusDatasourceApplication { public static void main(String[] args) { SpringApplication.run(MybatisplusDatasourceApplication.class, args); } } ``` #### 5.9 测试 ```java @SpringBootTest public class MybatisplusDatasourceDemo { @Autowired private UserService userService; @Autowired private ProductService productService; @Test public void testDynamicDataSource(){ System.out.println(userService.getById(1L)); System.out.println(productService.getById(1L)); } } ``` **运行结果** ``` ==> Preparing: SELECT id,name,age,email FROM user WHERE id=? ==> Parameters: 1(Long) <== Columns: id, name, age, email <== Row: 1, Jone, 18, test1@baomidou.com <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@11900483] User(id=1, name=Jone, age=18, email=test1@baomidou.com) ==> Preparing: SELECT id,name,price,version FROM product WHERE id=? ==> Parameters: 1(Long) <== Columns: id, name, price, version <== Row: 1, 外星人笔记本, 100, 0 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@235d29d6] Product(id=1, name=外星人笔记本, price=100, version=0) ``` *附参考文章链接* *《尚硅谷MyBatisPlus教程》* *https://baomidou.com/pages/a61e1b/#%E6%96%87%E6%A1%A3-documentation* *https://www.cnblogs.com/hongdada/p/16082083.html*
标签:
MyBatis
,
MyBatis-Plus
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2702.html
上一篇
07.MyBatis-Plus通用枚举和代码生成器
下一篇
09.MyBatisX插件介绍
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Netty
容器深入研究
JVM
Hbase
高并发
Typora
pytorch
Spark
国产数据库改造
随笔
ajax
LeetCode刷题
查找
Stream流
前端
Spring
Tomcat
递归
Spark RDD
ClickHouse
机器学习
MyBatis
Eclipse
Filter
队列
Hadoop
Beego
锁
Hive
FastDFS
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭