五、条件构造器和常用接口

news2024/9/21 12:36:16

文章目录

  • 五、条件构造器和常用接口
    • 1、wapper介绍
    • 2、QueryWrapper
      • 2.1 例1:组装查询条件
      • 2.2 例2:组装排序条件
      • 2.3 例3:组装删除条件
      • 2.4 例4:条件的优先级
      • 2.5 例5:组装select子句
      • 2.6 例6:实现子查询
    • 3、UpdateWrapper
    • 4、condition
      • 4.1 思路一
      • 4.2 思路二:
    • 5、LambdaQueryWrapper
    • 6、LambdaUpdateWrapper


【尚硅谷】MyBatisPlus教程-讲师:杨博超

失败,是正因你在距成功一步之遥的时候停住了脚步。

五、条件构造器和常用接口

1、wapper介绍

在这里插入图片描述

  • Wrapper : 条件构造抽象类,最顶端父类
    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
      • QueryWrapper : 查询条件封装
      • UpdateWrapper : Update 条件封装
      • AbstractLambdaWrapper : 使用Lambda 语法
        • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
        • LambdaUpdateWrapper : Lambda 更新封装Wrapper

2、QueryWrapper

2.1 例1:组装查询条件

@Test
public void test01() {
    // 查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
    // SELECT 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)
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name", "a")
            .between("age", 20, 30)
            .isNotNull("email");
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

2.2 例2:组装排序条件

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

2.3 例3:组装删除条件

@Test
public void test03() {
    // 删除email为空的用户
    // UPDATE t_user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.isNull("email");
    //条件构造器也可以构建删除语句的条件
    int result = userMapper.delete(queryWrapper);
    System.out.println("result:" + result);
}

2.4 例4:条件的优先级

@Test
public void test04() {
    //将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
    // UPDATE t_user SET email=? WHERE is_deleted=0 AND (name LIKE ? AND age > ? OR email IS NULL)
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    User user = new User();
    user.setEmail("123@qq.com");
    queryWrapper.like("name", "a")
            .gt("age", 20)
            .or()
            .isNull("email");
    int result = userMapper.update(user, queryWrapper);
    System.out.println("result:" + result);
}
@Test
public void test05() {
    // 将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
    // UPDATE t_user SET email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name", "a")
            .and(i -> i.gt("age", 20).or().isNull("email"));
    User user = new User();
    user.setEmail("zzzz@qq.com");
    int result = userMapper.update(user, queryWrapper);
    System.out.println("result" + result);
}

2.5 例5:组装select子句

@Test
public void test06() {
    // 查询用户信息的username和age字段
    // SELECT name,age FROM t_user WHERE is_deleted=0
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "age");
    // selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值为null
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    maps.forEach(System.out::println);
}

2.6 例6:实现子查询

@Test
public void test07() {
    // 查询id小于等于3的用户信息
    // SELECT id,name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (id IN (select id from t_user where id <= 3 and is_deleted = 0))
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id", "select id from t_user where id <= 3 and is_deleted = 0");
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

3、UpdateWrapper

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

4、condition

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

4.1 思路一

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

4.2 思路二:

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

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

5、LambdaQueryWrapper

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

6、LambdaUpdateWrapper

@Test
public void test12() {
    // 组装set子句
    // 修改名字包含a并且年龄小于24或者邮箱为null的用户
    LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper.set(User::getAge, 18)
            .set(User::getEmail, "zhangsan@qq.com")
            .like(User::getName, "a")
            .and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail));
    // lambda表达式内的逻辑优先运算
    // 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" + result);
}

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

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

相关文章

基于opencv的数字识别系统

一、目的 想要实现的功能&#xff1a;帮助我们在泵中扫描燃油&#xff0c;并在应用程序中输入燃油信息。 所需技术&#xff1a;①python程序对于拍摄的汽油泵的图像&#xff0c;尝试从中读取数字。——opencv实现。②先使用python对其进行原型设计&#xff0c;然后将代码转换…

