MyBatisPlus ---- 条件构造器和常用接口

news2024/11/18 5:52:39

MyBatisPlus ---- 条件构造器和常用接口

  • 1. wapper介绍
  • 2. QueryWrapper
    • a>例1:组装查询条件
    • b>例2:组装排序条件
    • c>例3:组装删除条件
    • d>例4:条件的优先级
    • e>例5:组装select子句
    • f>例6:实现子查询
  • 3. UpdateWrapper
  • 4. condition
    • 思路一
    • 思路二
  • 5. LambdaQueryWrapper
  • 6. LambdaUpdateWrapper

1. wapper介绍

在这里插入图片描述

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

2. QueryWrapper

a>例1:组装查询条件

    @Test
    public void test01(){

        //查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
        //SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("user_name", "a").between("age", 20, 30).isNotNull("email");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(user -> System.out.println(user));

    }

由于前面设置了 is_deleted 逻辑删除,所以这里查询到的是,为经过逻辑删除的信息

在这里插入图片描述

b>例2:组装排序条件

    @Test
    public void test02(){

        //按照年龄升序查询用户,如果年龄相同则按id 降序排列
        //SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age ASC,id DESC
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByAsc("age").orderByDesc("id");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(user -> System.out.println(user));

    }

在这里插入图片描述

c>例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);

    }

由于前面设置了逻辑删除,所以这里的删除,就仅是逻辑删除,而不是物理删除

在这里插入图片描述
在这里插入图片描述

d>例4:条件的优先级

    @Test
    public void test04(){

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //将(年龄大于20并且用户名中包含有a)或者邮箱为null的用户信息修改
        //UPDATE t_user SET age=?, email=? WHERE is_deleted=0 AND (user_name LIKE ? AND age > ? OR email IS NULL)
        queryWrapper.like("user_name", "a").gt("age", 20).or().isNull("email");
        User user = new User();
        user.setAge(18);
        user.setEmail("user@fickler.com");
        int result = userMapper.update(user, queryWrapper);
        System.out.println(result);

    }

querywrapper 不仅可以用于查询,也可以用于更改

在这里插入图片描述

    @Test
    public void test05(){

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
        //UPDATE t_user SET age=?, email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
        //lambda表达式内的逻辑优先运算
        queryWrapper.like("user_name", "a").and(i -> i.gt("age", 20).or().isNull("email"));
        User user = new User();
        user.setAge(18);
        user.setEmail("user@fickler.com");
        int result = userMapper.update(user, queryWrapper);
        System.out.println(result);

    }

在这里插入图片描述

e>例5:组装select子句

    @Test
    public void test06(){

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

    }

在这里插入图片描述

f>例6:实现子查询

    @Test
    public void test07(){

        //查询id小于等于3的用户信息
        //SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (uid IN (select uid from t_user where uid <= 3))
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.inSql("uid", "select uid from t_user where uid <= 3");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(user -> System.out.println(user));

    }

在这里插入图片描述

3. UpdateWrapper

    @Test
    public void test08(){

        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
        //UPDATE t_user SET age=?,email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? AND email IS NOT NULL))
        //lambda表达式内的逻辑优先运算
        updateWrapper.set("age", 30).set("email", "ceshi@qq.com").like("user_name", "a").and(i -> i.gt("age", 18).isNotNull("email"));
        int result = userMapper.update(null, updateWrapper);
        System.out.println(result);

    }

在这里插入图片描述

4. condition

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

思路一

    @Test
    public void test09() {

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

    }

在这里插入图片描述

思路二

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

在这里插入图片描述

    @Test
    public void test10() {

        //定义查询条件,有可能为null(用户为输入)
        String username = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //StringUtils.isNotBlank()判断字符串是否不为空且长度不为0且不由空白符(whitespace)构成
        queryWrapper.like(StringUtils.isNotBlank(username), "user_name", "a").ge(ageBegin != null, "age", ageBegin).le(ageEnd != null, "age", ageEnd);
        //SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(user -> System.out.println(user));

    }

在这里插入图片描述

5. LambdaQueryWrapper

    @Test
    public void test11() {

        //定义查询条件,有可能为null(用户为输入)
        String username = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //StringUtils.isNotBlank()判断字符串是否不为空且长度不为0且不由空白符(whitespace)构成
        lambdaQueryWrapper.like(StringUtils.isNotBlank(username), User::getName, "a").ge(ageBegin != null, User::getAge, ageBegin).le(ageEnd != null, User::getAge, ageEnd);
        //SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        users.forEach(user -> System.out.println(user));

    }

