MyBatis-Plus的条件构造器和常用接口

一、wrapper介绍

在这里插入图片描述

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

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

​ QueryWrapper : 查询条件封装

​ UpdateWrapper : Update 条件封装

​ AbstractLambdaWrapper : 使用Lambda 语法

​ LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper

​ LambdaUpdateWrapper : Lambda 更新封装Wrapper

二、QueryWrapper

组装条件查询

/*
* queryWrapper
* 1.组装条件查询
* */
@Test
public void test01(){
    //查询用户名包含szy,年龄在10到20之间,并且邮箱不为null的用户信息
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name", "szy")
            .between("age", 10, 20)
            .isNotNull("email");
    //SELECT uid AS id,name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);//[User(id=10, name=szy0, age=18, email=user@qcby.com, isDeleted=0), ...]
}

组装排序条件

/*
* queryWrapper
* 2.组装排序条件
* */
@Test
public void test02(){
    //按年龄降序查询用户,如果年龄相同则按id升序排列
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
            .orderByDesc("age")
            .orderByAsc("id");
    //SELECT uid AS id,name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,id ASC
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

组装删除条件

/*
* queryWrapper
* 3.组装删除条件
* */
@Test
public void test03(){
    //删除email为空的用户
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.isNull("email");
    //UPDATE t_user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
    int result = userMapper.delete(queryWrapper);
    System.out.println("受影响的行数:" + result);
}

条件的优先级

/*
* queryWrapper
* 4.条件的优先级1
* */
@Test
public void test04() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //将(年龄大于20并且用户名中包含有szy)或邮箱为null的用户信息修改
    queryWrapper
            .like("name", "szy")
            .gt("age", 20)
            .or()
            .isNull("email");
    User user = new User();
    user.setAge(18);
    user.setEmail("user@qcby.com");
    //UPDATE t_user SET age=?, email=? WHERE is_deleted=0 AND (name LIKE ? AND age > ? OR email IS NULL)
    int result = userMapper.update(user, queryWrapper);
    System.out.println("受影响的行数:" + result);
}


/*
 * queryWrapper
 * 4.条件的优先级2
 * */
@Test
public void test041() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //将用户名中包含有szy并且(年龄大于20或邮箱为null)的用户信息修改
    //lambda表达式内的逻辑优先运算
    queryWrapper.like("name", "szy")
            .and(i -> i.gt("age", 20).or().isNull("email"));
    User user = new User();
    user.setAge(18);
    user.setEmail("szy@qcby.com");
    //UPDATE t_user SET age=?, email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
    int result = userMapper.update(user, queryWrapper);
    System.out.println("受影响的行数:" + result);
}

组装select语句

/*
* queryWrapper
* 5.组装select语句
* */
@Test
public void test05() {
    //查询用户信息的username和age字段
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "age");
    //selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值 为null
    //SELECT name,age FROM t_user WHERE is_deleted=0
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    System.out.println(maps);//[{name=qcby, age=18}, {name=张三, age=20}, {name=Tom, age=28}, ...]
}

实现子查询

/*
 * queryWrapper
 * 6.实现子查询
 * */
@Test
public void test06() {
    //查询id小于等于3的用户信息
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("uid", "select uid from t_user where uid <= 3");
    //SELECT uid AS id,name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (uid IN (select uid from t_user where uid <= 3))
    List<User> list = userMapper.selectList(queryWrapper);
    System.out.println(list);
    //[User(id=1, name=qcby, age=18, email=qcby@qq.com, isDeleted=0), User(id=2, ...), User(id=3,...)]
}

左模糊查询

/*
* queryWrapper
* 7.左模糊查询
* */
@Test
public void test071() {
    //将用户名中包含有a的用户信息修改
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.likeLeft("name", "三");
    //SELECT uid AS id,name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (name LIKE ?)---%三(String)
    List<User> users = userMapper.selectList(queryWrapper);//Total: 7
}

分组groupBy

/*
* queryWrapper
* 8.分组
* */
@Test
public void test081() {
    //查询出每个年龄段有多少个用户
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("age", "COUNT(*)")
            .groupBy("age");
    //SELECT age,COUNT(*) FROM t_user WHERE is_deleted=0 GROUP BY age
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    System.out.println(maps);
    //[{COUNT(*)=1, age=2}, {COUNT(*)=2, age=18}, {COUNT(*)=6, age=20}, {COUNT(*)=1, age=21}, {COUNT(*)=1, age=23}, {COUNT(*)=1, age=24}, {COUNT(*)=4, age=28}, {COUNT(*)=2, age=30}]
}