TiDB分布式数据库部署与安装详解

TiUP 是 TiDB 4.0 版本引入的集群运维工具&#xff0c;TiUP cluster 是 TiUP 提供的使用 Golang 编写的集群管理组件&#xff0c;通过 TiUP cluster 组件就可以进行日常的运维工作&#xff0c;包括部署、启动、关闭、销毁、弹性扩缩容、升级 TiDB 集群&#xff0c;以及管理 TiD…

EMQX Enterprise 4.4.124.4.13 发布:集群负载重平衡、TDengine 3.0 适配以及子表批量插入

我们很高兴地告诉大家&#xff0c;EMQX Enterprise 4.4.12 以及 4.4.13 版本正式发布&#xff01; 在本次发布中&#xff0c;我们带来了集群负载重平衡与节点疏散功能为运维人员提供更灵活的集群管理方式&#xff0c;适配了 TDengine 3.0 版本并新增分表批量插入功能&#xff…

ECMAScript 2022 中的新特性!

新钛云服已累计为您分享718篇技术干货本文盘点ECMAScript 2022 中的新特性&#xff0c;包括顶级等待、RegExp 匹配索引、新的公共和私有类字段等。一、公共和私有实例字段最新的 ES13 规范允许我们将成员字段内联定义为类主体的一部分&#xff0c;我们可以使用#来表示私有字段。…

Python打包(问题记录,带解决)

引言 文章用于测试在Python3.8的版本&#xff0c;打包Obspy地震包&#xff0c;最后集成到PyQt5上。 部署或冻结应用程序是 Python 项目的重要组成部分&#xff0c; 这意味着捆绑所有必需的资源&#xff0c;以便应用程序找到它需要的一切 能够在客户端计算机上运行。 但是&…

Ethereum 基础(一)

以太坊&#xff08;Ethereum&#xff09;是社区运行的技术&#xff0c;为加密货币以太币(ETH)和数千个去中心化应用程序提供动力。 ethereum.org是您进入以太坊世界的门户。这项技术是新的、不断发展的——有个向导会有帮助。如果你想深入研究&#xff0c;我们建议你这样做。 …

Linux内核定时器

1.概念 在linux内核内部开发者设计了内核定时器&#xff0c;它的工作原理和硬件定时器一样&#xff0c;使用它不需要关注底层的实现&#xff0c;只需要分配定时器对象&#xff0c;初始化对象&#xff0c;启用定时器即可&#xff0c;当定时时间到达之后执行定时器的处理函数。 …

2022年第十二届APMCM亚太地区数学建模竞赛1月加赛E题翻译以及思路

中文2022年亚洲及太平洋地区建模数学竞赛问题E有多少颗核弹可以摧毁地球&#xff1f;1945年8月6日&#xff0c;第二次世界大战已接近尾声。为了尽快结束战争&#xff0c;美国在日本广岛投下了名为 "小男孩" 的第二颗原子弹。这样一颗原子弹炸死了广岛的200000人&…

硬盘容量计算

硬盘容量&#xff08;Hard drive capacity&#xff09;以兆字节&#xff08;MB&#xff09;或千兆字节&#xff08;GB&#xff09;为单位&#xff0c;主流硬盘容量为500G&#xff5e;2TB&#xff0c;影响硬盘容量的因素有单碟容量和碟片数量。许多人发现&#xff0c;计算机中显…

Java--面向对象经典练习题

文章内容 一、文字版格斗游戏 二、对象数组1 三、对象数组2 四、对象数组3 五、对象数组4 题目代码如下&#xff1a; 文字版格斗游戏 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;再选定人物的时候(new对象的时候)&#xf…

(Java高级教程)第三章Java网络编程-第一节1:网络编程必备网络知识1之网络初识和网络协议