使用 User::getName 的方式来确定属性名,一定程度上避免了实体类中属性名和数据库中的属性名不同的问题

在这里插入图片描述

6. LambdaUpdateWrapper

    @Test
    public void test12(){

        //组装set子句
        LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        //lambda表达式内的逻辑优先运算
        lambdaUpdateWrapper.set(User::getAge, 18).set(User::getEmail, "ceshi@qq.com").like(User::getName, "a").and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail));
        //UPDATE t_user SET age=?,email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age < ? OR email IS NULL))
        int result = userMapper.update(null, lambdaUpdateWrapper);
        System.out.println(result);

    }

在这里插入图片描述

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

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

相关文章

dubbo源码实践-SPI扩展-自适应扩展机制

目录 1 前提必备知识 2 术语定义 3 自适应扩展机制的特点 4 扩展点实践 4.1 用户自定义自适应扩展 4.2 dubbo生成自适应扩展 4 自适应扩展类的用途 1 前提必备知识 具体的使用和原理就不说了&#xff0c;网上有人写的挺好的了。 可以参考&#xff1a; Dubbo SPI之自适…

【北京理工大学-Python 数据分析-1.1】

数据维度 维度&#xff1a;一组数据的组织形式 一维数据&#xff1a;由对等关系的有序或无序数据构成&#xff0c;采用线性组织形式。包括列表、集合和数组&#xff08;python中不常见&#xff0c;但在C和Java中比较常见&#xff09;类型。 列表&#xff1a;数据类型可以不同…

讲座笔记:Representation Learning on Networks

1 传统机器学习 传统机器学习需要进行很多的特征工程 我们希望模型自动学习特征&#xff0c;而不是用人为特征工程的方式1.1 目标 1.2 难点 graph更复杂&#xff0c;CNN和RNN很难直接应用 ——>复杂的拓扑结构&#xff08;不像CNN有网格的概念&#xff09;——>没有固定…

国家队入场,中国数字资产交易市场或将迎来新一轮“洗牌”

‍‍数据智能产业创新服务媒体——聚焦数智 改变商业数字化已经成为中国文化产业的催化剂&#xff0c;一大批文化资源在数字技术的赋能下焕发了崭新的生机。随着数字化的升级与科技进步&#xff0c;数字经济正在成为改变全球竞争格局的关键力量&#xff0c;各国家都争先出台相…

【微服务】Nacos 健康检查机制

目录 一、前言 二、注册中心的健康检查机制 三、Nacos 健康检查机制 四、临时实例健康检查机制 五、永久实例健康检查机制 六、集群模式下的健康检查机制 七、小结 &#x1f496;微服务实战 &#x1f496; Spring家族及微服务系列文章 一、前言 在前文中&#xff0c;…

使用 Helm 安装 MQTT 服务器-EMQX

