首页 > 编程语言 >【Java】Mybatis Plus LambdaQueryWrapper梳理

【Java】Mybatis Plus LambdaQueryWrapper梳理

时间:2023-03-20 10:04:47浏览次数:42  
标签:QueryWrapper LambdaQueryWrapper 查询 Plus User SQL Mybatis eq


【Java】Mybatis-Plus LambdaQueryWrapper梳理

前言

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

LambdaQueryWrapper 实现了 ​​QueryWrapper​​​ 的全部功能,并提供了基于 ​​Lambda​​​ 表达式的查询方式,使得查询语法更加优雅。使用 LambdaQueryWrapper,可以方便的实现各种查询条件的拼接,如 ​​where​​​、​​and​​​、​​or​​​、​​in​​​、​​like​​​、​​between​​ 等条件。

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

与QueryWrapper对比

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

LambdaQueryWrapper 优点

  1. 代码简洁,易读易写,使用 Lambda 表达式可​​避免手写字符串​​​的​​繁琐​​​和​​容易出错​​;
  2. 类型安全,LambdaQueryWrapper 在​​编译期间就能够捕获类型错误​​​,​​避免运行时出现类型错误​​;
  3. 更加灵活,LambdaQueryWrapper ​​支持链式调用​​,支持多个条件之间的 and 和 or 关系组合,支持子查询等复杂查询操作。

LambdaQueryWrapper 缺点

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

QueryWrapper 优点

  1. 在少量数据查询时,QueryWrapper 通常比 LambdaQueryWrapper 更快,因为它​​不需要解析 Lambda 表达式​​;
  2. QueryWrapper 更加灵活,可以使用字符串直接拼接 SQL,​​支持 SQL 函数等更多高级查询操作​​;
  3. 对于老旧代码,QueryWrapper 更加​​适合兼容​​​和​​扩展​​。

QueryWrapper 缺点

  1. 代码可读性和可维护性较差,​​手写 SQL 字符串容易出错​​​,并且​​不易于维护​​​和​​修改​​;
  2. 使用字符串拼接 SQL,​​容易受到 SQL 注入​​​,​​需要特别注意防范​​;
  3. ​编译期不能捕获类型错误​​,需要在运行时才能发现类型错误。

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

案例

简单查询

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUsername, "张三")
.and(w -> w.between(User::getAge, 18, 30)
.or().eq(User::getGender, 1))
.orderByDesc(User::getCreateTime);

List<User> userList = userMapper.selectList(wrapper);

首先创建了一个 LambdaQueryWrapper 对象,然后通过 eq 方法添加一个等于条件,表示查询用户名为“张三”的用户。接着,使用 and 方法添加一个条件组,该组包含了一个 between 条件和一个 or 条件,分别表示查询年龄在 18 到 30 之间的用户,或者查询性别为 1 的用户。注意,条件组中的多个条件之间默认是 and 的关系,可以通过 or 方法切换为 or 的关系。最后,使用 orderByDesc 方法对查询结果进行排序,按照创建时间倒序排列。

使用 LambdaQueryWrapper 进行查询时,还可以通过 select 方法来自定义查询字段,从而实现对查询结果的灵活控制。

select

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 20)
.select(User::getId, User::getUserName, User::getAge);

List<User> userList = userMapper.selectList(wrapper);

首先通过 LambdaQueryWrapper 对象创建了一个查询条件,然后使用 ​​eq​​​ 方法添加了一个​​等于条件​​,表示查询年龄为 20 的用户。接着,通过 select 方法来自定义查询字段,只查询 id、username、age 三个字段,这些字段是以逗号分隔的字符串形式传入的。最后,调用 selectList 方法执行查询操作,得到查询结果。


标签:QueryWrapper,LambdaQueryWrapper,查询,Plus,User,SQL,Mybatis,eq
From: https://blog.51cto.com/u_15719567/6131804

相关文章

  • mybatis-plus的${ew.sqlSegment},${ew.sqlSelect},${ew.sqlSet},${ew.customSqlSegment}
    说明:ew是mapper方法里的@Param(Constants.WRAPPER)WrapperqueryWrapper对象1、${ew.customSqlSegment}会直接在前面添加where@Select(select*fromsys_user${ew.cust......
  • 02.MyBatis的操作
    一、MyBatis的CRUD操作案例:用户信息表的操作我们使用面向接口编程来实现。<mappernamespace="com.sdbi.mapper.UserMapper">(一)添加添加一条用户信息。1、在UserMappe......
  • Mybatis 源码(三):Mybatis配置解析
    Mybatis有两个核心配置,全局配置会影响Mybatis的执行;Mapper配置定义了查询的SQL,下面我们来看看Mybatis是如何加载配置文件的。本文基于Mybatis源码(一):源码编译准......
  • 使用element plus 实现在web上向 图床传输图片文件并返回信息
    <!--图片上传-->      <el-upload         ref="uploadRef"         class="upload-demo"        ......
  • 尚硅谷MyBatis4_核心配置文件详解
    <environments>可以配置多个连接数据库的环境defaultdefault属性指明了默认使用的环境id多个environment示例<configuration><!--设置连接数据库的环境-->......
  • 尚硅谷MyBatis3_select
    select的返回值类型比较多,所以考虑的情况也相对复杂。这里记录一下查询相关知识。查询的时候mapper中没有指定ResultType或者ResultMap,就会在执行sql语句的时候出......
  • mybatis-plus代码生成器使用
    以下仅供自己个人学习使用去mybatis-plus官网https://baomidou.com/pages/779a6e/引入相关的pom.xml依赖<!--代码生成器--><dependency>......
  • 【MyBatis框架】mybatis和spring整合
    spring和mybatis整合1.整合思路需要spring通过单例方式管理SqlSessionFactory。spring和mybatis整合生成代理对象,使用SqlSessionFactory创建Sql......
  • 【MyBatis框架】查询缓存-一级缓存原理
    查询缓存1.什么是查询缓存mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybaits提供一级缓存,和二级缓存。缓存模式图如图一级缓存是......
  • 【MyBatis框架】高级映射-多对多查询
    多对多查询1.需求查询用户及用户购买商品信息。2.sql语句查询主表是:用户表关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所......