MybatisPlus的使用与详细讲解

今天我们来讲解一下Mybatis的升级版,就是MybatisPlus.

MybatisPlus是如何获取实现CRUD的数据库表信息的? 默认以类名驼峰转下划线作为表名 默认把名为id的字段作为主键 默认把变量名驼峰转下划线作为表的字段名

1.MybatisPlus中比较常见的注解

@TableName:指定表名

@TableId:用来指定主键字段信息

@TableField:用来指定普通字段

使用@TableField的常见场景:

  • 成员变量与数据库段名不一样
  • 成员变量以is开头,并且是布尔值
  • 成员变量名与数据库的关键字冲突
  • 成员变量不是数据库字段 

IdType枚举:

Auto:数据库自增

INPUT:通过set方法录入

ASSING_ID:分配接口为IdentifierGenerator的方法的nextId来生成id,默认实现类为DefaultIdentifierGenerator雪花算法

2.MyBatisPlus使用的基本流程

        引入起步依赖

        自定义Mapper基础BaseMapper

        在实体类上添加注解声明表的信息

        在application.yml中根据需要添加依赖

3.基于QueryWrapper的查询

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

select id,username,info,balance From user where username LIKE '%o%' AND balance >= 1000

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("usesrname","o").ge("balance",1000);
List<User> users = userMapper.selectList(queryWrapper); 

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

UPDATE user SET balance 2000 where username = "jack"

QueryWrapper<User> updateWrapper = new UpdateWarpper<>();
updateWrapper.set("balance",2000).eq("username","jack");
userMapper.update(null,updateWrapper)

 

4.基于UpdateWrapper的更新

需求:更新id为

1,2,4的用户的余额,扣200

UPDATE user SET balance = balance - 200 WHERE id in (1,2,4)

 

LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(User::getId,Arrays.asList(1,2,4)).setSql("balance = balance - 200");
userMapper.update(null,updateWrapper);

条件构造器的用法:

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

5.自定义SQL

我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。

我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。

基于Wrapper构建where条件

List<Long> ids = List.of(1L, 2L, 4L);
int amount = 200;
// 1.构建条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
// 2.自定义SQL方法调用
userMapper.updateBalanceByIds(wrapper, amount);

在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew

void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);

自定义SQL,并使用Wrapper条件

<update id="updateBalanceByIds">UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>

6.MP的Service接口使用流程是怎样的

自定义Service接口继承IService接口

public interface IUserService extends IService<User> {}

自定义Service实现类,实现自定义接口并继承ServiceImpl类

public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService{
}

IService的Lambda更新

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

(2)IService批量新增

需求:批量插入10万条用户数据,并作出对比:

  • 普通for循环插入
for (int i = 0; i < 100000; i++) {User user = new User();user.setUsername("user" + i);user.setBalance(1000);userMapper.insert(user); // 每次插入一条数据
}
  • IService的批量插入
List<User> userList = new ArrayList<>();
for(int i = 0;i < 100000 ; i++){User user = new User();user.setUsername("user" + i);user.setBalance(1000);userList.add(user);
}
userService.saveBatch(userList); //批量删除
  • 开启rewriteBatchedStatements=true参数
  • 在使用 JDBC 时,可以通过在连接 URL 中添加 rewriteBatchedStatements=true 参数来优化批量插入的性能。以下是一个示例:
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?rewriteBatchedStatements=true

7.逻辑删除

逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。思路如下:

  • 在表中添加一个字段标记数据是否被删除
  • 当删除数据时把标记置为1
  • 查询时只查询标记为0的数据

    例如逻辑删除字段为deleted:

删除操作:

查询操作:

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

mybatis-plus:global-config: db-config:     logic-delete-field: flag   # 全局逻辑删除的实体字段名,字段类型可以是boolean、integer                                                 logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

