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

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

历史文章(文章累计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篇

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

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

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

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

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

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

悟纤:为啥呢?

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

悟纤:原来是这样子呢。

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

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

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

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

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

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

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

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

导读

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的操作,如下示例:

@Testpublic void testQueryWrapper1() {    QueryWrapper wrapper = new QueryWrapper();    wrapper.lambda().like(User::getName,"悟");    List userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

运行结果:

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

2.2 使用类LambdaQueryWrapper接收

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

@Testpublic void testQueryWrapper2() {    LambdaQueryWrapper wrapper = new QueryWrapper().lambda();    wrapper.like(User::getName,"悟");    List userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

2.3 new LambdaQueryWrapper创建

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

@Testpublic void testQueryWrapper3() {    LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();    wrapper.like(User::getName,"悟");    List userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

2.4 使用Wrappers创建

MP提供了一个构建Wrappers:

@Testpublic void testQueryWrapper4() {    LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();    wrapper.like(User::getName,"悟");    List userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

看下底层的实现来着:

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

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

2.5 使用LambdaQueryChainWrapper创建

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

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

@Testpublic void testQueryWrapper5() {    List userList = new LambdaQueryChainWrapper<>(userMapper).like(User::getName,"悟").list();    userList.forEach(System.out::println);}

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

User user = new LambdaQueryChainWrapper<>(userMapper).eq(User::getId,1).one();System.out.println(user);

三、LambdaQueryWrapper的其它小技巧

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

3.1 指定查询字段

指定要查询的字段:

@Testpublic void testQueryWrapper6() {    LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();    wrapper.select(User::getId,User::getName);    wrapper.like(User::getName,"悟");    List userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

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

3.2 condition动态条件拼接

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

@Testpublic void testQueryWrapper7() {    LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();    String name = "悟";    wrapper.like(name != null,User::getName,"悟");    List userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

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

3.3 链式拼接条件

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

@Testpublic void testQueryWrapper8() {    LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();    wrapper.select(User::getId,User::getName);    wrapper.like(User::getName,"悟").eq(User::getEmail,"[email protected]");    List userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

运行结果:

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

小结

这一节讲解了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

你可能感兴趣的:(MyBatis-Plus系列,mybatis,tomcat,java)