当前位置: 首页 > news >正文

【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方法,但在ModelCURD的底层实现中依然是需要使用我们之前创建的继承了BaseMapperUserMapper来进行操作,所以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)中指定序列的名称:(这里clazzlong是因为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 主要适用场景

意图:

当要更新一条记录的时候,希望这条记录没有被别人更新

乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

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 特别说明

  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion 会回写到 entity 中
  • 仅支持 updateById(id) 与 update(entity, wrapper) 方法
  • 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!

4、SQL注入器实现自定义全局变量

我们已经知道,在MP中,通过AbstractSqlInjectorBaseMapper中的方法注入到了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 创建工程

创建工程:

导入pom.xml:

8.2 代码

直接复制模板即可:(以下仅展示部分代码内容)

8.3 测试

代码已生成:

实体对象:

9、MyBatisX 快速开发插件

MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。

安装方法:打开 IDEA,进入 File -> Settings -> Plugins -> Browse Repositories,输入 mybatisx 搜索并安装

功能:

  • Java 与 XML 调回跳转
  • Mapper 方法自动生成 XML

测试用例:

结果:

相关文章:

【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. 杨老师的照相排列 题意&#xff1a; NNN 个人站成左端对齐的 kkk 排&#xff0c;每排有 NiN_iNi​ 人&#xff0c;Ni>NjN_i > N_jNi​>Nj​ 如果 i<ji < ji<j&#xff0c;则 Ni>NjN_i > N_jNi​>Nj​ 。每一排从左到右身高递减&…...

spring数据库事务管理

1.什么是事务 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 需要注意的是&#xff1a;事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的 innodb引擎。但是&#xff0c;如果把数据库引擎变为 myisam&#x…...

Huggingface微调BART的代码示例:WMT16数据集训练新的标记进行翻译

BART模型是用来预训练seq-to-seq模型的降噪自动编码器&#xff08;autoencoder&#xff09;。它是一个序列到序列的模型&#xff0c;具有对损坏文本的双向编码器和一个从左到右的自回归解码器&#xff0c;所以它可以完美的执行翻译任务。 如果你想在翻译任务上测试一个新的体系…...

synchronized 的 monitor 机制

synchronized 的 monitor 机制 前言 本文基于 jdk 8 编写。author JellyfishMIX - github / blog.jellyfishmix.comLICENSE GPL-2.0 monitor monitor 是 synchronized 中用以实现线程之间的互斥与协作的主要手段&#xff0c;它可以看成是对象或者 class 持有的锁。每一个对象…...

NumPy 初学者指南中文第三版:1~5

原文&#xff1a;NumPy: Beginner’s Guide - Third Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 一、NumPy 快速入门 让我们开始吧。 我们将在不同的操作系统上安装 NumPy 和相关软件&#xff0c;并看一些使用 NumPy 的简单代码。 本章简要介绍了 IPython…...

ChatGLM-6B论文代码笔记

ChatGLM-6B 文章目录 ChatGLM-6B前言一、原理1.1 优势1.2 实验1.3 特点&#xff1a;1.4 相关知识点 二、实验2.1 环境基础2.2 构建环境2.3 安装依赖2.4 运行2.5 数据2.6 构建前端页面 3 总结 前言 Github&#xff1a;https://github.com/THUDM/ChatGLM-6B 参考链接&#xff1a…...

机器学习入门实例-加州房价预测-1(数据准备与可视化)

问题描述 数据来源&#xff1a;California Housing Prices dataset from the StatLib repository&#xff0c;1990年加州的统计数据。 要求&#xff1a;预测任意一个街区的房价中位数 缩小问题&#xff1a;superwised multiple regressiong(用到人口、收入等特征) univariat…...

【ROS2指南-20】了解ROS2组件的用法

在单个进程中组合多个节点 目录 背景 运行演示 发现可用组件 使用 ROS 服务 (1.) 与发布者和订阅者的运行时组合 使用 ROS 服务 (1.) 与服务器和客户端的运行时组合 使用 ROS 服务的编译时组合 (2.) 使用 dlopen 的运行时组合 使用启动动作组合 高级主题 卸载组件 重新…...

使用AI进行“文本纠错”

AI在现实中的应用有很多&#xff0c;你有没有想过&#xff0c;它还可以进行文本纠错呢&#xff1f;传统的校对既耗时又枯燥&#xff0c;通过“AI纠错”&#xff0c;不仅能更快完成&#xff0c;还能提高准确度。那么AI“文本纠错”背后的原理是什么呢&#xff1f;和我一起看看吧…...

第九章 法律责任与法律制裁

第九章 法律责任与法律制裁_副本 目录 第一节 法律责任的概念 一 法律责任的含义二 法律责任的特点 第二节 法律责任的分类与竞合 一 法律责任的分类 &#xff08;一&#xff09;根据责任行为所违反的法律的性质 民事责任&#xff1a;刑事责任行政责任违宪责任 &#xff08;二…...

如何选择好用的海康视频恢复软件?综合考虑这几点

海康视频恢复通常是指从海康威视监控设备中恢复删除或丢失的视频。在使用海康设备进行监控时&#xff0c;一些重要的视频可能会被误删除或其他原因导致丢失&#xff0c;如果没有及时备份&#xff0c;数据就可能会“永久”丢失&#xff1f;其实不然&#xff0c;我们可以选择好用…...

前端学习:HTML颜色(什么是RGB、HEX、HSL)

一、什么是RGB、HEX、HSL&#xff1f; 无论是RGB、HEX、HSL&#xff0c;它们的作用只有一个&#xff1a;用数字表达出一种颜色。 1.RGB RGB通过输入的数值&#xff0c;将红色、绿色和蓝色的光源以一定的量混合在一起&#xff0c;形成颜色。 软件中通常让你输入Red、Green、B…...

zookeeper + kafka集群搭建详解

目录 1.消息队列介绍 1.为什么需要消息队列 &#xff08;MO&#xff09; 2.使用消息队列的好处 3.消息队列的两种模式 2.Kafka相关介绍 1.Kafka定义 2.Kafka简介 3. Kafka的特性 3.Kafka系统架构 1. Broker&#xff08;服务器&#xff09; 2. Topic&#xff08;一个队…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...