MyBatis-Plus:条件构造器Wrapper

news2024/12/28 2:33:34

目录

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条件

    @Test
    public 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    

    @Test
    public 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 = '狐山'

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

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

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

    @Test
    public 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.coloradmin.cn/o/688682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes(k8s)容器编排数据存储

目录 1 什么是数据卷1.1 存储卷概述1.2 存储卷类型1.2.1 非持久性存储1.2.2 网络连接性存储1.2.3 分布式存储1.2.4 云端存储 2 emptydir2.1 使用场景2.2 使用示例2.2.1 案例说明2.2.2 创建资源清单2.2.3 创建deploy2.2.4 访问测试 2.3 测试存储卷2.3.1 登录sidecar2.3.2 登录ng…

springboot+shiro+redis实现session共享和cache共享

在分布式应用中&#xff0c;若是使用了负载均衡&#xff0c;用户第一次访问&#xff0c;连接的A服务器&#xff0c;进行了登录操作进入了系统&#xff0c;当用户再次操作时&#xff0c;请求被转发到了B服务器&#xff0c;用户并没有在B进行登录&#xff0c;此时用户又来到了登录…

MySQL 主从复制[异步 同步 半同步复制] 读写分离 优化 (非常重要)

MySQL 主从复制 1、什么是读写分离&#xff1f; 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据…

MVP: Multi-view Prompting Improves Aspect Sentiment Tuple Prediction

MVP: Multi-view Prompting Improves Aspect Sentiment Tuple Prediction 论文地址: https://arxiv.org/pdf/2305.12627.pdf 论文代码: https://github.com/ZubinGou/multi-view-prompting 1. 介绍 Multi-view Prompting (MVP) 1.1 研究目标 本文提出了多试图提示(MVP)模型…

python 深度学习 解决遇到的报错问题

目录 一、解决报错ModuleNotFoundError: No module named ‘tensorflow.examples 二、解决报错ModuleNotFoundError: No module named ‘tensorflow.contrib‘ 三、安装onnx报错assert CMAKE, ‘Could not find “cmake“ executable!‘ 四、ImportError: cannot import na…

67、基于51单片机ADXL345计步器系统设计(程序+原理图+PCB源文件+参考论文+开题报告+设计资料+元器件清单等)

摘 要 计步器是一种颇受欢迎的日常锻炼进度监控器&#xff0c;可以激励人们挑战自己&#xff0c;增强体质&#xff0c;帮助瘦身。早期设计利用加重的机械开关检测步伐&#xff0c;并带有一个简单的计数器。晃动这些装置时&#xff0c;可以听到有一个金属球来回滑动&#xff0c…

MongoDB集群搭建(四)

基础环境准备 安装Docker 创建Docker网络 因为需要使用Docker搭建MongoDB集群&#xff0c;所以先创建Docker网络 docker network create mongo-cluster docker network ls 创建挂载目录 创建对应的挂载目录来存储配置文件以及日志文件 # 创建配置文件目录 mkdir -p /opt/mongo…

MYSQL数据类型介绍

一、MySQL的数据类型 主要包括以下五大类&#xff1a; 整数类型&#xff1a;BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT 浮点数类型&#xff1a;FLOAT、DOUBLE、DECIMAL 字符串类型&#xff1a;CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY…

测试进阶面试必问12个算法题,洞悉出题思路,拿的就是高薪!

可以明确的一点是&#xff0c;面试算法题目在难度上&#xff08;尤其是代码难度上&#xff09;会略低一些&#xff0c;倾向于考察一些基础数据结构与算法&#xff0c;对于高级算法和奇技淫巧一般不作考察。 代码题主要考察编程语言的应用是否熟练&#xff0c;基础是否扎实&…

GPIO通用输入输出口

