MybatisPlus知识点总结(基于黑马2023MybatisPlus课程)

  MybatisPlus知识点总结

配套资料

黑马微服务框架笔记,内含mp
MybatisPlus.pptx
MyBatis-Plus (mp中文官网)

快速入门

入门案例

使用MybatisPlus的基本步骤:
1.引入MybatisPlus依赖,代替Mybatis依赖
image.png
2.定义Mapper接口并继承BaseMapper在这里插入图片描述注:继承时要指定泛型为你操作的实体类的类型

常见注解

MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息

约定
1.类名驼峰转下划线作为表名
2.名为id的字段作为主键
3.变量名驼峰转下划线作为表的字段名

当实际与约定不同时,需要使用注解

MybatisPlus中比较常用的几个注解如下:
@TableName:用来指定表名
@TableId:用来指定表中的主键字段信息
IdType枚举:
AUTO:数据库自增长
INPUT:通过set方法自行输入
ASSIGN_ID:分配 ID,接口IdentifierGenerator的方法nextId来生成id,默认实现类为DefaultIdentifierGenerator雪花算法使用

@TableField:用来指定表中的普通字段信息
@TableField的常见场景:
成员变量名与数据库字段名不一致
(变量名是name,数据库字段名是username)
成员变量名以is开头,且是布尔值
(例:isMarried可能会被看成married,需要注解@TableField(“is_married”)
成员变量名与数据库关键字冲突
(例:变量名order与数据库关键字order相同)
成员变量不是数据库字段
(例:adress在数据库不存在)

image.png
image.png

常见配置

MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置。例如:
image.png

核心功能

条件构造器

mp支持各种复杂的where条件,可以满足日常开发的所有需求

案例
基于QueryWrapper的查询
需求:
1.查询出名字中带o的,存款大于等于1000元的人的id、username、info、balance字段
image.png
image.png

2.更新用户名为jack的用户的余额为2000
image.png
image.png

基于UpdateWrapper的更新
需求:更新id为1,2,4的用户的余额,扣200
image.png
image.png

条件构造器的用法:
1.QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
2.UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
3.尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码

下图是LambdaQueryWrapper的使用,可以与上面第一个案例的代码进行对比
image.png

自定义SQL

我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
image.png
上图的mp代码有部分是在Service层编写

当where条件外的部分没有办法用mp更方便地实现,只能在业务层(Service)拼接,而这样违背了企业开发的规范,就会用到自定义SQL

需求:将id在指定范围的用户(例如1、2、4 )的余额扣减指定值
步骤
1.基于Wrapper构建where条件
image.png
2.在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
image.png
3.自定义SQL,并使用Wrapper条件
image.png

Service接口

image.png
增:save相关
删:remove相关
改:update相关
查:get相关:查一个值
list相关:查多个值
count相关:查数量
page相关:查分页
复杂条件的查询、更新:用lambda相关

image.png

MP的Service接口使用流程是怎样的?
1.自定义Service接口继承IService接口
image.png
2.自定义Service实现类,实现自定义接口并继承ServiceImpl类
image.png

案例
基于Restful风格实现下列接口
需求:基于Restful风格实现下面的接口:
image.png
表单提交要有DTO实体,用户查询结果返回要有VO实体

IService的Lambda查询
需求:实现一个根据复杂条件查询用户的接口,查询条件如下:
name:用户名关键字,可以为空
status:用户状态,可以为空
minBalance:最小余额,可以为空
maxBalance:最大余额,可以为空
image.png

IService的Lambda更新
需求:改造根据id修改用户余额的接口,要求如下
1.完成对用户状态校验
2.完成对用户余额校验
3.如果扣减后余额为0,则将用户status修改为冻结状态

IService批量新增
需求:批量插入10万条用户数据,并作出对比:
普通for循环
插入IService的批量插入
开启rewriteBatchedStatements=true参数(在yaml的mysql->url中添加)

批处理方案:
普通for循环逐条插入速度极差,不推荐
MP的批量新增,基于预编译的批处理,性能不错
配置jdbc参数,开rewriteBatchedStatements,性能最好

扩展功能

代码生成

原因:内容类似
image.pngimage.png
image.png
image.png

代码生成步骤
image.png
image.png
image.png
image.png
image.png

DB静态工具

image.png

案例
需求:
1.改造根据id查询用户的接口,查询用户的同时,查询出用户对应的所有地址改造
2.根据id批量查询用户的接口,查询用户的同时,查询出用户对应的所有地址实现
3.根据用户id查询收货地址功能,需要验证用户状态,冻结用户抛出异常(练习)

分析:
前面两个接口中,在UserService中需要注入AdressService;而第三个接口在AdressService中需要注入UserService,形成循环依赖。
为了解决这个问题,可以使用静态工具

逻辑删除

逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。思路如下:
在表中添加一个字段标记数据是否被删除
当删除数据时把标记置为1
查询时只查询标记为0的数据

例如逻辑删除字段为deleted:
删除操作:
image.png
查询操作:
image.png

MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可:
image.png
image.png

枚举处理器

User类中有一个用户状态字段:image.png
在application.yml中配置全局枚举处理器:
image.png

如何实现PO类中的枚举类型变量与数据库字段的转换?
1.给枚举中的与数据库对应value值添加@EnumValue注解
2.在配置文件中配置统一的枚举处理器,实现类型转换
拓展:
枚举在给前端返回的时候,默认返回的是枚举项的名字
可以利用@JsonValue来自己定义返回的对象

默认情况下如图
image.png
image.png

在desc上加了@JsonValue,status返回结果发生改变。(value同理)
image.png
image.png

JSON处理器

//无JSON处理器
user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");

//有JSON处理器
user.setInfo(UserInfo.of(24,"英文老师","female"));

插件功能

MyBatisPlus提供的内置拦截器有下面这些:

序号拦截器描述
1TenantLineInnerInterceptor多租户插件
2DynamicTableNameInnerInterceptor动态表名插件
3PaginationInnerInterceptor分页插件
4OptimisticLockerInnerInterceptor乐观锁插件
5IllegalSQLInnerInterceptorSQL性能规范插件,检测并拦截垃圾SQL
6BlockAttackInnerInterceptor防止全表更新和删除的插件

分页插件

首先,要在配置类中注册MyBatisPlus的核心插件,同时添加分页插件:
image.png

接着,就可以使用分页的API了:
image.png
image.png
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443659.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++_可变参数模板

目录 1、可变参数模板的用法 2、参数包展开 2.1 递归方式展开 2.2 逗号表达式形式展开 3、参数包的大小 结语 前言: C11引入了可变参数模板,他的作用是可以让创建的函数模板或者类模板的模板参数可以接收任意数量参数,在C11前&#x…

16. C++标准库

C标准库兼容C语言标准函数库,可以在C标准库中直接使用C语言标准函数库文件,同时C标准库增加了自己的源代码文件,新增文件使用C编写,多数代码放在std命名空间中,所以连接C标准库文件后还需要 using namespace std;。 【…

【OpenGL手册11】材质的模型

目录 一、说明二、材质表面和光照三、设置材质四、光的属性五、不同的光源颜色练习 一、说明 在现实世界里,每个物体会对光产生不同的反应。比如,钢制物体看起来通常会比陶土花瓶更闪闪发光,一个木头箱子也不会与一个钢制箱子反射同样程度的…

Seata 2.x 系列【6】微服务项目搭建

有道无术,术尚可求,有术无道,止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址:https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 数据库…

2024年3月ZZUACM 招新赛题解

2024年3月ZZUACM 招新赛 题号题目A区间次大值B上课签到C魔法森林(一)D魔法森林(二)ELOPF跳格子G猜数字H抽卡记录I安达的二维矩阵J安达的数字手术K跳楼梯L前缀和 A 区间次大值—循环/签到题 题目描述 给定一个 n n n的全排列 a i…

DeepLearning in Pytorch|共享单车预测NN详解(思路+代码剖析)

目录 概要 一、代码概览 二、详解 基本逻辑 1.数据准备 2.设计神经网络 初版 改进版 测试 总结 概要 原文链接:DeepLearning in Pytorch|我的第一个NN-共享单车预测 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用…

自然语言处理: 第十三章P-tuing系列之P-tuning V1

项目地址: P-Tuning 论文地址: [2103.10385] GPT Understands, Too (arxiv.org) 理论基础 正如果上一节介绍LoRA(自然语言处理: 第十二章LoRA解读_lora自然英语处理-CSDN博客)一样,本次介绍的在21年由清华团推提出来的 P-Tuning V1系列也属于PEFT(参数高效微调系列)里的一种&…

【前端】平面转换与渐变

目录 1.字体图标 2.平面转换 2.1位移 2.2旋转 2.3多重转换 2.4缩放 3.渐变 1.字体图标 引入iconfont平台字体图标样式表 <link rel"stylesheet" href"./iconfont/iconfont.css"> <i class"iconfont xx"></i> 第一个类…

函数柯里化:JavaScript中的高级技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

学习嵌入式C语言要掌握到什么程度?

学习嵌入式C语言要掌握到什么程度&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升自己&#…

anaconda问题合集

目录 一. 万分注意 二. ImportError: DLL load failed while importing _ctypes: 找不到指定的模块。 1. 发生情况 2. 导致结果和解决方法 三. WARNING: A newer version of conda exists. 1. 在conda install 某库的时候 2. 解决方法 一. 万分注意 不要轻易使用 conda …

YOLO建筑物损伤评估数据集

YOLO建筑物损伤评估数据集&#xff0c;重度损伤&#xff0c;轻微损伤&#xff0c;中度损伤&#xff0c;未损伤4类&#xff0c;近五千张图像&#xff0c;yolo标注完整&#xff0c;应用数据增强。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集…

举个栗子!Alteryx 技巧(10):解决连数据库时出现中文乱码的问题

在日常工作中&#xff0c;我们经常遇到需要连接 Oracle 数据库的场景。当采用 ODBC 的方式进行连接时&#xff0c;可能会出现中文乱码。那么&#xff0c;应该如何解决中文乱码这个问题呢&#xff1f; 本期《举个栗子&#xff01;Alteryx 技巧》&#xff0c;我们就来分享方法吧…

近年来文本检测相关工作梳理

引言 场景文本检测任务&#xff0c;一直以来是OCR整个任务中最为重要的一环。虽然有一些相关工作是端对端OCR工作的&#xff0c;但是从工业界来看&#xff0c;相关落地应用较为困难。因此&#xff0c;两阶段的OCR方案一直是优先考虑的。 在两阶段中&#xff08;文本检测文本识…

猫头虎分享已解决Bug || 云服务中断:CloudOutage, CloudProviderError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

GO的运算符

点击名片关注 阿尘blog&#xff0c;一起学习&#xff0c;一起成长 Go语言中的运算符用于执行各种操作&#xff0c;如算术运算、比较、逻辑运算等。下面是Go语言中各类运算符的详细讲解&#xff0c;包括代码示例、代码说明以及使用注意事项。 1 算术运算符 加法运算符 a : 5 b …

Java实现从本地读取CSV文件数据

一、前言 最近项目中需要实现这样一个功能&#xff0c;就是从本地读取CSV文件&#xff0c;并以指定行作为标题行&#xff0c;指定行开始作为数据读取行&#xff0c;读取数据并返回给前端&#xff0c;下面具体说下是如何通过java实现。 二、如何实现&#xff1f; 1.引入相关mav…

西门子PLC中的程序块及类别详解

在PLC的编程中&#xff0c;程序块是指一组逻辑控制代码&#xff0c;用于实现系统中特定的控制功能。程序块主要分为四类&#xff0c;包括函数块&#xff08;FB&#xff09;、函数&#xff08;FC&#xff09;、数据块&#xff08;DB&#xff09;和组织块&#xff08;OB&#xff…

git讲本地代码提交到码云https://gitee.com/

首先需要在码云中自己账号下创建一个空的仓库 第一步 如下图 第二步 仓库名字和仓库是否私有&#xff0c;其他不用选 以上操作好了以后 回到本地&#xff0c;在本地你要上传到仓库的项目路径下&#xff0c;初始化为git 执行 git init 接着&#xff0c;把远程仓库地址复制下…

软件设计师软考题目解析24 --每日五题

想说的话&#xff1a;要准备软考了。0.0&#xff0c;其实我是不想考的&#xff0c;但是吧&#xff0c;由于本人已经学完所有知识了&#xff0c;只是被学校的课程给锁在那里了&#xff0c;不然早找工作去了。寻思着反正也无聊&#xff0c;就考个证玩玩。 本人github地址&#xf…