MybatisPlus的使用与详细讲解

news2024/11/24 23:02:25

今天我们来讲解一下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.coloradmin.cn/o/1941915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红人点集登录逆向+接口逆向:SHA256算法和Webpack反爬

&#x1f50d; 引言 红人点集采取了一系列加密和限制措施&#xff0c;主要是对于参数加密和登录token加密。今天利用Python与JavaScript逆向工程技术&#xff0c;实现逆向登录然后请求接口获取数据。 &#x1f50d; 思路与步骤详解 &#x1f527; 解密登录接口参数&#xf…

安防视频监控EasyCVR视频汇聚平台修改配置后无法启动的原因排查与解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

【Echarts示例】类甘特图的时间线图表

[示例] 类甘特图的时间线图表 const data [{ name: 预备阶段, start: 0, end: 2 },{ name: 战略展开, start: 2, end: 4 },{ name: 指挥所启动, start: 4, end: 6 },{ name: 电子对抗准备, start: 5.5, end: 7 },{ name: 首轮导弹发射, start: 7, end: 8.5 },{ name: 电子对抗…

Spark内核的设计原理

导读&#xff1a; 本期是DataFun深入浅出Apache Spark第一期的分享&#xff0c;主讲老师耿嘉安开场介绍了自己的从业经历&#xff0c;当前就职的数新网络与Spark相关的两款产品赛博数智引擎CyberEngine和赛博数据智能平台CyberData。 本次分享题目为《Spark内核的设计原理》&…

【测开能力提升-fastapi框架】fastapi能力提升 - 中间件与CORS

1. 中间件 1.1 介绍&#xff08;ChatGPT抄的&#xff0c;大致可以理解&#xff09; 一种机制&#xff0c;用于在处理请求和响应之前对其进行拦截、处理或修改。中间件可以在应用程序的请求处理管道中插入自定义逻辑&#xff0c;以实现一些通用的功能&#xff0c;如身份验证、…

系统架构设计师教程 第3章 信息系统基础知识-3.8 典型信息系统架构模型-解读

系统架构设计师教程 第3章 信息系统基础知识-3.8 典型信息系统架构模型-解读 3.8.1 政府信息化与电子政务3.8.1.1 电子政务的概念3.8.1.2 电子政务的内容3.8.1.2.1 政府与政府3.8.1.2.2 政府对企/事业单位3.8.1.2.3 政府对居民3.8.1.2.4 企业对政府3.8.1.2.5 居民对政府 3.8.1…

第一弹:基于ABAP OLE技术实现对服务器文件进行读写操作

前言 最近遇到这样一个需求&#xff0c;需要对BW服务器上的文件进行下载的同时写入每个用户相对应的数据。之前的服务器模版是一个死模版&#xff0c;对于这样的要求&#xff0c;我就想到了OLE技术&#xff0c;那么什么是OLE技术呢&#xff1f; 一、什么是OLE技术&#xff1f…

创建最佳实践创建 XML 站点地图--SEO

您是否正在努力让您的网站被搜索引擎索引&#xff1f;您想提高您网站的搜索引擎知名度吗&#xff1f;如果是&#xff0c;您可能会错过 XML 站点地图的重要性。XML 站点地图在改善您网站的 SEO 方面发挥着至关重要的作用。‍ XML 站点地图是您网站结构的蓝图&#xff0c;可帮助…

基于DPUSmartNic的云原生SDN解决方案

1. 方案背景与挑战 随着云计算&#xff0c;大数据和人工智能等技术的蓬勃发展&#xff0c;数据中心面临着前所未有的数据洪流和计算压力&#xff0c;这对SDN提出了更高的性能和效率要求。自云原生概念被提出以来&#xff0c;Kubernetes为云原生应用的落地提供了一个轻量级&am…

tolua++bug,int64强转double导致值不对

我C传值给lua&#xff0c;接口用的tolua。传过去值不对&#xff0c;我都懵逼了。是C强转问题。

C#中栈和堆以及修饰符

关于堆中字符串的存放 string s1"123" string s2"123" string s1"456" 此时s1输出为456 而s2仍然为123 因为在使用 String str "字符串" 的方式来创建String变量的时候&#xff0c;那么String的值便会存储在String常量池中&#x…

DevExpress中文教程 - 如何在.NET MAUI应用中实现Material Design 3?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件&#xff0c;该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 获取DevExpress v24.1正式版下载 Material Design是一个由Google开发的跨平台指南系统…

linux、windows、macos清空本地DNS缓存

文章目录 Linux&#xff1a;Windows&#xff1a;macOS&#xff1a; Linux&#xff1a; 对于使用systemd的操作系统&#xff08;如CentOS 7、Ubuntu 16.04&#xff09;&#xff0c;可以使用以下命令重启systemd-resolved服务来清除缓存&#xff1a; sudo systemctl restart sys…

Mistral联合英伟达开源12B小模型:碾压Llama 3,单张4090可跑

小模型&#xff0c;成为本周的AI爆点。 与动辄上千亿参数的大模型相比&#xff0c;小模型的优势是显而易见的:它们不仅计算成本更低&#xff0c;训练和部署也更为便捷&#xff0c;可以满足计算资源受限、数据安全级别较高的各类场景。因此&#xff0c;在大笔投入大模型训练之余…

【ROS2】高级:安全-设置访问控制

目标&#xff1a;限制节点可以使用的主题。 教程级别&#xff1a;高级 时间&#xff1a;20 分钟 内容 背景 修改 permissions.xml签署策略文件 启动节点 使用模板 背景 在继续之前&#xff0c;请确保您已完成设置安全教程。 权限非常灵活&#xff0c;可以用来控制 ROS 图中的许…

pytorch 笔记:torch.optim.Adam

torch.optim.Adam 是一个实现 Adam 优化算法的类。Adam 是一个常用的梯度下降优化方法&#xff0c;特别适合处理大规模数据集和参数的深度学习模型 torch.optim.Adam(params, lr0.001, betas(0.9, 0.999), eps1e-08, weight_decay0, amsgradFalse, *, foreachNone, maximizeFa…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中&#xff0c;不可避免的会出现忘记密码的现象。普通用户的密码如果忘记&#xff0c;可以用更高权限的用户&#xff08;例如root&#xff09;进行重置。但是如果root用户的密码忘记了&#xff0c;由于root用户本身就是最高权限&#xff0c;那这个方法…

Vue自定义指令与Vue插槽学习

文章目录 自定义指令1.指令介绍2.自定义指令3.自定义指令语法4.指令中的配置项 自定义指令-指令的值1.使用效果2.语法 插槽-默认插槽1.作用2.用处4.插槽的基本语法 插槽-具名插槽1.作用2.具名插槽语法3.v-slot的简写 插槽总结1.插槽分类2.作用3.场景4.使用步骤 自定义指令 1.指…

WPS辟谣用户文档被用于AI训练:坚守个人信息保护底线

AITOP100平台获悉&#xff0c;7 月 21 日有网友在社交平台发文称“WPS 改版了用我们的文章喂给 AI 了”“WPS 疑似把我的审签内容喂给抖音豆包 AI”。这一消息引起了部分用户对于个人信息安全的担忧。针对这一传言&#xff0c;WPS官方客服微博于当日下午作出回应&#xff0c;明…

ARM功耗管理之功耗和安全

安全之安全(security)博客目录导读 思考&#xff1a;功耗与安全&#xff1f;超频攻击&#xff1f;欠压攻击&#xff1f;低功耗流程中的安全&#xff1f; 睡眠唤醒流程中&#xff0c;安全相关寄存器的备份恢复 举例&#xff1a;比如某DMA通道&#xff0c;芯片逻辑默认为安全通…