分组后筛选having

*
 * queryWrapper
 * 9.分组后筛选having
 * */
@Test
public void test082() {
    //查询出每个年龄段有多少个用户
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("age", "COUNT(*)")
            .groupBy("age")
            .having("COUNT(*)>2");
    //SELECT age,COUNT(*) FROM t_user WHERE is_deleted=0 GROUP BY age HAVING COUNT(*)>2
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    System.out.println(maps);
    //[{COUNT(*)=6, age=20}, {COUNT(*)=4, age=28}]
}

三、UpdateWrapper

组装set子句以及修改条件

/*
* updateWrapper
* */
@Test
public void test07() {
    //将(年龄小于20或邮箱为null)并且用户名中包含有a的用户信息修改
    //组装set子句以及修改条件
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    //lambda表达式内的逻辑优先运算
    updateWrapper
            .set("age", 18)
            .set("email", "user@qcby.com")
            .like("name", "张三")
            .and(i -> i.lt("age", 20).or().isNull("email"));
    //UPDATE t_user SET age=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age < ? OR email IS NULL))
    int result = userMapper.update(null, updateWrapper);
    System.out.println(result);
}

setSql

/*
* updateWrapper2
* setSql
* */
@Test
public void test083() {
    List<Integer> ids = Arrays.asList(34,35);
    // 1.生成SQL
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper
            .setSql("age = age - 5") // SET age = age - 5
            .in("uid", ids); // WHERE uid in (34,35)
    // 2.更新,注意第一个参数可以给null,也就是不填更新字段和数据,
    // 而是基于UpdateWrapper中的setSQL来更新
    //UPDATE t_user SET age = age - 5 WHERE is_deleted=0 AND (uid IN (?,?))
    userMapper.update(null, updateWrapper);
}

四、condition

在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响SQL执行的结果

思路1

/*
* condition1
* */
@Test
public void test08() {
    //定义查询条件,有可能为null(用户未输入或未选择)
    String name = null;
    Integer ageBegin = 10;
    Integer ageEnd = 24;
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace) 构成
    if(StringUtils.isNotBlank(name)){
        queryWrapper.like("name","张三");
    }
    if(ageBegin != null){
        queryWrapper.ge("age", ageBegin);
    }
    if(ageEnd != null){
        queryWrapper.le("age", ageEnd);
    }
    //SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >= ? AND age <= ?)
    List<User> users = userMapper.selectList(queryWrapper);
    System.out.println(users);//[User(id=1, name=qcby, age=18, email=qcby@qq.com, isDeleted=0),...]
}

思路2

上面的实现方案没有问题,但是代码比较复杂,可以使用带condition参数的重载方法构建查询条件,简化代码的编写

/*
* condition2
* */
@Test
public void test08UseCondition() {
    //定义查询条件,有可能为null(用户未输入或未选择)
    String name = null;
    Integer ageBegin = 10;
    Integer ageEnd = 24;
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace) 构成
    queryWrapper
            .like(StringUtils.isNotBlank(name), "name", "张三")
            .ge(ageBegin != null, "age", ageBegin)
            .le(ageEnd != null, "age", ageEnd);
    //SELECT uid AS id,name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

五、LambdaQueryWrapper

/*
* LambdaQueryWrapper
* */
@Test
public void test09() {
    //定义查询条件,有可能为null(用户未输入)
    String name = "张三";
    Integer ageBegin = 10;
    Integer ageEnd = 24;
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    //避免使用字符串表示字段,防止运行时错误
    queryWrapper
            .like(StringUtils.isNotBlank(name), User::getName, name)
            .ge(ageBegin != null, User::getAge, ageBegin)
            .le(ageEnd != null, User::getAge, ageEnd);
    //SELECT uid AS id,name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (name LIKE ? AND age >= ? AND age <= ?)
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

last 方法添加额外的 SQL 语句

/*
* LambdaQueryWrapper
* last 方法添加额外的 SQL 语句
* */
@Test
public void test091() {
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    //避免使用字符串表示字段,防止运行时错误
    queryWrapper
            .select(User::getName, User::getAge)
            .last("LIMIT 5");
    //SELECT name,age FROM t_user WHERE is_deleted=0 LIMIT 5
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);//User(id=null, name=qcby, age=18, email=null, isDeleted=null)  ...
}

