MybatisPlus-05.核心功能-条件构造器

一.条件构造器

我们前面使用的MP功能主要是根据id进行操作的,并未涉及到复杂查询。而根据id所进行的增删改查操作在MP中都有直接的封装。但是遇到复杂的查询条件时,如何使用MP进行操作是我们要考虑的问题。因此MP为我们提供了条件构造器。

在BaseMapper接口中有很多Wrapper接口。这些Wrapper接口就是用来指定复杂查询条件的。AbstractWrapper中实现了很多复杂条件的sql语句查询。

eq:等于。ne:不等于。gt:大于。ge:大于等于。lt:小于。le:小于等于。like:模。也就是说复杂的where条件AbstractWrapper都能帮助我们构造。

我们关注下面的两个子类UpdateWrapper和QueryWrapper。这两个子类除了继承AbstractWrapper,也可以构造复杂where语句外,在此基础上扩展了相关的功能。如QueryWrapper用于查询时,不仅可以用来构建复杂where语句,还可以进行select功能,指定要查询的select字段(select column1, column2 ... from ... where ...)。

 UpdateWrapper扩展了set部分,除了可以定义复杂where语句外,还可以设置set语句条件。可以使用setSql,在该方法里面使用字符串编写set条件,直接拼入sql语句中。

这个在特殊场景下会用到,但比较少见。

综上,UpdateWrapper和QueryWrapper就是在AbstractWrapper的基础上做了拓展。

除了这些还有对应的Lambda,这些LambdaUpdateWrapper和LambdaQueryWrapper功能上与上面的一样,只是使用了Lambda表达式。

二.案例演示

1.QueryWrapper

  @Testvoid testQueryByQueryWrapper() {QueryWrapper<User> queryWrapper = new QueryWrapper<User>().select("id","username","info","balance").like("username","o").ge("balance",1000);userMapper.selectList(queryWrapper);}// 将Jack的余额设置为2000@Testvoid testUpdateByQueryWrapper() {// 1.要更新的数据User user = new User();user.setBalance(2000);// 2.更新的条件QueryWrapper<User> queryWrapper = new QueryWrapper<User>().eq("username","Jack");// 3.执行更新userMapper.update(user,queryWrapper);}

QueryWrapper可以支持链式编程,在第一个演示案例中我们除了定义复杂的查询语句外,还使用QueryWrapper来指定要查询的字段。通过其中的select方法来指定。

在第二个演示案例中我们要指定更新的数据,即创建一个User对象并将余额设置为2000。然后使用QueryWrapper来定义复杂的查询语句并执行更新。

因为是查询语句,且查询出来的是一个列表,因此使用selectList进行查询。并将QueryWrapper对象传入。

2.UpdateWrapper

