mybatis-plus中的条件构造器wrapper

2023-11-11

接口方法的参数中,会出现各种 Wrapper,比如 queryWrapper、updateWrapper 等。Wrapper 的作用就是用于定义各种各样的条件(where)。所以不管是查询、更新、删除都会用到 Wrapper。

如 QueryWrapper 是 Mybatis Plus 中一个条件拼装查询器,作用是让我们以 Java 对象的方式构建 where 之后的查询条件,不用直接写 SQL。

1. Wrapper的继承关系:

Wrapper 条件构造抽象类

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

2. 常用条件

比较大小: ( =, <>, >, >=, <, <= )

eq(R column, Object val); // 等价于 =,例: eq("name", "老王") ---> name = '老王'
ne(R column, Object val); // 等价于 <>,例: ne("name", "老王") ---> name <> '老王'
gt(R column, Object val); // 等价于 >,例: gt("name", "老王") ---> name > '老王'
ge(R column, Object val); // 等价于 >=,例: ge("name", "老王") ---> name >= '老王'
lt(R column, Object val); // 等价于 <,例: lt("name", "老王") ---> name < '老王'
le(R column, Object val); // 等价于 <=,例: le("name", "老王") ---> name <= '老王'

范围:(between、not between、in、not in)

between(R column, Object val1, Object val2); // 等价于 between a and b, 例: between("age", 18, 30) ---> age between 18 and 30
notBetween(R column, Object val1, Object val2); // 等价于 not between a and b, 例: notBetween("age", 18, 30) ---> age not between 18 and 30
in(R column, Object... values); // 等价于 字段 IN (v0, v1, ...),例: in("age",{1,2,3}) ---> age in (1,2,3)
notIn(R column, Object... values); // 等价于 字段 NOT IN (v0, v1, ...), 例: notIn("age",{1,2,3}) ---> age not in (1,2,3)
inSql(R column, Object... values); // 等价于 字段 IN (sql 语句), 例: inSql("id", "select id from table where id < 3") ---> id in (select id from table where id < 3)
notInSql(R column, Object... values); // 等价于 字段 NOT IN (sql 语句)

模糊匹配:(like)

like(R column, Object val); // 等价于 LIKE '%值%',例: like("name", "王") ---> name like '%王%'
notLike(R column, Object val); // 等价于 NOT LIKE '%值%',例: notLike("name", "王") ---> name not like '%王%'
likeLeft(R column, Object val); // 等价于 LIKE '%值',例: likeLeft("name", "王") ---> name like '%王'
likeRight(R column, Object val); // 等价于 LIKE '值%',例: likeRight("name", "王") ---> name like '王%'

空值比较:(isNull、isNotNull)

isNull(R column); // 等价于 IS NULL,例: isNull("name") ---> name is null
isNotNull(R column); // 等价于 IS NOT NULL,例: isNotNull("name") ---> name is not null

分组、排序:(group、having、order)

groupBy(R... columns); // 等价于 GROUP BY 字段, ..., 例: groupBy("id", "name") ---> group by id,name
orderByAsc(R... columns); // 等价于 ORDER BY 字段, ... ASC, 例: orderByAsc("id", "name") ---> order by id ASC,name ASC
orderByDesc(R... columns); // 等价于 ORDER BY 字段, ... DESC, 例: orderByDesc("id", "name") ---> order by id DESC,name DESC
having(String sqlHaving, Object... params); // 等价于 HAVING ( sql语句 ), 例: having("sum(age) > {0}", 11) ---> having sum(age) > 11

拼接、嵌套 sql:(or、and、nested、apply)

or(); // 等价于 a or b, 例:eq("id",1).or().eq("name","老王") ---> id = 1 or name = '老王'
or(Consumer<Param> consumer); // 等价于 or(a or/and b),or 嵌套。例: or(i -> i.eq("name", "李白").ne("status", "活着")) ---> or (name = '李白' and status <> '活着')
and(Consumer<Param> consumer); // 等价于 and(a or/and b),and 嵌套。例: and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status <> '活着')
nested(Consumer<Param> consumer); // 等价于 (a or/and b),普通嵌套。例: nested(i -> i.eq("name", "李白").ne("status", "活着")) ---> (name = '李白' and status <> '活着')
apply(String applySql, Object... params); // 拼接sql(若不使用 params 参数,可能存在 sql 注入),例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08") ---> date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
last(String lastSql); // 无视优化规则直接拼接到 sql 的最后,可能存若在 sql 注入。
exists(String existsSql); // 拼接 exists 语句。例: exists("select id from table where age = 1") ---> exists (select id from table where age = 1)

QueryWrapper 条件:

select(String... sqlSelect); // 用于定义需要返回的字段。例: select("id", "name", "age") ---> select id, name, age
select(Predicate<TableFieldInfo> predicate); // Lambda 表达式,过滤需要的字段。
lambda(); // 返回一个 LambdaQueryWrapper