GPIO 1、简介1.1、基本结构1.2、工作模式使用库函数的使用方法 2、GPIO输出LED流水灯蜂鸣器 3、GPIO输入按键控制LED光敏传感器控制蜂鸣器 1、简介 1、GPIO(general Purpose Input Output)通用输入输出口&#xff1b; 2、可配置为8种输入输出模式&#xff1b; 3、引脚电平&…

如何在Linux部署Jdk1.8备忘录(高效版)

提示&#xff1a;高效简洁版 文章目录 前言一、整理环境二、部署jdk1.8三、建立Java环境四、生效验证总结 前言 作为备忘录阐述&#xff0c;力求简洁明了&#xff0c;直接开始贴步骤。 一、整理环境 1.首先查看服务器上是否有Java&#xff0c;如果自带恭喜你不用装了。 java…

Linux5.gcc(g++),动静态链接,make和Makefile

1.gcc od 文件 :查看二进制文件。 2.动静态库(此处简单认识&#xff0c;详细内容后面介绍) ldd 文件 :查看文件所依赖的库。 file 文件 :查看文件的具体信息。 在Linux当中&#xff0c;程序在链接的时候&#xff0c;默认是动态链接(后缀是.so) 如果要使用静态链接&#xff…

Redis的3大特殊数据结构(3)-Geospatial

Geospatial地理空间&#xff0c;Redis 在 3.2 版本中加入了地理空间&#xff08;geospatial&#xff09;以及索引半径查询的功能&#xff0c;主要用在需要地理位置的应用上。将指定的地理空间位置&#xff08;经度、纬度、名称&#xff09;添加到指定的 key 中&#xff0c;这些…

JS逆向入门教程p1 浏览器设置 常用工具

1.准备工作 http 编程语言(网络apidavaScript) 逆向(js逆向 安卓逆向 ios逆向 PC逆向)调试 图像识别 下载城南Post助手、fiddler、wireshark(鲨鱼)抓包工具; 通过进程抓包 fiddler插件: f12配置推荐,实验功能全部关闭 时间线上的分配检测:js的运行时间线 关闭时间…

【软考网络管理员】2023年软考网管初级常见知识考点(21)-安装及配置DHCP服务器(图文结合)

涉及知识点 安装DHCP服务器&#xff0c;配置DHCP服务器&#xff0c;如何去安装DHCP服务器&#xff0c;如何去配置DHCP服务器&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学…

项目进度计划表的制作方法解析:简单易懂的步骤指南

项目进度计划表怎么做&#xff1f;创建项目进度表是项目管理的一个重要组成部分&#xff0c;它有助于确保项目的成功完成。它是一个详细的计划&#xff0c;概述了实现项目目标所需的工作范围、时间线、里程碑和资源。本文将讨论制定项目进度表所涉及的步骤。 1、定义项目范围: …

掌握Gradio的Audio模块:实时交互与多功能展示

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

C语言学习(二十七)---指针练习题(三)

在上一节的内容中&#xff0c;我们继续学习了字符数组的相关指针练习题&#xff0c;今天我们将继续将练习有关二维数组的指针练习题和有关结构体的指针练习题&#xff0c;好了&#xff0c;话不多说&#xff0c;开整&#xff01;&#xff01;&#xff01;&#xff01; 二维数组…

从零开始学习:如何使用Selenium和Python进行自动化测试?

安装selenium 打开命令控制符输入&#xff1a;pip install -U selenium 火狐浏览器安装firebug&#xff1a;www.firebug.com&#xff0c;调试所有网站语言&#xff0c;调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件&#xff0c;实现简单的浏览器操 作的录制与回…

开源社 KCC@硅谷正式成立,搭建国际开源交流平台

大家好&#xff01;我很高兴向大家宣布一个重要的消息&#xff1a; 开源社在硅谷的KCC&#xff08;Kaiyuanshe City Community&#xff09;正式成立了&#xff01;作为开源社的一项重要举措&#xff0c;KCC硅谷将成为国际开源交流的桥梁&#xff0c;架起中国和全球开源社区之间…