六、LambdaUpdateWrapper

/*
*  LambdaUpdateWrapper
* */
@Test
public void test10() {
    //组装set子句
    LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper
            .set(User::getAge, 28)
            .set(User::getEmail, "user111@qcby.com")
            .like(User::getName, "szy")
            .and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail)); //lambda 表达式内的逻辑优先运算
    User user = new User();
    //UPDATE t_user SET age=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age < ? OR email IS NULL))
    int result = userMapper.update(user, updateWrapper);
    System.out.println("受影响的行数:" + result);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

结合实例分析A2DP SBC帧结构和编解码算法

SBC也就是Sub band codec&#xff0c;俗称子带编码&#xff0c;是蓝牙A2DP必须支持的唯一编码。下面结合实例看看SBC编码数据在蓝牙传输中帧结构以及SBC的编解码算法流程&#xff1a; AVDTP Frame 首先AVDTP Frame是基于L2CAP协议&#xff0c;所以会包含有4个字节的L2CAP头部&…

接口(3)

大家好&#xff0c;今天我们接着上一篇的内容继续往下来看看&#xff0c;了解一下如何实现多个接口&#xff0c;与继承父类不同&#xff0c;一个类可以实现接口&#xff0c;那么话不多说&#xff0c;来看。 2.5实现多个接口. 在Java中,类和类之间是单继承的,一个类只能有一个…

MATLAB提供的颜色映射表colormap——伪彩色

图像处理领域的一个习惯&#xff1a;不是真实的颜色&#xff0c;一般用伪彩色。一是说明不是物体本身的颜色&#xff0c;二是彩色更容易分辨。 MATLAB陆续提供了16种颜色映射表colormap。 之前的都很丑&#xff0c;近5年新增的4种还可以。总的说来还是丑。 这是一种鸟的名字。…

网络安全 | 入侵检测系统(IDS)与入侵防御系统(IPS):如何识别并阻止威胁

网络安全 | 入侵检测系统&#xff08;IDS&#xff09;与入侵防御系统&#xff08;IPS&#xff09;&#xff1a;如何识别并阻止威胁 一、前言二、入侵检测系统&#xff08;IDS&#xff09;2.1 IDS 的工作原理2.2 IDS 的技术类型2.3 IDS 的部署方式 三、入侵防御系统&#xff08;…

工业“MCU+AI”

随着工业4.0的推进&#xff0c;传统工业设备正向智能化和自动化方向转型。这要求设备具备更高的算力、更强的实时处理能力以及支持AI算法的能力&#xff0c;以应对工业机器人、电机控制、预测性维护等复杂应用场景。 近年来越来越多的芯片厂商纷纷推出工业“MCUAI”产品&#…

【统计的思想】假设检验(二)

假设检验是根据人为设定的显著水平&#xff0c;对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设&#xff0c;只是说明在设定的显著水平下&#xff0c;零假设成立的概率比较小&#xff0c;并不是说零假设就肯定不成立。如果零假设事实上是成立…

[云讷科技]Kerloud Falcon四旋翼飞车虚拟仿真空间发布

虚拟仿真环境作为一个独立的专有软件包提供给我们的客户&#xff0c;用于帮助用户在实际测试之前验证自身的代码&#xff0c;并通过在仿真引擎中添加新的场景来探索新的飞行驾驶功能。 环境要求 由于环境依赖关系&#xff0c;虚拟仿真只能运行在装有Ubuntu 18.04的Intel-64位…

【数据结构】深入解析:构建父子节点树形数据结构并返回前端

树形数据结构列表 一、前言二、测试数据生成三、树形代码3.1、获取根节点3.2、遍历根节点&#xff0c;递归获取所有子节点3.3、排序3.4、完整代码 一、前言 返回前端VO对象中&#xff0c;有列情况列表展示需要带树形结构&#xff0c;例如基于RBAC权限模型中的菜单返回&#xf…

Versal - ChipScoPy + XSDB + Python CLI

