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)
相关文章:
Mybatis 框架 ( 四 ) QueryWrapper
4.5.Wrapper条件构造器 Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapper : Entity 对象封装操作类,不是用lambda语法 UpdateWrapper &am…...
数据结构和算法之二分法查找
二分法查找,也称作二分查找或折半查找,是一种在有序数组中快速查找特定元素的算法。它采用分治法思想,通过将问题划分为规模更小的子问题,并且通过对子问题的查找来解决原问题。 二分法查找的思路是不断地将数组一分为二…...
系统日期如何在页面展示,框架是react或者vue3
安装插件dayjs或者moment.js 2.使用setInterval(useInterval)或者requestAnimationFrame react项目中useInterval的代码示例: import React, {useState } from react; import { useInterval } from "ahooks"; import moment fro…...
(二十二)大数据实战——Flume数据采集之故障转移案例实战
前言 本节内容我们完成Flume数据采集的故障转移案例,使用三台服务器,一台服务器负责采集nc数据,通过使用failover模式的Sink处理器完成监控数据的故障转移,使用Avro的方式完成flume之间采集数据的传输。整体架构如下:…...
前端小案例3:Flex弹性布局行内元素宽度自适应
前端小案例3:Flex弹性布局行内元素宽度自适应 项目背景:需要在一行上展示空调设备的三个模式(制冷、制热、通风)或者两个模式(制冷、制热);因为不同产品的模式数量不同,因此需要让模…...
纳尼?小说还要用看的?这可以听!无广!
这是一款听书软件,可以自定义书源,自己设置书架,页面简单易操作,无广告。 支持直接搜索书名,链接,图文,本地文件等方式听书 拥有30多主播声音,分类细致 支持倍速、添加BGM等...
【微服务部署】四、Jenkins一键打包部署NodeJS(Vue)前端项目步骤详解
本文介绍使用Jenkins一键将NodeJS(Vue)前端项目打包并上传到生产环境服务器,这里使用的是直接打包静态页面,发送到远程服务器Nginx配置目录的方式,首先确保服务器环境配置好,安装Nginx,运行目录…...
【前端】禁止别人调试自己的前端页面代码
无限debugger 前端页面防止调试的方法主要是通过不断 debugger 来疯狂输出断点,因为 debugger 在控制台被打开的时候就会执行由于程序被 debugger 阻止,所以无法进行断点调试,所以网页的请求也是看不到的代码如下: /** * 基础禁止…...
UDP的可靠性传输
UDP系列文章目录 第一章 UDP的可靠性传输-理论篇(一) 第二章 UDP的可靠性传输-理论篇(二) 文章目录 UDP系列文章目录前言1.TCP 和UDP格式对比2.UDP分片原理3.UDP 传输层应该注意问题4.MTU5.UDP 分片机制设计重点 一、ARQ协议什么…...
科研笔记:TPAMI submission guideline
1 author information Author Information - IEEE Transactions on Pattern Analysis and Machine Intelligence | IEEE Computer Society Digital Library 1.1 会议期刊extension 当一个TPAMI的提交基于之前的会议论文时,IEEE要求期刊论文是之前出版物的“实质…...
Python文件操作(02):打开文件、读文件、关闭文件
一、读文本文件 打开文件读文件内容关闭文件 1、在读取文件内容后进行解码操作 """ 1. 打开文件- 路径:相对路径:当前项目(读文件.py)所在的目录下查找需要读取的文件绝对路径:文件--右键--Copy Pat…...
C语言访问Mysql
文章目录 C语言访问Mysql1. 环境设置2. mysql接口介绍(1) 初始化mysql_init()(2) 链接数据库mysql_real_connect(3) 下发mysql命令mysql_query()(4) 获取执行结果mysql_store_result(5) 释放结果集mysql_free_result()(6) 获取结果行数mysql_num_rows(7) 获取结果列数mysql_num…...
软件设计师(十)网络与信息安全基础知识
计算机网络是由多台计算机组成的系统,与传统的单机系统、多机系统相比有很大的区别。 一、网络概述 计算机网络是计算机技术与通信技术相结合的产物,它实现了远程通信、远程信息处理和资源共享。 1、计算机网络的概念 计算机网络的定义是利用通信设备…...
蓝桥杯官网填空题(换零钞)
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 X 星球的钞票的面额只有:100 元,5 元,2 元,1 元,共 4 种。 小明去 X 星旅游,他手里只有 2 张…...
JavaFX之Stage
Stage(舞台),它代表了一个顶级窗口,是JavaFX应用程序的主要容器。Stage可以包含多个场景(Scene),每个场景可以包含各种用户界面元素(如按钮、文本框等)。Stage提供了许多…...
深度翻页导出导致慢SQL,mysqlCPU飙升优化方案
慢SQL原因分析: 1.深度翻页 2.多表JOIN 3. 大IN 4. id倒排序 本文针对深度翻页的优化进行探讨 方案1: 将limit offset, pageSize的方式改成 id > xx limit pageSize. 这样能走Id索引,提高速度。 缺点:不能使用多线程…...
小谈设计模式(1)—总序
小谈设计模式(1)—总序 开始操作设计模式总论设计模式是什么组成要素模式名称问题描述解决方案效果描述 设计模式有什么作用提供可重用的解决方案提高代码的可读性和可维护性促进代码的可扩展性提高代码的灵活性和可重用性促进团队合作和沟通作用总结 为…...
【c++】stringstream基础:实现数据类型转换和字符串分割
传统实现整型转换为字符串需要使用itoa或者sprintf,对于itoa和atoi的使用可以看文章: atoi和itoa极简无废话概述 但是用这两个函数进行转换时,所需要的空间事先不确定,所以可能造成程序崩溃,今天介绍的stringstream可…...
Java基础学习笔记-5
前言 Java编程语言是一门广泛应用于软件开发领域的高级编程语言。它的强大特性和跨平台性使其成为许多开发者的首选语言。本文将介绍一些Java编程的关键概念,包括函数重载、可变参数、值传递、递归等,这些概念是Java编程的基础,对于理解和掌…...
合同交付类项目如何高效管理?
美国项目管理协会(PMI)保罗格蕾斯曾说:“当今社会,一切都是项目,一切也将成为项目。”在“万事皆项目”的背景下,企业在运营过程中会产生大量的项目型业务活动,例如:举办市场活动、产品研发、进行企业内训、采购招标、工程建设等等。那么按照…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