UpdateWrapper 条件:

set(String column, Object val); // 用于设置 set 字段值。例: set("name", null) ---> set name = null
setSql(String sql); // 用于设置 set 字段值。例: setSql("name = '老李头'") ---> set name = '老李头'
lambda(); // 返回一个 LambdaUpdateWrapper

3. QueryWrapper 示例

 @Test
    public void testQueryWrapper() {
        // Step1:创建一个 QueryWrapper 对象
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        // Step2: 构造查询条件
        queryWrapper
                .select("id", "name", "age")
                .lt("age", 23)//小于23岁
                .like("name", "i");//name包括i字母

        // Step3:执行查询
        userMapper
                .selectList(queryWrapper)
                .forEach(System.out::println);
    }

4. UpdateWrapper

基本语法:

set
set(String column, Object val)
set(boolean condition, String column, Object val): set("name", "老李头"): set("name", "")--->数据库字段值变为空字符串
例: set("name", null)--->数据库字段值变为null
setSql
setSql(String sql)
设置 SET 部分 SQL

例: setSql("name = '老李头'")

5. UpdateWrapper 示例

@Test
  public void testUpdateWrapper() {
      int reduceAge = 2;
      User user = new User();

      // 更新用户数据的wrapper
      UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>();
      //修改数据的语句
      updateWrapper.set("email", "winspace@erbadagang.com");//使email字段的值更新为“winspace@erbadagang.com”
      updateWrapper.setSql("age = age - " + reduceAge);//自定义的sql语句
      //条件
      updateWrapper.eq("id", 4);
      userMapper.update(user, updateWrapper);
  }

6. UpdateWrapper 其他更新方法

先 select 取出数据,然后通过 set 方法修改 entity 的值,再 save 到数据库。