目录 1. 简介 1.1 ChipScoPy 1.2 XSDB 1.3 Python CLI 2. 安装 ChipScoPy 2.1 Python 环境 2.2 设置虚拟环境 2.3 安装 ChipScoPy 2.4 安装依赖 2.5 安装示例 2.6 打开 JupyterLab 2.7 启动 hw/cs 服务 2.8 更新 ChipScoPy 2.9 参考资料 3. ChipScoPy 示例 3.1…

【优选算法】8----四数之和

有看过我上篇算法博客并且去做过的铁子们&#xff0c;对这道题的话应该就不会那么陌生了&#xff0c;因为这两道题 的解题思路有着异曲同工之妙~ -----------------------------------------begin------------------------------------- 题目解析&#xff1a; 跟三数之和就多了…

安卓日常问题杂谈(一)

背景 关于安卓开发中&#xff0c;有很多奇奇怪怪的问题&#xff0c;有时候这个控件闪一下&#xff0c;有时候这个页面移动一下&#xff0c;这些对于快速开发中&#xff0c;去查询&#xff0c;都是很耗费时间的&#xff0c;因此&#xff0c;本系列文章&#xff0c;旨在记录安卓…

Python3 OS模块中的文件/目录方法说明九

一. 简介 前面文章简单学习了 Python3 中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS 模块中文件、目录的操作方法&#xff1a;os.pipe() 方法、os.popen() 方法。 二. Python3 OS模块中的文件/目录方法 1. os.pipe() 方法 os.pipe() 方法用于创建一个管道, 返回…

2025.1.20——四、[强网杯 2019]Upload1 文件上传|反序列化

题目来源&#xff1a;buuctf [强网杯 2019]Upload 1 目录 一、打开靶机&#xff0c;查看信息 二、解题思路 step 1&#xff1a;登陆进去看情况 step 2&#xff1a;大佬来支援——问题在cookie step 3&#xff1a;测试两个思路 1.目录穿越 2.目录扫描 step 4&#xff…

Go学习:iota枚举

iota注意事项&#xff1a; iota&#xff1a;常量自动生成器&#xff0c;每隔一行&#xff0c;自动累加iota给常量赋值使用iota 遇到 const&#xff0c;重置为 0可以只写一个iotaiota如果是同一行&#xff0c;值都一样 简单代码&#xff1a; package mainimport "fmt&qu…

2025 OWASP十大智能合约漏洞

随着去中心化金融&#xff08;DeFi&#xff09;和区块链技术的不断发展&#xff0c;智能合约安全的重要性愈发凸显。在此背景下&#xff0c;开放网络应用安全项目&#xff08;OWASP&#xff09;发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…

双指针+前缀和习题(一步步讲解)

前言&#xff1a;如果解决下面这几道题有些问题&#xff0c;或者即使看了我画的过程图也不理解的可以去看看我的上一篇文章&#xff0c;有可能会对你有帮助。 一、《数值元素的目标和》---来自AcWing 数组元素的目标和 给定两个升序排序的有序数组 A和 B&#xff0c;以及一个…

单路由及双路由端口映射指南

远程登录总会遇到登陆不上的情况&#xff0c;可能是访问的大门没有打开哦&#xff0c;下面我们来看看具体是怎么回事&#xff1f; 当软件远程访问时&#xff0c;主机需要两个条件&#xff0c;一是有一个唯一的公网IP地址&#xff08;运营商提供&#xff09;&#xff0c;二是开…

Addressable学习

AssetsBundle是Unity的资源管理机制,将资源打包到AssetsBundle资源包并提供接口能从ab包里面加载资源出来。有了这个机制以后&#xff0c;我们要做资源管理&#xff0c;还需要做: a: 根据项目需求,编写编辑器扩展,提供指定资源打入对应bundle包工具策略; b: 根据项目的需求,资源…

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C库。 先发现相机。 配置 lib目录 包含 编译提示缺的文件&#xff0c;到libonvif里面拷贝过来。 改UDP端口 代码 使用msvc 2022的向导生成空项目&#xff0c;从项目的main示例拷贝过来。 CameraOnvif.h #pragma once#include <QObject> #include &l…

leetcode刷题记录(八十六)——84. 柱状图中最大的矩形

&#xff08;一&#xff09;问题描述 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09;84. 柱状图中最大的矩形 - 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾…