使用LambdaQueryWrapper再也不担心字段拼写错误了 [MyBatis-Plus系列] - 第485篇

news2024/11/19 15:31:15

历史文章(文章累计480+)

国内最全的Spring Boot系列之一

国内最全的Spring Boot系列之二

国内最全的Spring Boot系列之三

国内最全的Spring Boot系列之四

国内最全的Spring Boot系列之

国内最全的Spring Boot系列之六

EasyPoi实战系列集合

MyBatis-Plus快速开始[MyBatis-Plus系列] - 第482篇

MyBatis-Plus快速实现增删改[MyBatis-Plus系列] - 第483篇

MyBatis-Plus实现普通查询/分页查询[MyBatis-Plus系列] - 第484篇

​悟纤:师傅,你说,为什么人会有情绪?

师傅:是所有人都会让你情绪波动很大吗?

悟纤:那肯定不是呀,不认识的人,不会让我有情绪。

师傅:那就对了,你越在意的人,越会让你情绪波动

悟纤:为啥呢?

师傅:因为她在你心里了,你在意她,在意她的言行举止,在意对你的看法,在意她说的话,自然而言,你就会被对方所影响到了。

悟纤:原来是这样子呢。

师傅:你知道两个人相处是什么踏实嘛?

悟纤:徒儿愚昧,请师傅赐教。

师傅:踏实的感觉大概就是,因为你在,她不在招摇。因为她在,你不在动摇。最后她成为你的唯一,你成为她的全部。

悟纤:师傅,这个好深奥,我的好好消化下。

师傅:相识不易,珍惜吧,我的徒儿。

悟纤:嗯,珍惜遇到的每一个人,师傅咱们赶紧开始学习吧~我已经迫不及待了。我要快快地成长起来,才有能力去守护我在意的人。

导读

Hi,大家好,我是悟纤。我就是我,不一样的烟火。我就是我,与众不同的小苹果。

为了更方便的实现动态 SQL,Mybatis Plus 在其基础上扩展了 LambdaQueryWrapper,LambdaQueryWrapper 提供了更加简便的查询语法,同时也避免了 SQL 注入的风险。

LambdaQueryWrapper 通过函数式编程的方式,提供了多种方法用于实现各种查询条件的拼接,这些方法包括 eq、ne、gt、ge、lt、le、in、notIn、like、notLike、between、notBetween、isNull、isNotNull 等。

👇🏻👇🏻👇🏻EasyPoi实战系列

01.MyBatis-Plus是什么以及特性[MyBatis-Plus系列]-第482篇

02.MyBatis-Plus快速开始 [MyBatis-Plus系列]-第483篇

03.MyBatis-Plus快速实现增删改 [MyBatis-Plus系列]-第484篇

04.MyBatis-Plus实现普通查询/分页查询[MyBatis-Plus系列]-第485篇

一、与QueryWrapper对比

LambdaQueryWrapper 和 QueryWrapper 都是 Mybatis Plus 中的查询条件封装类,其中 LambdaQueryWrapper 是基于 Lambda 表达式的实现,而 QueryWrapper 是基于字符串的实现。它们的优缺点如下:

1.1 LambdaQueryWrapper 优点

(1)代码简洁,易读易写,使用 Lambda 表达式避免手写字符串繁琐容易出错

(2)类型安全,LambdaQueryWrapper 在编译期间就能够捕获类型错误避免运行时出现类型错误

(3)更加灵活,LambdaQueryWrapper 支持链式调用,支持多个条件之间的 and 和 or 关系组合,支持子查询等复杂查询操作。

1.2 LambdaQueryWrapper 缺点

(1)LambdaQueryWrapper 基于 Lambda 表达式实现,可能存在一些性能问题,在大数据量查询时可能会影响查询性能。

1.3 QueryWrapper 优点

(1)在少量数据查询时,QueryWrapper 通常比 LambdaQueryWrapper 更快,因为它不需要解析 Lambda 表达式