void testUpdateQuery() {List<Long> ids = List.of(1L,2L,4L);// 1.构造Wrapper对象UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>().setSql("balance = balance - 200").in("id",ids);// 2.执行更新操作。由于这次每个用户余额均不相同,因此无法创建对象来指定余额值,且每个用户余额不同,因此要使用updateWrapper的setSql动态拼接sql语句,且在updateWrapper中指定要操作的数据类型userMapper.update(null,updateWrapper);}

这个情况比较特殊,由于这次每个用户余额均不相同,因此无法创建对象来指定余额值,且每个用户余额不同,因此要使用updateWrapper的setSql动态拼接sql语句,且在updateWrapper中指定要操作的数据类型。

sql语句要使用in,因此要构建一个集合来封装id。

在这里由于是根据不同User动态更新,因此使用setSql指定更新条件为balance = balance - 200。

三.Lambda表达式

我们上边的代码在指定字段时都是硬编码,即直接将字段名写死。这样不好因此我们要使用软编码。这就要使用Lambda表达式。

// 查询出名字带o的,存款大于等于1000元的id,username,info,balance字段@Testvoid testLambdaQueryByQueryWrapper() {LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>().select(User::getId,User::getUsername,User::getInfo,User::getBalance).like(User::getUsername,"o").ge(User::getBalance,1000);userMapper.selectList(queryWrapper);}// 将Jack的余额设置为2000@Testvoid testUpdateByLambdaQueryWrapper() {// 1.要更新的数据User user = new User();user.setBalance(2000);// 2.更新的条件LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>().eq(User::getBalance,"Jack");// 3.执行更新userMapper.update(user,queryWrapper);}// 将用户id为1,2,4的用户余额减200@Testvoid testLambdaUpdateQuery() {List<Long> ids = List.of(1L,2L,4L);// 1.构造Wrapper对象LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<User>().setSql("balance = balance - 200").in(User::getId,ids);// 2.执行更新操作。由于这次每个用户余额均不相同,因此无法创建对象来指定余额值,且每个用户余额不同,因此要使用updateWrapper的setSql动态拼接sql语句,且在updateWrapper中指定要操作的数据类型userMapper.update(null,updateWrapper);}

使用Lambda表达式,将字段换为查询对象::get方法,利用反射来获取字段。

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

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

相关文章

ES6从入门到精通:常用知识点

变量声明ES6引入了let和const替代var。let用于声明可变的块级作用域变量&#xff0c;const用于声明不可变的常量。块级作用域有效避免了变量提升和污染全局的问题。let name Alice; const PI 3.1415;箭头函数箭头函数简化了函数写法&#xff0c;且自动绑定当前上下文的this值…

51单片机教程(十一)- 单片机定时器

11、单片机定时器 项目目标 通过定时器/计数器实现流水灯控制。知识要点 定时器的结构。TMOD和TCON;定时/计数器工作方式;定时/计数器编程步骤;1、项目分析 前面的流水灯的时间控制通过空循环语句来实现,定时不是很精确。本章通过用定时器来控制流水灯任务可以实现精确的时…

基于opencv的疲劳驾驶监测系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

Vue 2 和 Vue 3 区别

1. 响应式系统原理 Vue 2&#xff1a;利用Object.defineProperty()实现属性拦截。存在局限性&#xff0c;无法自动监测对象属性增减&#xff0c;需用Vue.set/delete&#xff1b;数组变异方法要重写&#xff1b;深层对象递归转换性能差。Vue 3&#xff1a;采用 ES6 Proxy代理对…

mv重命名报错:-bash:syntax error near unexpected token ‘(‘

文章目录 一、报错背景二、解决方法2.1、方法一&#xff1a;文件名加引号2.2、方法二&#xff1a;特殊字符前加\进行转义 一、报错背景 在linux上对一文件执行重命名时报错。原因是该文件名包含空格与括号。 文件名如下&#xff1a; aa &#xff08;1).txt执行命令及报错如下…

AWS 开源 Strands Agents SDK,简化 AI 代理开发流程

最近&#xff0c;亚马逊网络服务&#xff08;AWS&#xff09;宣布推出 Strands Agents(https://github.com/strands-agents/sdk-python)&#xff0c;这一开源软件开发工具包&#xff08;SDK&#xff09;采用模型驱动的方法&#xff0c;助力开发者仅用数行代码即可构建并运行人工…

利用 AI 打造的开发者工具集合

如图. 我利用 AI 开发了这个网站花了半个小时. 目前就上了 四个 我想到的工具。 大家可以自行体验下&#xff1a;https://xiaojinzi123.github.io 本文并不是宣传什么产品. 只是感概 Ai 真的改变我的工作方式啊. 虽然现在 AI 对于一些已有的项目进行更改代码. 由于不了解业务,…

[自然语言处理]计算语言的熵

一、要求利用给定的中英文语料&#xff0c;分别计算英语字母、英语单词、汉字、汉语词的熵&#xff0c;并和已公开结果比较&#xff0c;思考汉语的熵对汉语编码和处理的影响。二、实验内容2.1 统计英文语料的熵1.代码(1)计算英文字母的熵import math #计算每个英文字母的熵 def…

如何处理“协议异常”错误

在Java中&#xff0c;“协议异常”通常是指在网络通信或者处理特定协议相关操作时出现的异常。以下是一些处理“协议异常”错误的方法&#xff1a;一、理解协议异常的类型和原因HTTP协议异常原因&#xff1a;在进行HTTP通信时&#xff0c;可能会因为请求格式错误、响应状态码异…

Spark 4.0的VariantType 类型以及内部存储

背景 本文基于Spark 4.0 总结 Spark中的 VariantType 类型,用尽量少的字节来存储Json的格式化数据 分析 这里主要介绍 Variant 的存储,我们从VariantBuilder.buildJson方法(把对应的json数据存储为VariantType类型)开始: public static Variant parseJson(JsonParser …

跨越十年的C++演进:C++20新特性全解析

跨越十年的C演进系列&#xff0c;分为5篇&#xff0c;本文为第四篇&#xff0c;后续会持续更新C23~ 前3篇如下&#xff1a; 跨越十年的C演进&#xff1a;C11新特性全解析 跨越十年的C演进&#xff1a;C14新特性全解析 跨越十年的C演进&#xff1a;C17新特性全解析 C20标准…

LeetCode--40.组合总和II

前言&#xff1a;如果你做出来了39题&#xff0c;但是遇到40题就不会做了&#xff0c;那我建议你去再好好缕清39题的思路&#xff0c;再来看这道题&#xff0c;会有种豁然开朗的感觉解题思路&#xff1a;这道题其实与39题基本一致&#xff0c;所以本次题解是借着39题为基础来讲…

Docker Desktop 安装到D盘(包括镜像下载等)+ 汉化

目录 一、 开启电脑虚拟化 1. 搜索并打开控制面板 2. 点击程序 3. 点击启用或关闭 Windows 功能 4. 打开相关功能 5. 没有Hyper-V的情况&#xff1a; 二、配置环境 1. 更新 WSL 到最新版 2. 设置 WSL 2为默认版本 3. 安装 Ubuntu 三. WSL 迁移到D盘 1. 停止运行wsl…

基于 OpenCV 的图像 ROI 切割实现

一、引言 在计算机视觉领域&#xff0c;我们经常需要处理各种各样的图像数据。有时候&#xff0c;我们只对图像中的某一部分区域感兴趣&#xff0c;例如在一张人物照片中&#xff0c;我们可能只关注人物的脸部。在这种情况下&#xff0c;将我们感兴趣的区域从整个图像中切割出…

Linux操作系统01

一、操作系统简史 二、Linux诞生与分支 三、Linux内核与发行版 内核版本号&#xff1a;cat /proc/version 、 u name -a 操作系统内核漏洞 【超详细】CentOS编译安装升级新内核_centos源码编译安装新版本内核 ntfs-CSDN博客 四、虚拟机 五、Docker容器技术 典型靶场集成环境…

Chrome 下载文件时总是提示“已阻止不安全的下载”的解决方案

解决 Chrome 谷歌浏览器下载文件时提示“已阻止不安全的下载”的问题。 ‍ 前言 最近更新 Chrome 后&#xff0c;下载文件时总是提示“已拦截未经验证的下载内容”、“已阻止不安全的下载”&#xff1a; ‍ 身为一个互联网冲浪高手&#xff0c;这些提醒非常没有必要&#x…

RocketMQ延迟消息是如何实现的?

RocketMQ的延迟消息实现机制非常巧妙&#xff0c;其核心是通过多级时间轮 定时任务 消息重投递来实现的。以下是详细实现原理&#xff1a; ⏰ 一、延迟消息的核心设计 预设延迟级别&#xff08;非任意时间&#xff09; RocketMQ不支持任意时间延迟&#xff0c;而是预设了18个…

D3 面试题100道之(21-40)

这里是D3的面试题,我们从第 21~40题 开始逐条解答。一共100道,陆续发布中。 🟩 面试题(第 21~40 题) 21. D3 中的数据绑定机制是怎样的? D3 的数据绑定机制通过 selection.data() 方法实现。它将数据数组与 DOM 元素进行一一对应,形成三种状态: Update Selection:已…

PyTorch nn.Parameter理解及初始化方法总结

一、理解 nn.Parameter 本质是什么&#xff1f; nn.Parameter 是 torch.Tensor 的一个子类。这意味着它继承了 Tensor 的所有属性和方法&#xff08;如 .data, .grad, .requires_grad, .shape, .dtype, .device, .backward() 等&#xff09;。它本身不是一个函数或模块&#xf…

【Linux】环境基础和开发工具

Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便…