【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(一个队…...

【数据结构与算法】 - 双向链表 - 详细实现思路及代码
目录 一、概述 二、双向链表 三、双向链表实现步骤 📌3.1 C语言定义双向链表结点 📌3.2 双向链表初始化 📌3.3 双向链表插入数据 📌3.4 双向链表删除数据 📌3.5 双向链表查找数据 📌3.6 双向链…...

面试官在线点评4份留学生简历! 这些坑你中了几个?如何写项目描述才能被大厂发面试?转专业简历该咋写 | 还有优秀简历展示!
我们给大家展示一下 从材料的准备 也就是说到底包含哪些具体的项目 为什么说这些项目是不错的 第二呢就是说在陈述上 在整个这个简历的结构 他的完备性他的准确性 他的正确性 以及最后他的具体的这种项目的描述 那讲完了这个好的简历呢 我们另外搜集了几份简历 那这些简历呢其实…...

一觉醒后ChatGPT 被淘汰了
OpenAI 的 Andrej Karpathy 都大力宣传,认为 AutoGPT 是 prompt 工程的下一个前沿。 近日,AI 界貌似出现了一种新的趋势:自主人工智能。 这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉前 AI 总监、刚刚回归…...

spring框架的事务
1.什么是事务? 事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元…...

Spring配置数据源
Spring配置数据源数据源的作用环境准备手动创建c3p0数据源封装抽取关键信息,手动创建c3p0数据源使用Spring容器配置数据源数据源的作用 数据源(连接池)是提高程序性能如出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完…...

【前端之旅】Vue入门笔记
一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…...
WPF教程(二)--Application WPF程序启动方式
1.Application介绍 WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只有一个 Application 实例存在。和 WinForm 不同的是WPF Application默认由两部分组成 : App.xaml 和 App.xaml.…...

snmp 自定义子代理mib库
测试环境:centos8 1、安装软件 yum install -y net-snmp net-snmp-utils yum install -y net-snmp-perl net-snmp-devel net-snmp-libs 2、创建用户 net-snmp-create-v3-user 输入用户名 soft 输入密码 123456 输入密码 654321 service snmpd restart 3、创建…...

一文说透安全沙箱技术
在数字经济的东风中,数据安全至关重要。目前已经颁布了包括《数据安全法》、《个人信息保护法》和《数据安全管理办法》在内的国家政策,以促进整个数据要素的发展。 而近年来,随着移动应用程序的普及和小程序技术的崛起,安全沙箱…...

Java多线程基础面试总结(二)
创建三种线程的方式对比 使用实现Runnable、Callable接口的方式创建多线程。 优势 Java的设计是单继承的设计,如果使用继承Thread的方式实现多线程,则不能继承其他的类,而如果使用实现Runnable接口或Callable接口的方式实现多线程…...