Mybatis 框架 ( 四 ) QueryWrapper

news2024/10/7 16:20:25

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-14

Total: 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) > 2

Row: 2, 11
Row: 3, 14
Row: 4, 9
Row: 1, 9

Total: 4

list = [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.coloradmin.cn/o/1001571.html

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

相关文章

【前端】禁止别人调试自己的前端页面代码

无限debugger 前端页面防止调试的方法主要是通过不断 debugger 来疯狂输出断点&#xff0c;因为 debugger 在控制台被打开的时候就会执行由于程序被 debugger 阻止&#xff0c;所以无法进行断点调试&#xff0c;所以网页的请求也是看不到的代码如下&#xff1a; /** * 基础禁止…

参照错误原因排查

报错如下&#xff0c;弹框参照框不显示&#xff1a; 首先定位到错误代码行&#xff0c;排查后发现调用方式、参数均没问题 再到参照引入源头&#xff0c;结合network检测资源加载情况&#xff0c;发现静态资源js文件均正常获取 可以基本判断是参照组件那边出现问题&#xff0c…

算法通关村第十八关——回溯是怎么回事(青铜)

算法通关村第十八关——回溯是怎么回事&#xff08;青铜&#xff09; 前言1. 从N叉树说起1.1 N叉树的定义和特点1.2 N叉树的遍历方式1.3 N叉树在回溯算法中的应用 2. 为什么有的问题暴力搜索也不行2.1 暴力搜索的局限性 3. 回溯递归局部枚举放下前任3.1 回溯算法的基本思想和原…

运维Shell脚本牛刀小试(九): 重定向操作符“>“及双重定向“>>“

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0)&#xff1b; pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试…

c高级day4(9.11)shell脚本(case ....in语句,循环语句,select ...in和case...In结合,辅助控制关键字,函数)

1.实现一个对数组就和的函数&#xff0c;数组通过实参传递给函数 2.写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使用变量接收结果 #!/bin/bash read -a arr sum0 function add() { …

s2019nh62分数减法

代码&#xff1a; #include<bits/stdc.h> using namespace std; int m1,z1,m2,z2,zd,zx,s1,s2,f1,f2,c,da; int main() {cin>>z1>>m1; //分子1和分母1cin>>z2>>m2; //分子2和分母2zd__gcd(m1,m2); //求两个分母的最大公因数来求最小公倍数z…

数据分析工具有哪些,哪个好学?

Tableau、帆软BI、思迈特BI、SpeedBI数据分析云……这些都是比较常见的BI数据分析工具。从学习成本、操作难度以及数据可视化分析效果来看&#xff0c;SpeedBI数据分析云都表现地可圈可点。 1、不需下载安装、学习成本低 SpeedBI数据分析云是一款SaaS BI数据分析工具&#xf…

IO和进程day05(进程与线程)

今日任务 1.代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/wait.h> #include <pthread.h>…

pytorch代码实现之CoordConv卷积

CoordConv卷积 在深度学习领域&#xff0c;几乎没有什么想法能像卷积那样产生如此大的影响。对于任何涉及像素或空间表示的问题&#xff0c;普遍的直觉认为卷积神经网络可能是合适的。在本文中&#xff0c;我们通过看似平凡的坐标变换问题展示了一个惊人的反例&#xff0c;该问…

如何使用bat脚本启动指定目录下的jar包

士别三日&#xff0c;当刮目相待。——《三国志》 为了将一个java程序封装成一个简单易用的小工具&#xff0c;使用bat脚本启动jar包。 在txt文档中&#xff0c;键入&#xff1a; echo off java -jar %~dp0core\demo.jar 注意&#xff1a; 1、其中“core”是文件夹的名称&am…

与读者互动,扩大影响:提升公众号文章阅读量的关键

如何提升公众号文章阅读量 公众号已成为许多个人和企业推广与传播的重要平台。然而&#xff0c;仅仅拥有一个公众号并发布文章并不足以吸引大量读者和提高阅读量。在当今信息爆炸的时代&#xff0c;如何让你的公众号文章脱颖而出并吸引更多读者的关注是一个关键问题。本文将为…

气象观测站:实时监测、应用广泛

对于许多人来说&#xff0c;气象观测站可能只是一种能够预测天气的设备&#xff0c;但实际上&#xff0c;它所涉及的原理和优势却远不止于此。 二、气象观测站的优势 全面覆盖 气象观测站能够全面覆盖气象要素的各个方面&#xff0c;从温度、湿度、气压到风速、风向等。这些…

日志是你的朋友:为什么每个开发者都应该写日志

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的程序员。今天我想和大家聊一聊一个在编写代码时常常被忽视&#xff0c;却极为重要的话题——为什么要写有意义的日志。 在日常的编程工作中&#xff0c;我们经常听到“日志”这个词&#xff0c;但是有些人可能并不…

C++重载输入和输出运算符

在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。 …

C 风格文件输入/输出---无格式输入/输出---(std::getchar,std::putchar,std::ungetc)

C 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数&#xff0c;而 <cwchar>头文件提供有宽字符输入/输出能力的函数。 无格式输入/输出 从 stdin 读取字符 std::getchar int getch…

零基础Linux_3(基本指令_下)目录/文件的复制移动查看打包+其它指令

此篇接着上篇&#xff0c;所以目录也接着上篇了&#xff0c;上篇链接&#xff1a;零基础Linux_2(基本指令_上)目录/文件的显示跳转创建删除_GR_C的博客-CSDN博客 目录 6. 复制文件或目录 cp 源文件 目标文件(拷贝源文件到目标文件) cp -r 源目录 目标目录(拷贝源目录到目标…

苹果笔推荐购买吗?苹果ipad触控笔推荐

电容笔什么牌子好用&#xff1f;最近看到很多人在问这个问题。也是&#xff0c;现在的电容笔品牌太多了&#xff0c;选的人眼花缭乱的&#xff0c;不了解电容笔的人都不知道应该怎么选。下面&#xff0c;根据我多年使用电容笔的经验&#xff0c;来给大家推荐四款性价比高的电容…

LINUX 用户和组操作

目录 一、用户和组的分类 1、用户分类 2、组的分类 3、用户和组的配置文件 二、用户管理 1、添加用户 2、修改用户信息 3、修改用户密码 4、用户间切换 5、删除用户账号 6、sudo命令提高普通用户权限 三、用户组管理 1、创建用户组 2、修改用户组的属性 3、添加…

OpenCV基础(二):绘制直线、绘制几何图形、绘制文字、创建窗口

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

折半查找(二分查找)

1.算法思想 折半查找&#xff0c;又称“二分查找”&#xff0c;仅适用于有序的顺序表。 1.适用范围 顺序表拥有随机访问的特性&#xff0c;链表没有。 图解&#xff1a;&#xff08;low代表左区间边界&#xff0c;high代表右区间边界&#xff0c;mid代表中间元素&#xff0…