Mybatis 框架 ( 四 ) QueryWrapper

4.5.Wrapper条件构造器

在这里插入图片描述

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

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

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

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

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

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

LambdaUpdateWrapper : Lambda 更新封装Wrapper

具体方法可以参考官网 条件构造器 | MyBatis-Plus (baomidou.com)

4.5.1.基本结构

queryWrapper.方式( 判断标识, 实体类属性(对应字段), 查询值)

第一个参数 判断标识 : 是根据查询值的有效性来判断是否增加这条查询条件, boolean类型, false 不增加这条查询

第二个参数 实体类属性(对应字段) : 可以使用lambda表达式指明字段 如: RepositoryInfo::getRepositoryName

第三个参数 查询值 : 外部传来的用于查询的值

queryWrapper.like( true, RepositoryInfo::getRepositoryName, "西部");

生成 sql 为

select repository_id, repository_name, repository_code, repository_phone, repository_state, repository_address, repository_start_date
from repository_info
where repository_name like '%西部%'

4.5.2. 常见用法 ( 一 )

模糊查询 .like() LIKE ‘%值%’ .likeLeft() LIKE ‘%值’ .likeRight() LIKE ‘值%’

精确查询 .eq() = 值 .ne() != 值

范围查询 .gt() >值 .ge() >= 值 .lt() <值 .le() <= 值 .between() BETWEEN 值1 AND 值2

排序 .orderByAsc() ORDER BY 字段, … ASC .orderByDesc() ORDER BY 字段, … DESC

实例:

封装查询条件 page类

import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;import java.util.Date;@Data
public class RepositoryInfoPage {/*** 仓库名称  模糊查询 like*/private String repositoryName;/*** 仓库代号  精确查询  eq*/private String repositoryCode;/*** 启动时间* 范围查询 gt  lt*/@DateTimeFormat(pattern = "yyyy-MM-dd")private Date repositoryStartDateFrom;@DateTimeFormat(pattern = "yyyy-MM-dd")private Date repositoryStartDateTo;/*** 仓库状态#state#0=停用, 1=可用  -1 = 全部* 精确查询 eq*/private Integer repositoryState = -1;}

通过 LambdaQueryWrapper 组织条件进行查询, 根据 RepositoryInfoPage 接收到查询信息, 并对repository_phone 进行排序

使用 链式写法

// 组织条件
LambdaQueryWrapper<RepositoryInfo> queryWrapper = new LambdaQueryWrapper<RepositoryInfo>().like(page.getRepositoryName() != null, RepositoryInfo::getRepositoryName, page.getRepositoryName()).eq(!StringUtils.isEmpty(page.getRepositoryCode()), RepositoryInfo::getRepositoryCode, page.getRepositoryCode()).ge(page.getRepositoryStartDateFrom() != null, RepositoryInfo::getRepositoryStartDate, page.getRepositoryStartDateFrom()).le(page.getRepositoryStartDateTo() != null, RepositoryInfo::getRepositoryStartDate, page.getRepositoryStartDateTo()).eq(page.getRepositoryState() != null && page.getRepositoryState() != -1, RepositoryInfo::getRepositoryState, page.getRepositoryState()).orderByAsc(RepositoryInfo::getRepositoryPhone);// 进行查询
List<RepositoryInfo> list = repositoryInfoService.list(queryWrapper);

生成 SQL

SELECT repository_id,repository_name,repository_code,repository_phone,repository_state,repository_address,repository_start_date FROM repository_info WHERE (repository_name LIKE ? AND repository_code = ? AND repository_start_date >= ? AND repository_start_date <= ? AND repository_state = ?) ORDER BY repository_phone ASC

4.5.3.常见用法 ( 二 )

空值查询 .isNull() 字段 IS NULL .isNotNull() 字段 IS NOT NULL

筛选查询 .in() 字段 IN (values.get(0), values.get(1), …) .notIn() 字段 NOT IN (values.get(0), values.get(1), …)

.inSql() 字段 NOT IN ( sql语句 )

