MyBatis-Plus:条件构造器Wrapper

目录

1.Wrapper概述

1.1.Wrapper的继承关系

1.2.Wapper介绍 

1.3.各个构造器使用区别

1.4.构造器常用方法

2.Wrapper常用构造器介绍

2.1.QueryWrapper

2.2.UpdateWrapper

2.3.LambdaQueryWrapper

2.4.AbstractWrapper

3. Lambda条件构造器

3.1.示例

4.鸣谢


MyBatis-Plus系列推荐阅读顺序:

  • MyBatis-Plus快速上手
  • MyBatis-Plus 条件构造器(Wrapper)
  • Mybatis-Plus 常用操作

1.Wrapper概述

​ 我们在实际操作数据库的时候会涉及到很多的条件。所以MP为我们提供了一个功能强大的条件构造器 Wrapper 。使用它可以让我们非常方便的构造条件。

Wrapper是MyBatis-Plus提供的一种查询条件封装类,用于构建查询条件。它是一个抽象类,有三个具体的实现类,分别是QueryWrapper、UpdateWrapper和LambdaQueryWrapper。其中,QueryWrapper和LambdaQueryWrapper用于构建查询条件,UpdateWrapper用于构建更新条件。

使用Wrapper可以方便地构建复杂的查询条件,支持链式调用,可以通过and、or等方法将多个条件组合起来。同时,Wrapper还提供了一些常用的方法,如eq、ne、gt、ge、lt、le等,可以方便地构建等值、不等值、大于、小于等各种条件。

另外,LambdaQueryWrapper是MyBatis-Plus 3.x新增的功能,它支持使用Lambda表达式构建查询条件,使得代码更加简洁易读。

1.1.Wrapper的继承关系

在这里插入图片描述

Wrapper  条件构造抽象类-- AbstractWrapper 查询条件封装,用于生成 sql 中的 where 语句。-- QueryWrapper Entity 对象封装操作类,用于查询。-- UpdateWrapper Update 条件封装操作类,用于更新。-- AbstractLambdaWrapper 使用 Lambda 表达式封装 wrapper-- LambdaQueryWrapper 使用 Lambda 语法封装条件,用于查询。-- LambdaUpdateWrapper 使用 Lambda 语法封装条件,用于更新。

MybatisPlus的EntityWrapper,在3.0版本以上就没了,改为了QueryWrapper。 

1.2.Wapper介绍 

Wrapper : 条件构造抽象类,最顶端父类

AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

QueryWrapper : Entity 对象封装操作类,不是用lambda语法

UpdateWrapper : Update 条件封装,用于Entity对象更新操作

AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。

LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper

LambdaUpdateWrapper : Lambda 更新封装Wrapper

1.3.各个构造器使用区别

        1)QueryWrapper、QueryChainWrapper只能指定需要的数据库列名
        2)LambdaQueryWrapper、LambdaQueryChainWrapper可以通过Lambda获取数据库列名
        3)QueryWrapper 、LambdaQueryWrapper不能使用链式查询的方式,必须借助BaseMapper来执行
        4)QueryChainWrapper、LambdaQueryChainWrapper可以使用链式查询的方式,如list(),one()

