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

历史文章(文章累计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.hqwc.cn/news/106069.html

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

相关文章

释放数据的潜力:用梯度上升法解锁主成分分析(PCA)的神奇

文章目录 &#x1f340;引言&#x1f340;什么是主成分分析&#xff08;PCA&#xff09;&#xff1f;&#x1f340;传统PCA vs 梯度上升PCA&#x1f340;PCA的优化目标&#x1f340;代码实现&#x1f340;求解第一主成分&#x1f340;求解第二主成分 &#x1f340;在sklearn中封…

分类算法系列⑤:决策树

目录 1、认识决策树 2、决策树的概念 3、决策树分类原理 基本原理 数学公式 4、信息熵的作用 5、决策树的划分依据之一&#xff1a;信息增益 5.1、定义与公式 5.2、⭐手动计算案例 5.3、log值逼近 6、决策树的三种算法实现 7、API 8、⭐两个代码案例 8.1、决策树…

过等保三级的好处是什么?谁能简单说说?

虽然国家已经严格落地执行了等保2.0政策&#xff0c;但还有少数小伙伴对于等保政策不是很了解&#xff0c;有小伙伴问过等保三级的好处是什么&#xff1f;谁能简单说说&#xff1f;这里就来一起聊聊。 过等保三级的好处是什么&#xff1f; 好处1、遵循国家法律法规要求&…

【Leetcode-面试经典150题-day22】

目录 97. 交错字符串 97. 交错字符串 题意&#xff1a; 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 …

【SpringMVC】实现增删改查(附源码)

目录 引言 一、前期准备 1.1.搭建Maven环境 1.2.导入pom.xml依赖 1.3.导入配置文件 ①jdbc.properties ②generatorConfig.xml ③log4j2.xml ④spring-mybatis.xml ⑤spring-context.xml ⑥spring-mvc.xml ⑦修改web.xml文件 二、逆向生成增删改查 2.1.导入相关u…

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

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

基于springboot绩效管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

09-JVM垃圾收集底层算法实现

上一篇&#xff1a;08-JVM垃圾收集器详解 1.三色标记 在并发标记的过程中&#xff0c;因为标记期间应用线程还在继续跑&#xff0c;对象间的引用可能发生变化&#xff0c;多标和漏标的情况就有可能发生。 这里我们引入“三色标记”来给大家解释下&#xff0c;把Gcroots可达…

云服务器与内网穿透有什么区别?哪个好用?

云服务器与内网穿透有什么区别&#xff0c;哪个好用&#xff1f;如何在自己公网IP云主机上部署搭建P2P穿透&#xff1f;这里给大家汇总介绍一下&#xff0c;供大家共同学习了解。 云服务器的一些特点&#xff1a; 需要数据上云场景时&#xff0c;通常可以选择使用云服务器。 …

PPT 架构师三板斧

PPT 架构师三板斧 目录概述需求&#xff1a; 设计思路实现思路分析1.多节点上PPT 架构师三板斧2.几张框框组合有组织3.专业词汇4.切记点要点 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;ski…

【系统编程】线程池以及API接口简介

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

Spring系列文章:Bean的获取⽅式

一、简介 Spring为Bean提供了多种实例化⽅式&#xff0c;通常包括4种⽅式。&#xff08;也就是说在Spring中为Bean对象的创建准 备了多种⽅案&#xff0c;⽬的是&#xff1a;更加灵活&#xff09; 第⼀种&#xff1a;通过构造⽅法实例化 第⼆种&#xff1a;通过简单⼯⼚模式…