追加SQL .last( sql 语句 ) 将 sql 语句 拼接到 sql 的最后

实例:

page.getNums() 是 [1, 3, 5 ] 的集合

// 组织条件
LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>().isNotNull( BrandInfo::getBrandCnName).in(page.getNums() != null && page.getNums().size() > 0, BrandInfo::getBrandNum, page.getNums()).last( " limit  10 " );
// 进行查询
List<BrandInfo> list = brandInfoService.list(queryWrapper) ;

生成 SQL

SELECT brand_id,brand_cn_name,brand_en_name,brand_logo_path,brand_web_url,brand_num,brand_info,brand_founded_date 
FROM brand_info WHERE (brand_cn_name IS NOT NULL AND brand_num IN (?,?,?)) limit 10

4.5.4.常见用法( 三 ) 嵌套

.and() : 相连的条件必须同时满足, 默认都是 and 相连

.or() : 主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)

两个配合通常可以 建立比较 复杂的查询

.nested() : 正常嵌套 不带 AND 或者 OR

实例 1:

BrandNum = 2 同时( and ) BrandCnName like ‘hua’ 或者 BrandCnName like ‘hua’

// 组织条件
LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>().eq( num != null, BrandInfo::getBrandNum, num ).like( !StringUtils.isEmpty(name), BrandInfo::getBrandCnName, name).or().like( !StringUtils.isEmpty(name), BrandInfo::getBrandEnName, name);
// 进行查询
List<BrandInfo> list = brandInfoService.list(queryWrapper);

生成 SQL

SELECT brand_id,brand_cn_name,brand_en_name,brand_logo_path,brand_web_url,brand_num,brand_info,brand_founded_date 
FROM brand_info 
WHERE (brand_num = ? AND brand_cn_name LIKE ? OR brand_en_name LIKE ?)Parameters: 2(Integer), %hua%(String), %hua%(String)Row: 1, 华为, huawei, /images/brand/huawei.png, https://www.vmall.com/, 2, 中华有为,华为是一家全球领先的信息通信技术解决方案提供商,致力于推动数字化智能化的时代发展。, 2003-11-13
Row: 35, 施华洛世奇, shihua, /images/brand/shihua.png, https://shihua.com/, 2, 施华洛世奇是一家奢侈品和珠宝品牌,以其精美的水晶产品和精湛的工艺而享誉全球。, 1972-07-14
Total: 2

实例 2:

BrandNum = 2 或者( or ) BrandCnName like ‘hua’ 或者 BrandCnName like ‘hua’

// 组织条件
LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>().eq(num != null, BrandInfo::getBrandNum, num ).or(i->i.like( !StringUtils.isEmpty(name), BrandInfo::getBrandCnName, name).or().like( !StringUtils.isEmpty(name), BrandInfo::getBrandEnName, name));
// 进行查询
List<BrandInfo> list = brandInfoService.list(queryWrapper);

生成 SQL

SELECT brand_id,brand_cn_name,brand_en_name,brand_logo_path,brand_web_url,brand_num,brand_info,brand_founded_date 
FROM brand_info
WHERE (brand_num = ? OR (brand_cn_name LIKE ? OR brand_en_name LIKE ?))Parameters: 2(Integer), %hua%(String), %hua%(String)Row: 1, 华为, huawei, /images/brand/huawei.png, https://www.vmall.com/, 2, 中华有为,华为是一家全球领先的信息通信技术解决方案提供商,致力于推动数字化智能化的时代发展。, 2003-11-13
Row: 2, 小米, mi, /images/brand/xiaomi.png, https://www.mi.com/, 2, 性价比高,小米是一家中国智能手机和消费电子产品制造商,以其高性价比和创新设计而闻名。, 1999-11-08
Row: 6, 佳能, canon, /images/brand/jianeng.png, http://www.canon.com.cn/, 2, 佳能是一家知名的相机和打印机制造商,专注于提供优质的影像解决方案和设备。, 1955-06-15
...
Total: 11

实例 3:

// 组织条件
LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>().eq(num != null, BrandInfo::getBrandNum, num ).and(i->i.like( !StringUtils.isEmpty(name), BrandInfo::getBrandCnName, name).or().like( !StringUtils.isEmpty(name), BrandInfo::getBrandEnName, name));
// 进行查询
List<BrandInfo> list = brandInfoService.list(queryWrapper);

生成 SQL

SELECT brand_id,brand_cn_name,brand_en_name,brand_logo_path,brand_web_url,brand_num,brand_info,brand_founded_date 
FROM brand_info 
WHERE (brand_num = ? AND (brand_cn_name LIKE ? OR brand_en_name LIKE ?))Parameters: 2(Integer), %hua%(String), %hua%(String)Row: 1, 华为, huawei, /images/brand/huawei.png, https://www.vmall.com/, 2, 中华有为,华为是一家全球领先的信息通信技术解决方案提供商,致力于推动数字化智能化的时代发展。, 2003-11-13
Row: 35, 施华洛世奇, shihua, /images/brand/shihua.png, https://shihua.com/, 2, 施华洛世奇是一家奢侈品和珠宝品牌,以其精美的水晶产品和精湛的工艺而享誉全球。, 1972-07-14Total: 2

实例4:

使用 .nested()

String name = "hua";
Integer num = 2;
// 组织条件
LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>().nested(i->i.eq( BrandInfo::getBrandNum, num).like(BrandInfo::getBrandCnName, name)).or().nested(i->i.like(BrandInfo::getBrandEnName, name));// 进行查询
List<BrandInfo> list = brandInfoService.list(queryWrapper);

生成 SQL

SELECT brand_id,brand_cn_name,brand_en_name,brand_logo_path,brand_web_url,brand_num,brand_info,brand_founded_date 
FROM brand_info 
WHERE ((brand_num = ? AND brand_cn_name LIKE ?) OR (brand_en_name LIKE ?))

4.5.5.常见用法( 四 ) 分组

.select() : 相当于定义 select 查询的字段

.lambda() : 将 QueryWrapper() 转换成 LambdaQueryWrapper() , 就可以使用 Lambda 语法

.groupBy() : 分组

.having( sql ) : 对 分组结果 进行筛选, 可以使用 SQL 调用 聚合函数

实例 1:

new 时 是 QueryWrapper 为了使用 select() 自定义字段

通过 lambda() 转成 LambdaQueryWrapper()

 // 组织条件
LambdaQueryWrapper<BrandInfo> queryWrapper = new QueryWrapper<BrandInfo>().select("brand_num", " count(0) count").lambda().groupBy(BrandInfo::getBrandNum).having( " count(0) > 2");
// 进行查询
List<BrandInfo> list = brandInfoService.list(queryWrapper);
System.out.println("list = " + list);

生成 SQL

SELECT brand_num, count(0) count FROM brand_info GROUP BY brand_num HAVING count(0) > 2Row: 2, 11
Row: 3, 14
Row: 4, 9
Row: 1, 9Total: 4list = [BrandInfo(brandId=null, brandCnName=null, brandEnName=null, brandLogoPath=null, brandWebUrl=null, brandNum=2, brandInfo=null, brandFoundedDate=null, count=11), BrandInfo(brandId=null, brandCnName=null, brandEnName=null, brandLogoPath=null, brandWebUrl=null, brandNum=3, brandInfo=null, brandFoundedDate=null, count=14), BrandInfo(brandId=null, brandCnName=null, brandEnName=null, brandLogoPath=null, brandWebUrl=null, brandNum=4, brandInfo=null, brandFoundedDate=null, count=9), BrandInfo(brandId=null, brandCnName=null, brandEnName=null, brandLogoPath=null, brandWebUrl=null, brandNum=1, brandInfo=null, brandFoundedDate=null, count=9)]

4.5.6.常见用法 ( 五 ) 动态判断

.func(i->{ if(条件) { i.条件(); } else{ i.条件(); } }) : 根据 条件 动态调整SQL 结构

实例:

根据 num 值 判断 执行哪条语句, 因为 num > 2 为 false 所以执行 else 语句

 String name = "hua";