@Test
public void testUpdateById() {
    User user = userMapper.selectById(4);
    user.setAge(88);
    userMapper.updateById(user);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis-plus中的条件构造器wrapper 的相关文章

  • 如何使用固定数量的工作线程实现简单线程

    我正在寻找最简单 最直接的方法来实现以下内容 主程序实例化worker 执行任务的线程 Only n任务可以同时运行 When n已达到 不再有工人 开始直到计数 正在运行的线程回落到下方n 我觉得Executors newFixedThr
  • 如何将变量的全部内容发送/导出到文本文件/xml 文件/剪贴板?

    我想将实例的内容 最好以树形形式 发送给某人 打印屏幕是不行的 因为类太复杂了 您需要将输出转回实例吗 在这种情况下 其他答案都是正确的 如果您只想手动检查实例的内容 理想情况下您的类都将实现toString 你可以将其重定向到一个文件 如
  • 在 Java 中从 SOAPMessage 获取原始 XML

    我已经在 J AX WS 中设置了 SOAP WebServiceProvider 但我无法弄清楚如何从 SOAPMessage 或任何 Node 对象获取原始 XML 下面是我现在获得的代码示例 以及我试图获取 XML 的位置 WebSe
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • Java - JPanel 内有边距和 JTextArea

    我想创建这样的东西 主面板有其边距 x 并且 TextArea 位于该面板的中心 几乎填满了面板 底部是另一个具有自定义尺寸 高度 y 的面板 可以使用某些快捷方式将其切换为可见和不可见 底部面板有 FlowLayout 和几个元素 问题是
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • Cucumber DataTable 错误 - io.cucumber.datatable.UndefinedDataTableTypeException:无法将 DataTable 转换为 cucumber.api.DataTable

    尝试使用 cucumber selenium java intelliJ 运行场景 但在其中一个步骤中出现有关 DataTable 的错误 在我开始使用测试运行程序并更改周围的一些内容之前 数据表工作正常并正确转换该步骤的参数 但我就是无法
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • @Embeddable 中的 @GenerateValue

    我已将实体的 id 分离到一个单独的 Embeddable 类中 该实体如下 Entity Table name users public class Users EmbeddedId private Users pk id private
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时

随机推荐

  • 内网怎么使用https

    内网环境下面需要用到https 通过浏览器调起相机的功能 一般情况下我们使用openssl证书生成即可 有个问题是生成的证书 通过nginx配置以后 在客户端谷歌浏览器chrome访问的时候会有个不安全的提示 这里使用mkcert进行处理
  • typedef的用法小总结

    首先是typedef历史遗留问题 经常看到很多人写结构体就写 typedef struct A int a int b A A b 我就一直很纳闷 为什么不直接写 A b呢 昨天查资料才知道 原来这个是因为c语言遗留下来的 在C语言中 结构
  • Notepad++配合Finger Text提高Verilog编码效率

    文章目录 简介 安装方法 使用方法 配置文件的获取 简介 做FPGA开发的一般都不会选择IDE环境自带的编辑器 一是因为界面不够美观 二是自动补全功能不够完善 而我经常使用的是Notepad 支持Verilog语法高亮和最基本的关键字补全
  • 单细胞测序基础知识

    构建文库 上机测序 根据不同的荧光检测不同的碱基 质量控制 质控QC 去除低质量的序列 表达定量 统计reads数 进而得到表达矩阵 标准化 让所有样本处在同一起跑线上 主成分分析PCA 图中每个点都代表一个样本 不同颜色表示不同类别 在绿
  • 华为太长脸了,扔出“3张王炸”!再次颠覆互联网行业

    8月29日 在没有任何预告 任何发布会的情况下 华为扔出一张 王炸 华为新手机Mate60pro开售 9月8日 华为废话不多说 再次扔出 王炸 牌 Mate60 Pro MateX5开启预订 一经开抢 卖到断货 就在刚刚 华为AITO问界新
  • .bat批处理命令常用操作

    转载自 https www cnblogs com aspirant p 7233893 html 感谢博主的分享 转载过来学习一下 Bat命令学习 一 基础语法 1 批处理文件是一个 bat 结尾的文本文件 这个文件的每一行都是一条DOS
  • 【解决问题】使用pip安装模块后,VS Code无法加载

    easydict 显示安装成功 但在导入包时显示红色波浪线 Import easydict could not be resolved 解决办法 设置 gt 搜索 python autoComplete extraPaths gt 将包的地
  • YOLOV5摔倒检测识别

    一 摔倒检测的实际意义 摔倒检测是一种人工智能技术 可用于监测和识别可能发生在老年人 幼儿 体育运动员等群体中的摔倒事件 在实际应用中 摔倒检测技术可以帮助本文 及时发现摔倒事件 通过监测设备和传感器 及时发现摔倒事件 可以避免因为无人发现
  • 【K8S】之 下载Kubeadm、node组件和命令行工具

    文章目录 一 安装kubeadm kubelet和kubectl 1 添加kubernets apt源公钥文件 2 加入kubernetes的官方源 3 安装工具 二 核心组件镜像下载 1 先查看kubeadm版本 2 再根据查看其所需镜像
  • org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates

    今天在整合swagger的时候遇到了这个问题 解决了一天终于搞定了 分享出来希望大家少走弯路 报错的具体信息如下 org springframework beans factory BeanDefinitionStoreException
  • (模板)米勒罗宾素数测试

    18位素数 154590409516822759 19位素数 2305843009213693951 梅森素数 19位素数 4384957924686954497 LL prime 6 2 3 5 233 331 LL qmul LL x
  • splunk安装在 windows、linux and Mc OS

    Install Splunk Enterprise for windows linux and Mc OS
  • Python 不用selenium 带你高效爬取京东商品评论

    文章目录 一 项目说明 1 项目背景 2 项目环境 二 项目实施 1 项目分析 2 代码实现 导入模块和定义常量 爬取评论主体函数 主函数 三 项目分析和说明 1 运行测试 2 改进分析 3 其他说明 一 项目说明 1 项目背景 一天 一朋
  • vuex的实现原理?(vue2)

    通常我们使用vuex 都是通过下载vuex插件 自己创建一个store目录 在里面创建一个js文件 在文件中引入vuex vue use我们的vuex从而通过实例化一个vuex 定义五大核心从而实现一个基本的vuex 那我们如何不下载插件
  • 基于STM32F407ZET6的环境温湿度监控系统(粤嵌GEC-M4)

    注意使用事项 开发板如下 由于外部晶振是8M 需要修改setup和stm32f4头文件的晶振值 操作如下 system stm32f4xx c的254行 define PLL M 8 stm32f4xx h的127行 define HSE
  • 算法笔记:Frechet距离度量

    曲线之间相似性的度量 它考虑了沿曲线的点的位置和顺序 1 概念 1 1 直观理解 主人走路径A 狗走路径B 他们有不同的配速方案 主人和狗各自走完这两条路径过程中所需要的最短狗绳长度 在某一种配速下需要的狗绳长度 但其他配速下需要的狗绳长度
  • Dictionary字典的用法及用途原理

    Dictionary 实例化Dictionary private Dictionary
  • wx原生微信小程序入门常用总结

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 定义值和修改值 1 定义值 2 修改值 1 代码 2 代码说明 3 注意点 二 点击事件 三 微信小程序的数据缓存 以setStorage为例使用 0 s
  • java linux class_Linux 下运行 class 文件

    1 基本命令 java cp searchDir classFile cp searchDir 指定从该目录搜索 class 文件 classFile 类路径 不包含 class 后缀 2 没有包结构的class文件 2 1 文件所在目录结
  • mybatis-plus中的条件构造器wrapper

    接口方法的参数中 会出现各种 Wrapper 比如 queryWrapper updateWrapper 等 Wrapper 的作用就是用于定义各种各样的条件 where 所以不管是查询 更新 删除都会用到 Wrapper 如 QueryW