【MyBatis Plus】004 -- MyBatis Plus高级(AR、MP插件、自定义全局操作、自动填充、逻辑删除、枚举、代码生成器)

目录
1、ActiveRecord
1.1 开启AR之旅(根据主键 id 进行查询)
1.2 新增数据
1.3 更新操作
1.4 删除操作
1.5 根据条件查询
2、Oracle 主键 Sequence
2.1 部署Oracle环境
2.2 创建表以及序列
2.3 jdbc驱动包
2.4 修改application.properties
2.5 配置序列
2.6 测试
3、MyBatis-Plus的插件
3.1 mybatis的插件机制
3.2 执行分析插件
3.3 性能分析插件
3.4 乐观锁插件
3.4.1 主要适用场景
3.4.2 插件配置
3.4.3 注解实体字段
3.4.4 测试
3.4.5 特别说明
4、SQL注入器实现自定义全局变量
4.1 编写MyBaseMapper
4.2 编写MySqlInjector
4.3 编写FindAll
4.4 注册到Spring容器(自定义的SQL注入器 MySqlInjector)
4.5 测试
5、自动填充功能
5.1 添加@TableField注解
5.2 编写MyMetaObjectHandler
5.3 测试
6、逻辑删除(标记隐藏展示)
6.1 修改表结构
6.2 配置
6.3 测试
7、通用枚举
7.1 修改表结构
7.2 定义枚举
7.3 配置
7.4 修改实体
7.5 测试
8、代码生成器
8.1 创建工程
8.2 代码
8.3 测试
9、MyBatisX 快速开发插件
1、ActiveRecord
ActiveRecord(简称AR)一直广受动态语言( PHP 、 Ruby 等)的喜爱,而 Java 作为准静态语言,对于ActiveRecord 往往只能感叹其优雅,所以我们也在 AR 道路上进行了一定的探索,喜欢大家能够喜欢