Integer num = 2;
// 组织条件
LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>().func(i->{if( num > 2 ){i.like(BrandInfo::getBrandCnName, name);}else{i.like(BrandInfo::getBrandEnName, name);}});// 进行查询
List<BrandInfo> list = brandInfoService.list(queryWrapper);

生成SQL

SELECT brand_id,brand_cn_name,brand_en_name,brand_logo_path,brand_web_url,brand_num,brand_info,brand_founded_date 
FROM brand_info WHERE (brand_en_name LIKE ?)

4.5.7.常见用法 ( 六 ) 函数 apply

.apply( sql , params ) : sql 包含 函数 , 可以使用 {index} 进行占位 , params 为 传入的值

实例 1:

String date = "2020-09-08";
// 组织条件
LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>().apply( "date_format(brand_founded_date,'%Y-%m-%d') = {0} " , date );// 进行查询
List<BrandInfo> list = brandInfoService.list(queryWrapper);

生成 SQL

SELECT brand_id,brand_cn_name,brand_en_name,brand_logo_path,brand_web_url,brand_num,brand_info,brand_founded_date 
FROM brand_info 
WHERE (date_format(brand_founded_date,'%Y-%m-%d') = ? )Parameters: 2020-09-08(String)

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

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

相关文章

android注解之APT和javapoet

前言 前面我们已经讲过注解的基本知识&#xff0c;对于注解还不太了解的&#xff0c;可以去看一下之前的文章&#xff0c; android 注解详解_袁震的博客-CSDN博客。 之前我们在讲注解的时候&#xff0c;提到过APT和JavaPoet&#xff0c;那么什么是APT和JavaPoet呢&#xff1…

【Mysql】Mysql获取排班时间段中的休息时间段方法

在MySQL中&#xff0c;可以使用自连接&#xff08;self-join&#xff09;来获取上一条记录的结束时间和下一条记录的开始时间&#xff0c;并将它们组合成一条记录。首先&#xff0c;需要为表创建一个包含记录ID和时间信息的临时表&#xff0c;然后使用自连接获取相邻记录的时间…

【面试经典150 | 数组】移除元素

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;原地操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等…

【STM32】常用存储器

常用存储器 RAM 存储器 RAM 是“Random Access Memory”的缩写&#xff0c;被译为随机存储器。所谓“随机存取”&#xff0c;指的是当存储器中的消息被读取或写入时&#xff0c;所需要的时间与这段信息所在的位置无关。而RAM可随读取其内部任意地址的数据&#xff0c;时间都是…

若依框架i18n国际化

需求背景 项目需求要做国际化&#xff0c;结果网上找了好几篇文章&#xff0c;没有一个可以一次性搞定&#xff0c;现在这里总结一下。首先&#xff0c;我们分为两部分处理&#xff0c;一个是前端页面的静态文字&#xff0c;这个由前端vue.json自行处理。第二部分就是后端的错…

Qt下SVG格式图片应用

SVG格式图片介绍 svg格式图片又称矢量图&#xff0c;该种格式的图片不同于png等格式的图片&#xff0c;采用的并不是位图的形式来组织图片&#xff0c;而是采用线条等组织图片&#xff0c;svg格式是图片的文件格式是xml&#xff0c;可以通过文件编译器打开查看svg格式内容。 …

使用Vagrant创建和管理本地Kubernetes(K8s)集群的步骤是什么

文章目录 步骤1&#xff1a;准备环境步骤2&#xff1a;创建Vagrantfile步骤3&#xff1a;启动虚拟机步骤4&#xff1a;安装Kubernetes步骤5&#xff1a;配置Kubernetes网络插件步骤6&#xff1a;将Worker节点加入集群步骤7&#xff1a;验证集群步骤8&#xff1a;部署应用步骤9&…

综合续航达1040公里:腾势计划2024年在香港上市,售价60-100 万