EMQX ℹ️ Info: 使用 EMQX 通过 Helm3 在 Kubernetes 上部署 EMQX 4.0 集群 | EMQ emqx/deploy/charts/emqx at main-v4.4 emqx/emqx (github.com) emqx/values.yaml at main-v4.4 emqx/emqx (github.com) emqx/emqx-operator: A Kubernetes Operator for EMQ X Broker (git…

Arch Linux/Manjaro安装pycharm

首先换清华源以加快速度 &#xff08;已经换源的小伙伴可以跳过这一步&#xff09; 首先安装vim&#xff0c;用来编辑文件&#xff0c;已经安装过的可以跳过这一步。 sudo pacman -S vim 然后使用vim编辑配置文件 sudo vim /etc/pacman.d/mirrorlist 打开文件以后按inser…

Javaweb——第二章 Jsp和Servlet

目录 2.1 JSP概述 2.2 Servlet概述 2.3 jsp和servlet的区别和联系&#xff1a; ​编辑 2.4 Jsp的生命周期 2.4.1 JSP编译 2.4.2 JSP初始化 2.4.3 JSP执行 2.4.4 JSP清理 2.5 Servlet 2.5.1 Servlet的工作模式 2.5.2 Servlet创建方式 2.5.3 Servlet生命周期 2.1 JS…

JAVA之网络编程学习

文章目录一 java网络编程初识1.1 概述1.2 C/S 架构&B/S架构认识1.2.1 C/S架构1.2.2 B/S架构1.3 网络通信两个要素1.4 IP(Inet Adderss)1.5 InetAddress演示1.6 端口号1.7 InetSocketAddress使用1.8 网络通信协议二 TCP网络编程2.1 信息通信案例2.1.1 TcpClientDemo2.1.2 Tc…

聊聊接口文档的事儿

1、前言 大家好&#xff0c;欢迎来到我的吉鹿&#xff08;记录&#xff09;空间。 最近在做一个前后端分离的项目时&#xff0c;由于后端提供的 API 接口文档实在是一言难尽&#xff0c;导致了开发的效率大大降低。于是我出手了&#xff0c;我决定薅完我20几年的头发来肝一下…

TC275——10GPT12_PWM_Generation

产生PWM的方式有很多&#xff0c;这里尝试使用TC275的GPT12模块&#xff0c;来产生具有固定频率和可变占空比的PWM信号。 GPT12就是General Purpose Timer Unit通用定时器模块&#xff0c;它包含5个16位定时器&#xff0c;被分给GPT1和GPT2。 这里使用GPT1&#xff08;T2、T3…

LinuxQQ3.0体验和下载方式

体验 2022年12月31日推出了LinuxQQ3.0版本&#xff0c;2.0版本特别复古 3.0特别丝滑 支持QQ空间 管理界面与WindowsQQ一致 支持截图和表情&#xff0c;传输文件图片很方便 下载方式 下载链接 im.qq.com/linuxqq/index.shtml 选择合适的版本下载即可 从下载文件夹中可以找到…

.Net 6实现旋转验证码

前几篇文章&#xff0c;介绍了.Net 6实现的滑动验证码功能&#xff0c;最近把滑动验证码的ImageSharp替换成了SkiaSharp&#xff0c;其中抠图部分参考了pojianbing大神的代码。滑动验证码完成之后&#xff0c;心想着。做一个旋转验证码。其实旋转验证码跟滑动验证码及其类似。 …

跨系统实时同步数据解决方案

数据量太大&#xff0c;单存储节点存不下&#xff0c;就只能把数据分片存储。 数据分片后&#xff0c;对数据的查询就没那么自由。如订单表按用户ID作为Sharding Key&#xff0c;就只能按用户维度查询。我是商家&#xff0c;我想查我店铺的订单&#xff0c;做不到。&#xff0…

ubuntu18.04下mysql数据库C语言API操作总结

通过C/C去操作数据库需要调用mysql客户端api&#xff0c;常用api和调用举例见后面。 目录 一.常用api 1.环境初始化 2.连接 mysql 的服务器 3.增删改查操作 4.事务处理 5.处理查询数据集合 6.释放资源&#xff0c;关闭连接 7.字符集相关 8.获取错误信息 二.api调用举…

Linux杂谈之sudo

一 sudo配置文件/etc/sudoers介绍 ① 什么是sudo 1) sudo 的英文全称是 super user do&#xff0c;即以超级用户root 用户的方式执行命令2) /etc/sudoers 是一个文本文件,只有root用户有该命令的执行权限 1) 允许普通用户以特权用户的权限去执行某些特权命令,访问和使用本…

优秀国土空间规划设计网络评选投票投票怎么进行小程序免费使用

如果通过一个小程序免费制作一个微信投票活动呢&#xff1f;文章详细讲解如何利用一款免费好用的微信小程序“活动星投票”小程序来制作投票活动&#xff0c;无需注册即可免费制作&#xff0c;非常的方便快捷&#xff0c;可以实现视频投票、分组投票、隐藏选手票数、导出投票数…

【Linux】进程概念(下)

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;进程状态&…

手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)

导 读 本文将手把手教你用Python和OpenCV搭建一个半自动标注工具&#xff08;包含详细步骤 源码&#xff09;。 背景介绍 样本标注是深度学习项目中最关键的部分&#xff0c;甚至在模型学习效果上起决定性作用。但是&#xff0c;标注工作往往非常繁琐且耗时。一种解决方案是…

【苹果家庭群发推】创作AppleScript脚本来控制MacOS附有的iMessage客户端停止考据,近似于组iMessage

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…