(2)QueryWrapper 更加灵活,可以使用字符串直接拼接 SQL,支持 SQL 函数等更多高级查询操作

(3)对于老旧代码,QueryWrapper 更加适合兼容扩展

1.4 QueryWrapper 缺点

(1)代码可读性和可维护性较差,手写 SQL 字符串容易出错,并且不易于维护修改

(2)使用字符串拼接 SQL,容易受到 SQL 注入需要特别注意防范

(3)编译期不能捕获类型错误,需要在运行时才能发现类型错误。

综上推荐使用 LambdaQueryWrapper(此外,LambdaQueryWrapper 还具有良好的兼容性和扩展性,可以轻松适应不同的业务需求,提高开发效率和代码质量)。

二、LambdaQueryWrapper的使用

对于LambdaQueryWrapper的使用方式有很多种,这里介绍一下博主知道的几种。

2.1 使用wrapper.lambda()方法

使用QueryWrapper构建出来一个 queryWrapper,然后使用方法lambda()来进行Lambda的操作,如下示例:

<span style="color:#333333"><span style="background-color:#fafafa"><code>@Test</code><code><span style="color:#ca7d37">public</span> void testQueryWrapper1() {</code><code>    QueryWrapper<User> wrapper = <span style="color:#ca7d37">new</span> QueryWrapper();</code><code>    wrapper.lambda().like(User::getName,<span style="color:#dd1144">"悟"</span>);</code><code>    <span style="color:#ca7d37">List</span><User> userList = userMapper.selectList(wrapper);</code><code>    userList.<span style="color:#ca7d37">forEach</span>(System.out::println);</code><code>}</code><code>​</code></span></span>

运行结果:

2.2 使用类LambdaQueryWrapper接收

为了简化lambda的使用,我们可以改写成LambdaQueryWrapper构造器,语法如下:

<span style="color:#333333"><span style="background-color:#fafafa"><code>@Test</code><code><span style="color:#ca7d37">public</span> void testQueryWrapper2() {</code><code>    LambdaQueryWrapper<User> wrapper = <span style="color:#ca7d37">new</span> QueryWrapper().lambda();</code><code>    wrapper.like(User::getName,<span style="color:#dd1144">"悟"</span>);</code><code>    <span style="color:#ca7d37">List</span><User> userList = userMapper.selectList(wrapper);</code><code>    userList.<span style="color:#ca7d37">forEach</span>(System.out::println);</code><code>}</code><code>​</code></span></span>

2.3 new LambdaQueryWrapper创建

可以再次将QueryWrapper.lambda()简化,变成这个样子:

<span style="color:#333333"><span style="background-color:#fafafa"><code>@Test</code><code><span style="color:#ca7d37">public</span> void testQueryWrapper3() {</code><code>    LambdaQueryWrapper<User> wrapper = <span style="color:#ca7d37">new</span> LambdaQueryWrapper<>();</code><code>    wrapper.like(User::getName,<span style="color:#dd1144">"悟"</span>);</code><code>    <span style="color:#ca7d37">List</span><User> userList = userMapper.selectList(wrapper);</code><code>    userList.<span style="color:#ca7d37">forEach</span>(System.out::println);</code><code>}</code><code>​</code></span></span>

2.4 使用Wrappers创建

MP提供了一个构建Wrappers:

<span style="color:#333333"><span style="background-color:#fafafa"><code>@Test</code><code><span style="color:#ca7d37">public</span> void testQueryWrapper4() {</code><code>    LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();</code><code>    wrapper.like(User::getName,<span style="color:#dd1144">"悟"</span>);</code><code>    <span style="color:#ca7d37">List</span><User> userList = userMapper.selectList(wrapper);</code><code>    userList.<span style="color:#ca7d37">forEach</span>(System.out::println);</code><code>}</code><code>​</code></span></span>