1.4.构造器常用方法

  • eq:equals,等于

  • gt:greater than ,大于 >

  • ge:greater than or equals,大于等于≥

  • lt:less than,小于<

  • le:less than or equals,小于等于≤

  • between:相当于SQL中的BETWEEN

  • like:模糊匹配。like(“name”,“黄”),相当于SQL的name like ‘%黄%’

  • likeRight:模糊匹配右半边。likeRight(“name”,“黄”),相当于SQL的name like ‘黄%’

  • likeLeft:模糊匹配左半边。likeLeft(“name”,“黄”),相当于SQL的name like ‘%黄’

  • notLike:notLike(“name”,“黄”),相当于SQL的name not like ‘%黄%’

  • isNull

  • isNotNull

  • and:SQL连接符AND

  • or:SQL连接符OR

  • in: in(“age",{1,2,3})相当于 age in(1,2,3)

  • groupBy: groupBy(“id”,“name”)相当于 group by id,name

  • orderByAsc :orderByAsc(“id”,“name”)相当于 order by id ASC,name ASC

  • orderByDesc :orderByDesc (“id”,“name”)相当于 order by id DESC,name DESC

 

2.Wrapper常用构造器介绍

字面来理解,就是定义各种各样的条件,相当于sql语句中的(where),

wrapper条件构造器是一个接口,是一个顶级父类,它下面有各种实现类,今天重点介绍LambdaQueryWrapper和LambdaUpdateWrapper

2.1.QueryWrapper

QueryWrapper是用于查询的Wrapper条件构造器,可以通过它来构建SELECT语句中的WHERE条件

    @Testpublic void testQueryWrapper() {// 查询条件构造器QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();wrapper.eq("banner_id", id);// 查询操作List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);//我们可以引入lambda,避免在代码中写类似的于banner_id的硬编码QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();wrapper.lambda().eq(BannerItem::getBannerId, id);List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);}

2.2.UpdateWrapper

QueryWrapper是用于查询的Wrapper条件构造器,可以通过它来构建SELECT语句中的WHERE条件:

SQL SET 字段
        例: set("name", "老李头")
        例: set("name", "")--->数据库字段值变为空字符串
        例: set("name", null)--->数据库字段值变为null    

    @Testpublic void testUpdateWrapper() {UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();updateWrapper.set("age", 20).eq("name", "张三");int affectedRows = userMapper.update(null, updateWrapper);}

2.3.LambdaQueryWrapper

Lambda条件构造器是一种更加便捷、类型安全的Wrapper条件构造器,可以通过Lambda表达式来构建WHERE条件

作用:

        1.字段检查,防止字段写错

        2.防止传入的数据为null作为条件

书写方式如下:

        1.引入对象

        2.调用函数

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

LambdaQueryWrapper<BannerItem> wrapper = new QueryWrapper<BannerItem>().lambda();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

我们可以再次将QueryWrapper<BannerItem>.lambda()简化,变成这个样子

LambdaQueryWrapper<BannerItem> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

链式查询
MyBatis-Plus还提供了一种链式查询的方式,和上面的代码效果一样。
但是这种写法偏向于炫技,可读性没有上面的代码强,大家可以根据需要自行选择方式。

List<BannerItem> bannerItems = new LambdaQueryChainWrapper<>(bannerItemMapper).eq(BannerItem::getBannerId, id).list();

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

BannerItem bannerItem = new LambdaQueryChainWrapper<>(bannerItemMapper).eq(BannerItem::getId, id).one();

2.4.AbstractWrapper

完整的AbstractWrapper方法可以参照:​​​​​​​ https://baomidou.com/guide/wrapper.html#abstractwrapper

3. Lambda条件构造器

​        前面在使用条件构造器时列名都是用字符串的形式去指定。这种方式无法在编译期确定列名的合法性。

         所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。

Lambda条件构造器相比于传统的Wrapper条件构造器,具有以下几个好处:

  1. 更加简洁易懂:Lambda条件构造器使用Lambda表达式来构建WHERE条件,代码更加简洁易懂,不需要繁琐的字符串拼接(避免硬编码)。

  2. 更加类型安全:Lambda条件构造器在编译时就能检查出类型错误,避免在运行时出现类型转换异常的问题。

  3. 更加灵活:Lambda条件构造器支持链式调用,可以方便地组合多个条件,还支持自定义SQL片段,更加灵活

3.1.示例

要执行的查询对应的SQL如下

SELECT id,user_name,PASSWORD,NAME,age,address 
FROM USER 
WHERE age > 18 AND address = '狐山'

如果使用之前的条件构造器写法如下

    @Testpublic void testLambdaWrapper(){QueryWrapper<User> queryWrapper = new QueryWrapper();queryWrapper.gt("age",30);queryWrapper.eq("address","黄山");List<User> users = userMapper.selectList(queryWrapper);}

如果使用Lambda条件构造器写法如下

    @Testpublic void testLambdaWrapper2(){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.gt(User::getAge,30);queryWrapper.eq(User::getAddress,"黄山");List<User> users = userMapper.selectList(queryWrapper);}

4.鸣谢

[1] https://blog.csdn.net/lt326030434/article/details/106571670

[2]

[3]

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

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

相关文章

Spring Boot 如何使用 Spring Security 进行认证和授权

Spring Boot 如何使用 Spring Security 进行认证和授权 在 Web 应用程序中&#xff0c;认证和授权是非常重要的功能。Spring Security 是一个基于 Spring 框架的强大的安全框架&#xff0c;它提供了完整的认证和授权解决方案&#xff0c;并且可以轻松地集成到 Spring Boot 应用…

服务器编程:数据库连接池

引言&#xff1a; 数据库连接池和线程池的思想一样&#xff0c;是为了避免频繁创建和销毁数据库连接导致的性能开销。如果一个项目频繁的需要访问数据库&#xff0c;那么它就有可能需要频繁的创建/销毁数据库连接&#xff0c;那么我们可以采用数据库连接池的技术&#xff0c;在…

【几何数学】【Python】【C++】将线段沿着线段方向延长一定长度,求新的点

p1点和p2点是一条线段的两端&#xff0c;沿着p1指向p2的方向&#xff0c;将线段长度延伸长度x&#xff0c;求延伸后的点ep。如下图&#xff1a; Python代码&#xff1a; import mathdef extend_line_segment(p1, p2, extension_length):"""延伸线段长度并返回…

Redis各数据类型操作命令

一、Redis数据类型及命令 &#xff08;一&#xff09;String 类别命令描述命令示例备注取/赋值操作赋值set key valueset lclkey lclvalue取值 get keyget lclkey取值并赋值getset key valuegetset lclkey1 lclvalue1获取原值&#xff0c;并设置新的值仅当不存在时赋值setnx k…

多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% …

Java 实现word、excel、ppt、txt等办公文件在线预览功能!

如何用 Java 实现word、excel、ppt、txt等办公文件在线预览功能&#xff1f;本文告诉你答案&#xff01; java 实现办公文件在线预览功能是一个大家在工作中也许会遇到的需求&#xff0c;网上些公司专门提供这样的服务&#xff0c;不过需要收费。 如果想要免费的&#xff0c;…

设计模式第19讲——命令模式(Command)

目录 一、什么是命令模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 抽象命令&#xff08;Command&#xff09;——Command 5.2 接收者&#xff08;Receiver&#xff09;——Chef 5.3 具体命令&#xff08;Co…

【读书笔记】《软件工程导论》

目录 一、软件工程概述 二、启动阶段 三、计划阶段 四、实施阶段 五、收尾阶段 一、软件工程概述 软件危机&#xff1a;在计算机软件的开发和维护过程中遇到的一系列严重问题。 软件危机的产生与自身的特点有关&#xff0c;还与软件开发、管理的方法不正确有关。 软件危…

Go语言并发微服务分布式高可用

Go语言并发微服务分布式高可用 Go语言基础 环境安装 命令行输入go&#xff0c;当前操作系统Os环境中依赖于PATH指定的日录们去找命令(可执行文件)windows会优先搜索当前日录&#xff0c;当前日录没有才依赖PATH中指定的日录 环境变量: 操作系统运行环境中提前定义好的变量P…

6-js基础-3

JavaScript 基础 - 3 知道什么是数组及其应用的场景&#xff0c;掌握数组声明及访问的语法&#xff0c;具备利用数组渲染柱形图表的能力 今日重点&#xff1a; 循环嵌套数组综合案例 今日单词&#xff1a; 循环嵌套 利用循环的知识来对比一个简单的天文知识&#xff0c;我们…

Scrapy框架之MongoDB通过配置文件管理参数--Linux安装MongoDB--图形管理工具

目录 MongoDB通过配置文件 问题 解决方案 步骤 提示 Linux安装MongoDB 环境 下载依赖与安装包 解压安装 MongoDB GUI管理工具 独立软件GUI软件 Robo 3T使用 VSCode集成GUI插件 MongoDB通过配置文件 问题 启动MongoDB时&#xff0c;编写参数太麻烦 解决方案 通过配…

android h5 宿舍报修管理系统myeclipse开发mysql数据库编程服务端java计算机程序设计

一、源码特点 android h5 宿舍报修管理系统是一套完善的WEBandroid设计系统&#xff0c;对理解JSP java&#xff0c;安卓app编程开发语言有帮助&#xff08;系统采用web服务端APP端 综合模式进行设计开发&#xff09;&#xff0c;系统具有完整的 源代码和数据库&#xff0c;系…