1.1 开启AR之旅(根据主键 id 进行查询)
| 在MP中,开启AR非常简单,只需要将实体对象继承Model即可 |
|
在Model中实现了各种各样的方法:
因此我们可以直接通过User对象来调用CURD方法 |
| 测试用例:(根据主键 id 进行查询) |
|
但虽然我们在测试用例中没有显式的使用Mapper方法,但在Model的CURD的底层实现中依然是需要使用我们之前创建的继承了BaseMapper的UserMapper来进行操作,所以Mapper接口是不能省略的,一定要切记!
|
| 测试结果: |
|
|
1.2 新增数据
| 测试用例: |
|
|
| 测试结果: |
|
数据库表结果:
|
1.3 更新操作
| 测试用例: |
|
|
| 结果: |
|
|
1.4 删除操作
| 测试用例: |
|
|
| 结果: |
|
|
1.5 根据条件查询
| 测试用例: |
|
|
| 结果: |
|
|
2、Oracle 主键 Sequence
在mysql中,主键往往是自增长的,这样使用起来是比较方便的,如果使用的是Oracle数据库,那么就不能使用自增长了,就得使用Sequence 序列生成id值了
2.1 部署Oracle环境
为了简化环境部署,这里使用Docker环境进行部署安装Oracle
| # 拉取镜像 docker pull sath89/oracle-12c # 创建容器 docker create --name oracle -p 1521:1521 sath89/oracle-12c # 启动 docker start oracle && docker logs -f oracle # 部分启动过程省略 …… PL/SQL procedure successfully completed. Starting import from '/docker-entrypoint-initdb.d': ls: cannot access /docker-entrypoint-initdb.d/*: No such file or directory Import finished Database ready to use. Enjoy! ;) # 通过用户名密码即可登录 用户名和密码为: system/oracle |
| 下面使用navicat12进行连接并操作oracle: |
| 需要注意的是:由于安装的Oracle是64位版本,所以navicat也是需要使用64为版本,否则连接不成功。 |
|
|
2.2 创建表以及序列
| 建表语句: |
| --创建表,表名以及字段名都要大写 CREATE TABLE "TB_USER" ( "ID" NUMBER(20) VISIBLE NOT NULL , "USER_NAME" VARCHAR2(255 BYTE) VISIBLE , "PASSWORD" VARCHAR2(255 BYTE) VISIBLE , "NAME" VARCHAR2(255 BYTE) VISIBLE , "AGE" NUMBER(10) VISIBLE , "EMAIL" VARCHAR2(255 BYTE) VISIBLE ) --创建序列 CREATE SEQUENCE SEQ_USER START WITH 1 INCREMENT BY 1 |
2.3 jdbc驱动包
| 由于版权原因,我们不能直接通过maven的中央仓库下载oracle数据库的jdbc驱动包,所以我们需要将驱动包安装到本地仓库: |
|
安装成功:
|
| 安装完成后的坐标:(测试是否可以成功导入) |
|
导入成功:
|
2.4 修改application.properties
对于application.properties的修改,需要修改2个位置,分别是:
|
|
2.5 配置序列
使用Oracle的序列需要做2件事情:
| Ⅰ、需要配置MP的序列生成器到Spring容器: |
|
|
| Ⅱ、在实体对象(pojo)中指定序列的名称:(这里clazz为long是因为id的类型也为long) |
|
|
2.6 测试
| 测试用例: |
|
|
| 结果: |
|
|
3、MyBatis-Plus的插件
3.1 mybatis的插件机制
| MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: |
| 1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 2. ParameterHandler (getParameterObject, setParameters) 3. ResultSetHandler (handleResultSets, handleOutputParameters) 4. StatementHandler (prepare, parameterize, batch, update, query) |
| 我们看到了可以拦截Executor接口的部分方法,比如update,query,commit,rollback等方法,还有其他接口的一些方法等 |
| 总体概括为: 1. 拦截执行器的方法 2. 拦截参数的处理 3. 拦截结果集的处理 4. 拦截Sql语法构建的处理 |
拦截器示例:(测试运行,会先进入对象代理plugin方法(此时它获取的target是一个MybatisSimpleExecutor对象),只会才会被intercept方法拦截,拦截到update方法之后,我们可以通过proceed()方法对其放行,然后再次进入plugin方法(此时它获取的target是一个MybatisDefaultParameterHandler对象),在这个过程中plugin方法一共会被执行四次,因为MyBatis 允许使用插件来拦截的方法就包括四种,所以每种都会在plugin方法中进行一次包装)
|
|
| 注入到Spring容器: |
|
|
| 或者通过xml配置,mybatis-config.xml: |
|
|
3.2 执行分析插件
在MP中提供了对SQL执行的分析的插件,可用作阻断全表更新、删除的操作,注意:该插件仅适用于开发环境,不适用于生产环境
| SpringBoot配置:(SQL分析插件)
|
| 测试:(测试全表的更新,SQL分析器的阻断效果) |
|
|
| 结果:(可以看到,当执行全表更新时,会抛出异常,这样有效防止了一些误操作) |
|
这是一个禁止的操作 |
|
|
如果是非全表的更新,那么会怎么样呢?
| 测试方法:
|
| 可以正常执行:
|
3.3 性能分析插件
| 性能分析拦截器,用于输出每条 SQL 语句及其执行时间,可以设置最大执行时间,超过时间会抛出异常 注意:该插件只用于开发环境,不建议生产环境使用 |
| 配置:(Mybatis-config.xml),其也可以在MybatisPlusConfig中进行配置 |
|
|
| 执行结果:(可以看到,执行时间为11ms。如果将maxTime设置为1,那么,该操作会抛出异常) |
|
|
| 超时,抛出异常: |
|
|
3.4 乐观锁插件
3.4.1 主要适用场景
| 意图: 当要更新一条记录的时候,希望这条记录没有被别人更新 乐观锁实现方式:
|
3.4.2 插件配置
| spring xml: |
|
|
| spring boot: |
|
|
3.4.3 注解实体字段
需要为实体字段添加@Version注解
| Ⅰ、为表添加version字段,并且设置初始值为1: |
|
|
| Ⅱ、为User实体对象(pojo)添加version字段,并且添加@Version注解(表示它是一个乐观锁): |
|
|
3.4.4 测试
| 测试用例:(测试乐观锁)
|
| 执行日志: |
|
|
| 可以看到,更新的条件中有version条件,并且更新的version为2。 如果再次执行,更新则不成功。这样就避免了多人同时更新时导致数据的不一致 |
3.4.5 特别说明
|
4、SQL注入器实现自定义全局变量
我们已经知道,在MP中,通过AbstractSqlInjector将BaseMapper中的方法注入到了Mybatis容器,这样这些方法才可以正常执行
那么,如果我们需要扩充BaseMapper中的方法,又该如何实现呢?
下面我们以扩展findAll方法(自定义方法)为例进行学习
4.1 编写MyBaseMapper
|
其他的Mapper都可以继承该Mapper,这样实现了统一的扩展 |
| 如: |
|
|
4.2 编写MySqlInjector
如果直接继承AbstractSqlInjector的话,原有的BaseMapper中的方法将失效,所以我们选择继承DefaultSqlInjector进行扩展
|
|
4.3 编写FindAll
|
|
4.4 注册到Spring容器(自定义的SQL注入器 MySqlInjector)
|
|
4.5 测试
|
|
| 输出的SQL: |
|
至此,我们实现了全局扩展SQL注入器 |
5、自动填充功能
有些时候我们可能会有这样的需求,插入或者更新数据时,希望有些字段可以自动填充数据,比如密码、version 等。在MP中提供了这样的功能,可以实现自动填充
5.1 添加@TableField注解
|
为password添加自动填充功能,在新增数据时有效。 FieldFill提供了多种模式选择: |
|
|
5.2 编写MyMetaObjectHandler
|
插入数据时填充: // 先获取到password的值,再进行判断,如果为空,就进行填充,如果不为空,就不做处理
更新数据时填充:
|
5.3 测试
|
|
| 结果:(默认在插入时填充密码为123456) |
|
|
6、逻辑删除(标记隐藏展示)
开发系统时,有时候在实现功能时,删除操作需要实现逻辑删除,所谓逻辑删除就是将数据标记为删除,而并非真正的物理删除(非DELETE操作),查询时需要携带状态条件,确保被标记的数据不被查询到。这样做的目的就是避免数据被真正的删除
MP就提供了这样的功能,方便我们使用,接下来我们一起学习下:
6.1 修改表结构
| 为tb_user表增加deleted字段,用于表示数据是否被删除,1代表删除,0代表未删除: |
|
|
| 同时,也修改User实体,增加deleted属性并且添加@TableLogic注解: |
|
|
6.2 配置
| application.properties: |
|
|
6.3 测试
|
|
| 执行的SQL: |
|
数据库表:
|
| 测试查询: |
|
执行的SQL:
已经查询不出来了,可见,已经实现了逻辑删除。 |
7、通用枚举
解决了繁琐的配置,让 mybatis 优雅的使用枚举属性
7.1 修改表结构
|
|
7.2 定义枚举
|
|
7.3 配置
|
|
7.4 修改实体
|
|
7.5 测试
| 测试插入数据: |
|
|
| SQL: |
|
数据库表:
|
查询:(这里的插件可以将枚举和1,2进行转化)
|
|
| 结果: |
|
从测试可以看出,可以很方便的使用枚举了 查询条件时也是有效的: |
|
|
| SQL:
|
8、代码生成器AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率 8.1 创建工程
8.2 代码
8.3 测试
9、MyBatisX 快速开发插件
| |||||||||||||||
| |||||||||||||||
相关文章:
【MyBatis Plus】004 -- MyBatis Plus高级(AR、MP插件、自定义全局操作、自动填充、逻辑删除、枚举、代码生成器)
目录 1、ActiveRecord 1.1 开启AR之旅(根据主键 id 进行查询) 1.2 新增数据 1.3 更新操作 1.4 删除操作 1.5 根据条件查询 2、Oracle 主键 Sequence 2.1 部署Oracle环境 2.2 创建表以及序列 2.3 jdbc驱动包 2.4 修改application.properties 2.5 配置序列…...
3年外包终上岸,我只能说:但凡有点机会,千万别去外包...
我大学学的是计算机专业,毕业的时候,对于找工作比较迷茫,也不知道当时怎么想的,一头就扎进了一家外包公司的软件测试岗,一干就是3年。现在终于跳槽到了互联网公司了,我想说的是,但凡有点机会&am…...
【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
软件质量保证与软件测试复习笔记(第一周总体介绍+黑盒测试详细)
第一周 2.23 (总体性介绍) 软件测试的定义 常用术语解释 错误 缺陷 故障 失效 测试和测试用例、测试过程 出现软件缺陷的原因 软件开发的主要环节 测试过程的生命周期模型 软件测试的本质是针对要测试的内容确定一组测试用例 测试用…...
WRF模式与Python融合技术在多领域中的应用及精美绘图教程
当今从事气象及其周边相关领域的人员,常会涉及气象数值模式及其数据处理,无论是作为业务预报的手段、还是作为科研工具,掌握气象数值模式与高效前后处理语言是一件非常重要的技能。WRF作为中尺度气象数值模式的佼佼者,模式功能齐全…...
Reactor设计模式
一、Reactor设计模式 1、什么是Reactor设计模式? Reactor模式是高性能I/O设计中,常用的设计模式。其中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上,一旦有I/O事件到来或是准备就绪…...
精通 TensorFlow 2.x 计算机视觉:第二部分
原文:Mastering Computer Vision with TensorFlow 2.x 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,…...
《算法竞赛进阶指南》0x51 线性DP
0x51 线性DP 271. 杨老师的照相排列 题意: NNN 个人站成左端对齐的 kkk 排,每排有 NiN_iNi 人,Ni>NjN_i > N_jNi>Nj 如果 i<ji < ji<j,则 Ni>NjN_i > N_jNi>Nj 。每一排从左到右身高递减&…...
spring数据库事务管理
1.什么是事务 事务是逻辑上的一组操作,要么都执行,要么都不执行。 需要注意的是:事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的 innodb引擎。但是,如果把数据库引擎变为 myisam&#x…...
Huggingface微调BART的代码示例:WMT16数据集训练新的标记进行翻译
BART模型是用来预训练seq-to-seq模型的降噪自动编码器(autoencoder)。它是一个序列到序列的模型,具有对损坏文本的双向编码器和一个从左到右的自回归解码器,所以它可以完美的执行翻译任务。 如果你想在翻译任务上测试一个新的体系…...
synchronized 的 monitor 机制
synchronized 的 monitor 机制 前言 本文基于 jdk 8 编写。author JellyfishMIX - github / blog.jellyfishmix.comLICENSE GPL-2.0 monitor monitor 是 synchronized 中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 class 持有的锁。每一个对象…...
NumPy 初学者指南中文第三版:1~5
原文:NumPy: Beginner’s Guide - Third Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 一、NumPy 快速入门 让我们开始吧。 我们将在不同的操作系统上安装 NumPy 和相关软件,并看一些使用 NumPy 的简单代码。 本章简要介绍了 IPython…...
ChatGLM-6B论文代码笔记
ChatGLM-6B 文章目录 ChatGLM-6B前言一、原理1.1 优势1.2 实验1.3 特点:1.4 相关知识点 二、实验2.1 环境基础2.2 构建环境2.3 安装依赖2.4 运行2.5 数据2.6 构建前端页面 3 总结 前言 Github:https://github.com/THUDM/ChatGLM-6B 参考链接:…...
机器学习入门实例-加州房价预测-1(数据准备与可视化)
问题描述 数据来源:California Housing Prices dataset from the StatLib repository,1990年加州的统计数据。 要求:预测任意一个街区的房价中位数 缩小问题:superwised multiple regressiong(用到人口、收入等特征) univariat…...
【ROS2指南-20】了解ROS2组件的用法
在单个进程中组合多个节点 目录 背景 运行演示 发现可用组件 使用 ROS 服务 (1.) 与发布者和订阅者的运行时组合 使用 ROS 服务 (1.) 与服务器和客户端的运行时组合 使用 ROS 服务的编译时组合 (2.) 使用 dlopen 的运行时组合 使用启动动作组合 高级主题 卸载组件 重新…...
使用AI进行“文本纠错”
AI在现实中的应用有很多,你有没有想过,它还可以进行文本纠错呢?传统的校对既耗时又枯燥,通过“AI纠错”,不仅能更快完成,还能提高准确度。那么AI“文本纠错”背后的原理是什么呢?和我一起看看吧…...
第九章 法律责任与法律制裁
第九章 法律责任与法律制裁_副本 目录 第一节 法律责任的概念 一 法律责任的含义二 法律责任的特点 第二节 法律责任的分类与竞合 一 法律责任的分类 (一)根据责任行为所违反的法律的性质 民事责任:刑事责任行政责任违宪责任 (二…...
如何选择好用的海康视频恢复软件?综合考虑这几点
海康视频恢复通常是指从海康威视监控设备中恢复删除或丢失的视频。在使用海康设备进行监控时,一些重要的视频可能会被误删除或其他原因导致丢失,如果没有及时备份,数据就可能会“永久”丢失?其实不然,我们可以选择好用…...
前端学习:HTML颜色(什么是RGB、HEX、HSL)
一、什么是RGB、HEX、HSL? 无论是RGB、HEX、HSL,它们的作用只有一个:用数字表达出一种颜色。 1.RGB RGB通过输入的数值,将红色、绿色和蓝色的光源以一定的量混合在一起,形成颜色。 软件中通常让你输入Red、Green、B…...
zookeeper + kafka集群搭建详解
目录 1.消息队列介绍 1.为什么需要消息队列 (MO) 2.使用消息队列的好处 3.消息队列的两种模式 2.Kafka相关介绍 1.Kafka定义 2.Kafka简介 3. Kafka的特性 3.Kafka系统架构 1. Broker(服务器) 2. Topic(一个队…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...



















































