逻辑删除本身也有自己的问题,比如: 会导致数据库表垃圾数据越来越多,影响查询效率 SQL中全都需要对逻辑删除字段做判断,影响查询效率 因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。

 8.枚举处理器

  • 定义枚举类型:创建表示常量的枚举。
  • 在实体类中使用枚举:将枚举类型作为实体类的字段。
  • 创建枚举处理器:实现自定义的 TypeHandler 来处理枚举的存储和读取。
  • 在 MyBatis 配置中注册处理器:将自定义的处理器注册到 MyBatis 中。
  • 使用枚举:在进行数据库操作时,MyBatis 会自动处理枚举的转换。

通用枚举

在application.yml中配置全局枚举处理器:

mybatis-plus:configuration:default-enum-type-handler:com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

1. @EnumValue

@EnumValue 注解通常用于 MyBatis-Plus 框架,目的是将枚举值映射到数据库字段。使用 @EnumValue 注解可以指定在数据库中存储的枚举值。

2. @JsonValue

@JsonValue 注解来自 Jackson 库,主要用于将枚举序列化为 JSON 时指定的值。使用 @JsonValue 可以控制在将枚举转换为 JSON 时使用哪个字段。

  • @EnumValue:用于 MyBatis-Plus,将枚举值映射到数据库字段。
  • @JsonValue:用于 Jackson,将枚举序列化为 JSON 时指定的值。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第241题为运算表达式设计优先级

题目&#xff1a; 题解&#xff1a; const addition, subtraction, multiplication -1, -2, -3func diffWaysToCompute(expression string) []int {ops : []int{}for i, n : 0, len(expression); i < n; {if unicode.IsDigit(rune(expression[i])) {x : 0for ; i < n &…

分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测

分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测&#xff0…

Yolo-World在自定义数据集上进行闭集词汇训练推理过程(二)——使用ultralytics库训练模型

文章目录 概要训练整体流程推理整体流程 概要 之前的文章已经介绍了如何在本地使用源码的yolo-world进行本地化训练模型&#xff0c;具体请参考&#xff1a;Yolo-World在自定义数据集上进行闭集词汇训练过程 下边介绍一下基于ultralytics库训练yolo-world的方法&#xff0c;非常…

如何防止热插拔烧坏单片机

大家都知道一般USB接口属于热插拔&#xff0c;实际任意带电进行连接的操作都可以属于热插拔。我们前面讲过芯片烧坏的原理&#xff0c;那么热插拔就是导致芯片烧坏的一个主要原因之一。 在电子产品的整个装配过程、以及产品使用过程经常会面临接口热插拔或者类似热插拔的过程。…

ROS2中间件

ROS2 是重新设计的 Robot Operating System&#xff0c;无论从用户API接口到底层实现都进行了改进。这里主要关注ROS2 的中间件。 1. 通信模式 ROS2 使用DDS协议进行数据传输&#xff0c;并通过抽象的rmw&#xff0c;支持多个厂家的DDS实现&#xff08;FastDDS&#xff0c;Cyc…

自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍

自动驾驶系列—智能巡航辅助功能中的车道中央保持功能介绍 自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍 自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍 文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感…

Adobe Dimension(DN)安装包软件下载

目录 一、软件简介 二、软件下载 三、注意事项 四、软件功能 五、常用快捷键 快捷键&#xff1a; 一、软件简介 Adobe Dimension&#xff08;简称DN&#xff09;是Adobe公司推出的一款三维设计和渲染软件。与一般的3D绘图软件相比&#xff0c;DN在操作界面和功能上有所不…

C语言航空售票系统

以下是系统部分页面 以下是部分源码&#xff0c;需要源码的私信 #include<stdio.h> #include<stdlib.h> #include<string.h> #define max_user 100 typedef struct ft {char name[50];//名字char start_place[50];//出发地char end_place[50];//目的地char …

微软蓝屏事件暴露的网络安全问题