看下底层的实现来着:

和2.3的new的方式是一样的,没啥区别。

2.5 使用LambdaQueryChainWrapper创建

MyBatis-Plus还提供了一种链式查询的方式,和上面的代码效果一样。

但是这种写法偏向于炫技,可读性没有上面的代码强,大家可以根据需要自行选择方式。

<span style="color:#333333"><span style="background-color:#fafafa"><code>@Test</code><code><span style="color:#ca7d37">public</span> void testQueryWrapper5() {</code><code>    <span style="color:#ca7d37">List</span><User> userList = <span style="color:#ca7d37">new</span> LambdaQueryChainWrapper<>(userMapper).like(User::getName,<span style="color:#dd1144">"悟"</span>).<span style="color:#ca7d37">list</span>();</code><code>    userList.<span style="color:#ca7d37">forEach</span>(System.out::println);</code><code>}</code><code>​</code></span></span>

如果只想查询一条记录,例如通过id查询某条记录的详情,使用.one()即可,例如:

<span style="color:#333333"><span style="background-color:#fafafa"><code>User user = new LambdaQueryChainWrapper<>(userMapper).e<span style="color:#dd1144">q(User::getId,1)</span>.one();</code><code>System.out.println(user);</code><code>​</code></span></span>

三、LambdaQueryWrapper的其它小技巧

最后在来看看在使用LambdaQueryWrapper的一些小技巧来着。

3.1 指定查询字段

指定要查询的字段:

<span style="color:#333333"><span style="background-color:#fafafa"><code>@Test</code><code><span style="color:#ca7d37">public</span> void testQueryWrapper6() {</code><code>    LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();</code><code>    wrapper.select(User::getId,User::getName);</code><code>    wrapper.like(User::getName,<span style="color:#dd1144">"悟"</span>);</code><code>    <span style="color:#ca7d37">List</span><User> userList = userMapper.selectList(wrapper);</code><code>    userList.<span style="color:#ca7d37">forEach</span>(System.out::println);</code><code>}</code><code>​</code></span></span>

说明:核心代码是wrapper.select()。

3.2 condition动态条件拼接

在实际项目中,name这个字段是前端查询条件,当这个参数为null的时候,就不需要拼接这个参数,这样的需求一般是if的方式来实现,对于LambdaQueryWrapper也提供了一种写法:

<span style="color:#333333"><span style="background-color:#fafafa"><code>@Test</code><code><span style="color:#ca7d37">public</span> void testQueryWrapper7() {</code><code>    LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();</code><code>    String name = <span style="color:#dd1144">"悟"</span>;</code><code>    wrapper.like(name != <span style="color:#ca7d37">null</span>,User::getName,<span style="color:#dd1144">"悟"</span>);</code><code>    <span style="color:#ca7d37">List</span><User> userList = userMapper.selectList(wrapper);</code><code>    userList.<span style="color:#ca7d37">forEach</span>(System.out::println);</code><code>}</code><code>​</code></span></span>

说明:在使用like()的时候,第一个参数就是condition,如果为true的话,那么才会进行参数的设置。

3.3 链式拼接条件

对于LambdaQueryWrapper的条件支持链式编程:

<span style="color:#333333"><span style="background-color:#fafafa"><code>@Test</code><code><span style="color:#ca7d37">public</span> void testQueryWrapper8() {</code><code>    LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();</code><code>    wrapper.select(User::getId,User::getName);</code><code>    wrapper.like(User::getName,<span style="color:#dd1144">"悟"</span>).eq(User::getEmail,<span style="color:#dd1144">"aa@qq.com"</span>);</code><code>    <span style="color:#ca7d37">List</span><User> userList = userMapper.selectList(wrapper);</code><code>    userList.<span style="color:#ca7d37">forEach</span>(System.out::println);</code><code>}</code><code>​</code></span></span>

运行结果:

小结