文章目录一&#xff1a;计算机网络基本概念二&#xff1a;计算机网络发展三&#xff1a;网络协议&#xff08;1&#xff09;生活中的协议&#xff08;2&#xff09;网络协议&#xff08;3&#xff09;协议是谁制定的注意&#xff1a;本节会总结一些必要的网络知识&#xff0c;便…

第03讲:HTTP操作之ElasticSearch映射操作

3.1.3、映射操作 有了索引库&#xff0c;等于有了数据库中的 database。 接下来就需要建索引库(index)中的映射了&#xff0c;类似于数据库(database)中的表结构(table)。 创建数据库表需要设置字段名称&#xff0c;类型&#xff0c;长度&#xff0c;约束等;索引库也一…

P11 PyTorch Momentum

参考&#xff1a; 关于梯度下降与Momentum通俗易懂的解释_ssswill的博客-CSDN博客_梯度 momentum 前言&#xff1a; P9讲梯度的时候&#xff0c;讲到过这种算法的梯度更新方法 这边重点讲解一下原理 Momentum算法又叫做冲量算法&#xff0c;其迭代更新公式如下&#xff1a; 实…

【Vue中使用Echarts】响应式布局flexible.js+rem适配方案

文章目录一、vue集成flexible方案第一种&#xff1a;在编译的时候自动转换(px2rem-loader)第二种&#xff1a;直接在写css样式的时候转换(cssrem)二、安装&配置lib-flexible.js三、安装插件cssrem一、vue集成flexible方案 先介绍几个基本的概念 px像素&#xff08;Pixel&…

LeetCode分类刷题---数组篇

刷题班数组1.二分查找704.二分查找35.搜索插入位置34.在排序数组中查找元素的第一个和最后一个位置。69.X的平方和367.有效的完全平方数2.移除元素27.移除元素283.移动零844.比较含退格的字符串977.有序数组的平方3.长度最小的子数组209.长度最小的子数组904.水果成蓝76.最小覆…

2023-01-05 长亭科技 Go 后端开发实习生二面

由于面试官前几天 &#x1f40f; 了&#xff0c;在 HR 面后补了技术二面&#xff0c;不过问得倒也不难&#xff0c;但还是记录下。 1、请做 3 ~ 5 分钟的自我介绍。 2、你说研究生的方向是漏洞挖掘和模糊测试&#xff0c;可以介绍一下吗&#xff1f; 3、简单介绍下缓冲区溢出漏…

2022年中国特色智能工厂领航制造业升级分析报告

易观&#xff1a;当前&#xff0c;新一轮的科技革命和产业变革正在重塑世界格局&#xff0c;科技创新也成为影响国家竞争力的决定性因素。在全球制造业格局重塑的过程中&#xff0c;智能工厂作为全球智能制造产业实践的示范标杆与标准载体&#xff0c;是引领全球制造业企业与工…

机器学习中的数学原理——逻辑回归

这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎私信或者评论区留言&#xff01;这一篇就更新一下《白话机器学习中的数学——逻辑回归》&#xff01;什么是逻辑回归算法逻辑回归 (Logistic…

【信管6.3】成本挣值计算

成本挣值计算铺垫了那么久&#xff0c;不知道大家期待不期待。总算到了挣值计算这一课&#xff0c;这个名字很奇怪呀&#xff0c;什么叫做挣值&#xff1f;成本不就是我们的投资吗&#xff1f;这个挣值到底是要干嘛&#xff1f;带着这些疑问&#xff0c;我们就来看看挣值计算到…

2022全年度奶粉十大热门品牌销量榜单

随着居民收入水平的提升、消费观念的转变及健康饮食意识的逐渐增强&#xff0c;消费者对食品品质的要求也越来越高&#xff0c;奶粉市场也同样如此。当前&#xff0c;国内婴幼儿奶粉市场规模呈稳步增长态势&#xff0c;同时&#xff0c;“三孩政策”的发布实施&#xff0c;也利…