历史文章(文章累计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
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://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