这一节讲解了LambdaQueryWrapper的使用,来一下总结本节的重点:

(1)LambdaQueryWrapper与QueryWrapper的对比:各有优劣势,在可以实现业务的情况下,优先使用LambdaQueryWrapper。

(2)LambdaQueryWrapper的几种构建方式:常用的方式是Wrappers.lambdaQuery();

(3)LambdaQueryWrapper中使用的一些小技巧:使用Lambda函数的方式指定查询字段、condition动态条件拼接、链式编程拼接条件。

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟纤学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoothttps://t.cn/R3QDhU0

SpringSecurity5.0http://t.cn/A6ZadMBe

ShardingJDBC分库分表http://t.cn/A6ZarrqS

分布式事务解决方案http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7

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

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

相关文章

数据结构--二叉树-堆(1)

文章目录 树概念相关的基本概念树的表示 二叉树概念特殊二叉树性质 堆二叉树的顺序结构堆的概念 堆的实现初始化数组初始化为堆向上调整向下调整插入删除打印、摧毁、判空、获取堆顶数据验证 堆的应用堆排序TopK问题 树 概念 树是一种常见的非线性的数据结构&#xff0c;&…

Docker 入门:如何打包、部署并运行你的应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

cmake构建和编译

什么是CMake&#xff1f; CMake本身是一个工具集&#xff0c;由五个可执行的程序组成&#xff1a;cmake、ctest、cpack、cmake-gui和ccmake&#xff0c;其中cmake可以说是出镜率最高的明星级别程序了&#xff0c;它用于在构建项目的第一步&#xff0c;进行项目的配置、生成和构…

SQL4 查询结果限制返回行数

描述 题目&#xff1a;现在运营只需要查看前2个用户明细设备ID数据&#xff0c;请你从用户信息表 user_profile 中取出相应结果。 示例&#xff1a; iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijin…

健身房预约小程序开发全攻略

随着健身行业的快速发展&#xff0c;健身房预约小程序成为了方便、快捷的预约方式&#xff0c;为健身爱好者提供了更好的服务。本文将介绍如何开发健身房预约小程序。 第一步&#xff1a;登录小程序制作平台 首先&#xff0c;进入后台&#xff0c;点击【轻应用小程序】中的【去…

MATLAB入门-数据的导入和导出

MATLAB入门-数据的导入和导出 注&#xff1a;本篇文章是课程学习笔记&#xff0c;课程链接为&#xff1a;头歌 常见的几个导入数据的方法 load函数 load函数专门用于引入MATLAB的.mat格式数据&#xff0c;十分的简单方便。 例如&#xff1a;一个-ASCII编码形式存储的数据文件…

usb学习笔记

框架 usb 驱动是基于usb core 的&#xff0c;设备插上之后&#xff0c;host 层自然会进行识别&#xff0c;设备驱动通过core层的接口操作设备&#xff0c;而不用直接面对usb硬件。对于应用层需要封装成一个usb 的设备。 驱动是基于urb 数据进行操作的。 49 static void usb_mo…

关于this

参考阮一峰老师对于this的原理理解 一&#xff1a;this的定义 在严格模式下和非严格模式下&#xff0c;this的在全局中会有差别 来自阮一峰老师对于this的由来的理解 由于函数可以在不同的运行环境中运行&#xff0c;所以需要一种机制&#xff0c;能够在函数的内部获取当前运…

大数据课程L6——网站流量项目的SparkStreaming

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的SparkStreaming概述; ⚪ 掌握网站流量项目的SparkStreaming实现 Wordcount 底层流程; ⚪ 掌握网站流量项目的SparkStreaming实现历史批次的累积处理; ⚪ 掌握网站流…

Vue中使用Google的reCAPTCHA v3人机校验-demo

