李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
08.MyBatis-Plus多数据源
Leefs
2022-12-23 PM
1024℃
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
标签云
Jquery
VUE
Spring
Eclipse
SpringBoot
线程池
LeetCode刷题
Linux
nginx
MySQL
Spark RDD
Flume
RSA加解密
JavaScript
DataX
MyBatis
Hive
Kibana
随笔
JavaWeb
国产数据库改造
Azkaban
Typora
Java阻塞队列
并发编程
哈希表
Flink
Kafka
Python
工具
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