腾势汽车表示&#xff0c;他们计划于2024年在香港地区上市全新的D9车型。这款中大型高端新能源MPV是通过DM-i超级混动技术打造的&#xff0c;由于综合续航能力达到1040公里&#xff0c;且纯电续航最大可达190公里&#xff0c;这款车已经引起了广泛关注。据腾势销售事业部总经理…

[小尾巴 UI 组件库] 全屏响应式轮播背景图(基于 Vue 3 与 Element Plus)

文章归档于&#xff1a;https://www.yuque.com/u27599042/row3c6 组件库地址 npm&#xff1a;https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee&#xff1a;https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee&#xff1a…

在ExoPlayer中使用协程:构建强大的Android媒体播放器

在ExoPlayer中使用协程&#xff1a;构建强大的Android媒体播放器 现今的移动应用世界中&#xff0c;媒体消费是用户体验的核心部分。无论是流媒体视频、音乐播放还是处理自适应媒体格式&#xff0c;强大的媒体播放器对于提供无缝和愉悦的用户体验至关重要。而在安卓平台上&…

C高级day4循环语句

1&#xff0c;思维导图 运行结果为&#xff1a; 运行结果为&#xff1a;

CSS读书笔记

——————————————精华部分—————————————— 1、选择器 &#xff08;1&#xff09;基本选择器&#xff1a; 标签选择器 body{} 类选择器 class .class名称{} ID选择器 id #id名称{} 优先级&#xff1a;ID选择器 > 类选择器 > 标签选择器 &am…

cf 交互题

今天cf遇到了交互题&#xff0c;这个交互题的算法很很很简单&#xff0c;但是在交互上卡了&#xff0c;导致交上的代码都不算罚时。&#xff08;更伤心了。 所以&#xff0c;现在写一下交互题的做法&#xff0c;印象深刻嘛。 交互题&#xff0c;就是跟机器进行交互。你代码运…

道路积水监测-路面积水监测系统

随着城市化的不断发展&#xff0c;城市面临着越来越多的交通挑战&#xff0c;其中之一就是道路积水问题。道路积水不仅影响了交通安全&#xff0c;还会引发交通堵塞、交通事故和城市洪涝等问题。因此&#xff0c;开展道路积水监测是十分必要的。 城市排水、供水、燃气、供热、桥…

基于大规模MIMO通信系统的半盲信道估计算法matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %EM算法收敛所需的迭代 nIter 1; Yp Y(:,1:L_polit,:); %与导频序列相对应的部分 q…

建议收藏!TCP协议面试灵魂12 问

先亮出这篇文章的思维导图: TCP 作为传输层的协议&#xff0c;是一个IT工程师素养的体现&#xff0c;也是面试中经常被问到的知识点。在此&#xff0c;我将 TCP 核心的一些问题梳理了一下&#xff0c;希望能帮到各位。 001. 能不能说一说 TCP 和 UDP 的区别&#xff1f; 首先…

如何查询成绩或工资

为什么每次查询成绩或者工资的时候都觉得麻烦又耗时呢&#xff1f;在过去&#xff0c;我们可能需要去学校或公司的相关部门&#xff0c;填写繁琐的表格&#xff0c;然后等待工作人员进行查询和处理。这不仅浪费了我们宝贵的时间&#xff0c;还可能出现查询结果不准确或者遗漏的…

芯科蓝牙BG27开发笔记4-SSV5 IDE的使用

1. 如何转移工作区的项目文件到新的文件夹&#xff0c;并且可以继续使用ssv5编辑、编译&#xff1f; 从默认的工作区将目标工程整体拷贝出来 目标文件夹&#xff1a; 进入ssv5点击导入工程&#xff0c;并选择目标文件夹 继续下一步&#xff0c;修改项目文件夹所在位置为其源码…

tcp与udp

tcp 服务端回复完SYNACK之后&#xff0c;就建立连接 1.为什么是三次&#xff0c;而不是两次&#xff1f;服务端回复完SYNACK之后&#xff0c;就建立连接 这是为了防止因为已失效的请求报文&#xff0c;突然又传到服务器引起错误 意思就是&#xff1a;假设采用两次握手建立连…