reCAPTCHA Google 提供了 reCAPTCHA&#xff08;v3 和 v2&#xff09;和 reCAPTCHA Enterprise&#xff0c;帮助您保护网站免受欺诈活动、垃圾内容和滥用行为的侵扰 reCAPTCHA v3 「所有的頁面都會有 reCaptcha 的追蹤功能」 不需做任何事&#xff0c;v3會針對使用者行為&#…

IDEA编写Java编程代码提示插件

网址&#xff1a; aiXcoder idea软件中使用代码提示&#xff1a; aixcoder

C语言实现扫雷小游戏

1.首先扫雷游戏要存储布置好的雷信息&#xff0c;需要一个二维数组 不是雷放* 雷&#xff1a;# 不是雷&#xff1a;0 雷&#xff1a;1 2. 给2个二维数组 9*9 一个存放雷的信息&#xff0c;一个存放布置好雷的信息 3.为了防止在统计坐标周围的…

回归与聚类算法系列④:岭回归

目录 1. 背景 2. 数学模型 3. 特点 4. 应用领域 5. 岭回归与其他正则化方法的比较 6、API 7、代码 8、总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数…

OLED透明屏控制:引领未来交互技术的创新突破

OLED透明屏控制技术作为一项颠覆性的显示技术&#xff0c;正逐渐改变我们与屏幕互动的方式。 其高透明度、触摸和手势交互、高画质和图像显示效果等特点&#xff0c;为用户提供了更智能、便捷的交互体验&#xff0c;同时也在各行各业中展现出无限的应用可能性。 在此&#xf…

【算法】反悔贪心

文章目录 反悔贪心力扣题目列表630. 课程表 III871. 最低加油次数LCP 30. 魔塔游戏2813. 子序列最大优雅度 洛谷题目列表P2949 [USACO09OPEN] Work Scheduling GP1209 [USACO1.3] 修理牛棚 Barn RepairP2123 皇后游戏&#xff08;&#x1f6b9;省选/NOI− TODO&#xff09; 相关…

Mybatis---resultMap详解

目录 一、resultMap介绍 二、自定义映射关系 一、resultMap介绍 该标签的作用是自定义映射关系。 Mybatis可以将数据库结果封装到对象中&#xff0c;是因为结果集和对象属性名相同&#xff08;也就是你写的pojo类型的参数名和数据库的字段名相同&#xff09; 但是如果当他们不…

【计算机网络】 TCP——四次挥手

文章目录 流程考点 流程 主动方打算关闭连接&#xff0c;此时会发送一个TCP首部FIN标志位被置为1的报文&#xff0c;也即FIN报文&#xff0c;之后主动方进入FIN_WAIT_1状态。被动方收到该报文后&#xff0c;就向主动方发送ACK应答报文&#xff0c;接着被动方进入CLOSE_WAIT状态…

HTML + CSS 实践1

Hello,小伙伴们 这是一个十分精美的网站&#xff0c;可以拿着它去制作一些个人网站 index.html <!DOCTYPE html> <meta charset"utf-8"> <html> <head> <title>首页</title> </head> <style type"text/css"…

【业务功能篇105】 微服务-springcloud-springboot-电商订单模块--秒杀服务-定时任务【上篇】

秒杀服务 一、商品上架 秒杀活动的结构图 通过定时任务触发&#xff1a; 定时任务由spring提供&#xff0c;需要通过注解开启&#xff0c;这里通过定义一个配置类&#xff0c;注入spring,对其配置类进行相应的注解&#xff0c;当然也可以注解放在我们的服务启动类上cron表达…

linux系统移植到开发板简要过程(移植bootloader引导加载程序---移植linux内核---制作根文件系统)

一.标准linux启动过程图 对于linux启动流程分析&#xff0c;我们需要移植bootloader引导加载程序---移植linux内核---制作根文件系统镜像文件&#xff1b; 二.为什么进行系统移植&#xff1f; 对于不同的硬件平台&#xff0c;linux系统启动流程大体相同&#xff0c;但是资源需求…