目录 1.概述 2.软件更新流程中的风险管理和质量控制机制 2.1.测试流程 2.2.风险管理策略 2.3.质量控制措施 2.4.小结 3.预防类似大规模故障的最佳方案或应急响应对策 3.1. 设计冗余系统 3.2. 实施灾难恢复计划 3.3. 建立高可用架构 3.4. 类似规模的紧急故障下的响应…

对某次应急响应中webshell的分析

文章前言 在之前处理一起应急事件时发现攻击者在WEB应用目录下上传了webshell&#xff0c;但是webshell似乎使用了某种加密混淆手法&#xff0c;无法直观的看到其中的木马连接密码&#xff0c;而客户非要让我们连接webshell来证实此文件为后门文件且可执行和利用(也是很恼火&a…

如何用手机压缩视频?手机压缩视频方法来了

高清视频的大文件大小常常成为分享和存储的障碍&#xff0c;尤其是在数据流量有限或存储空间紧张的情况下。幸运的是&#xff0c;无论是智能手机还是个人电脑&#xff0c;都有多种方法可以帮助我们轻松压缩视频文件&#xff0c;以适应不同的需求和情境。本文将介绍如何在手机上…

GooglePlay 金融品类政策更新(7月17号)

距离上次政策大更新&#xff08;4月5号&#xff09;才过去了3个月&#xff0c;Google Play又迎来了一次大更新&#xff0c;不得不说Google Play的要求越来越高了。 我们来梳理一下这次GooglePlay针对金融品类更新了哪些政策: 1.要求提供金融产品和服务的开发者必须注册为组织…

VSCode部署Pytorch机器学习框架使用Anaconda(Window版)

目录 1. 配置Anaconda1.1下载安装包1. Anaconda官网下载2, 安装Anaconda 1.2 创建虚拟环境1.3 常用命令Conda 命令调试和日常维护 1.4 可能遇到的问题执行上述步骤后虚拟环境仍在C盘 2. 配置cuda2.1 查看显卡支持的cuda版本2.2 下载对应cuda版本2.3 下载对应的pytorch可能出现的…

php 存储复杂的json格式查询(如:经纬度)

在开发中&#xff0c;有时我们可能存了一些复杂json格式不知道怎么查。我这里提供给大家参考下&#xff1a; 一、先上表数据格式&#xff08;location字段的possiton经纬度以逗号分开的&#xff09; {"title":"澳海文澜府","position":"11…

【CTFWP】ctfshow-web32

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 题目介绍&#xff1a;题目分析&#xff1a;payload&#xff1a;payload解释&#xff1a;flag 题目介绍&#xff1a; <?php/* # -*- coding: utf-8 -*- # Autho…

新版本异次元荔枝V4自动发卡系统源码

新版本异次元荔枝V4自动发卡系统源码&#xff0c;增加主站货源系统&#xff0c;支持分站自定义支付接口&#xff0c;目前插件大部分免费&#xff0c;UI页面全面更新&#xff0c;分站可支持对接其他分站产品&#xff0c;分站客服可自定义&#xff0c;支持限定优惠。 源码下载&a…

leetcode-98. 验证二叉搜索树

题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&…

spring整合mybatis,junit纯注解开发(包括连接druid报错的所有解决方法)

目录 Spring整合mybatis开发步骤 第一步&#xff1a;创建我们的数据表 第二步&#xff1a;编写对应的实体类 第三步&#xff1a;在pom.xml中导入我们所需要的坐标 spring所依赖的坐标 mybatis所依赖的坐标 druid数据源坐标 数据库驱动依赖 第四步&#xff1a;编写SpringC…

LeetCode 125.验证回文串 C++写法

LeetCode 125.验证回文串 C写法 思路&#x1f914;&#xff1a; 我们不对字符串进行删除&#xff0c;这样效率太低了&#xff0c;所以可以左右开工&#xff0c;下标begin和end遇到不是字母数字字符的就跳过&#xff0c;当两边都是字母就进行比对&#xff0c;一样就继续往后走&a…