MyBatisPlus中的条件构造器Wrapper

news2025/7/23 22:53:15

引言

为什么要了解Wrapper?Wrapper解决的了什么问题?

一、Wrapper:条件构造抽象类,用来解决单表操作出现的一些复杂问题,例如排序,和模糊查询等等

结构图

文字解释

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

  • QueryWrapper : 查询条件封装

  • UpdateWrapper : Update 条件封装

  • AbstractLambdaWrapper : 使用Lambda 语法

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

  • LambdaUpdateWrapper : Lambda 更新封装Wrapper

二、Wrapper的子类解读

  1. QueryWrapper

组装查询条件

代码段如下

@Autowired
    private UserMapper userMapper;
    @Test
    public void test01() {
//  查询条件      用户名包含a,年龄在20-30之间,邮箱.com
        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);

userMapper.selectList(条件构造器)

QueryWrapper条件构造器的创建过程

  QueryWrapper<User> queryWrapper = new QueryWrapper<>();//创建QueryWrapper对象
        queryWrapper.like("name", "a")//模糊查询
                .between("age", 20, 30)//查询条件在20-30之间
                .isNotNull("email");//判断不为空的条件

gt:greater than(大于)

lt:less than (小于)

like:模糊查询

between:两者之间

格式为(“列名称”,传入相应的值)

组装删除

代码段如下

@Test
public void test03(){
    //删除email为空的用户
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.isNull("email");
    //条件构造器也可以构建删除语句的条件
    int result = userMapper.delete(queryWrapper);
    System.out.println("受影响的行数:" + result);
}

条件的优先级

代码段如下

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

查询和删除使用的一般都为QueryWrapper

2.UpdateWrapper

组装更新

@Test
public void test07() {
    //将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
    //组装set子句以及修改条件
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    //lambda表达式内的逻辑优先运算
    updateWrapper
    .set("age", 18)//修改类型的值
    .set("email", "user@atguigu.com")//修改类型的值
    .like("username", "a")
    .and(i -> i.gt("age", 20).or().isNull("email"));//或运算的方法,并且要在and里面才可以用
    int result = userMapper.update(null, updateWrapper);
    System.out.println(result);
}

这里为了解决年龄大于或为null,并name包含a的信息修改

或这里因为需要连载一起数学符号表示为(a | b)c

这里条件构造器就用到了and(i->i.限制条件)的方法

3.condition

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

condition使用代码

@Test
public void test08() {
    //定义查询条件,有可能为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);
    }
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

可以有效的放置输入的字符是不是正确的

4.LambdaQueryWrapper

将放置输入输出错误的思想带入,直接进行有效的输入

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

5.LambdaUpdateWrapper

@Test
public void test10() {
    //组装set子句
    LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper
        .set(User::getAge, 18)
        .set(User::getEmail, "user@atguigu.com")
        .like(User::getName, "a")
        .and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail)); //lambda
    表达式内的逻辑优先运算
    User user = new User();
    int result = userMapper.update(user, updateWrapper);
    System.out.println("受影响的行数:" + result);
}

总结

  • Wrapper的提出很好的解决了模糊查询

  • Wrapper条件构造器解决了大部分单表操作的数据

  • UpdateWrapper 用于更新操作

  • QueryWrapper用于删除和查询操作

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

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

相关文章

java设计模式学习

一、设计模式7大原则1.单一职责原则 (Single Responsibility Principle) 在类级别和方法级别进行职责规划&#xff0c;专人专事2.开放-关闭原则 (Open-Closed Principle) 增加接口功能时&#xff0c;尽可能不要修改原有代码3.里氏替换原则 (Liskov Substitution Principle) 子类…

华为HCIE学习之Openstack keystone组件

文章目录一、keystone对象模型二、使用token的好处Token的实现模式1、UUID Token,每次验证需要访问keystone服务端2、PKI Token 验证&#xff0c;在客户端即可完成 发放公钥 私钥解密3、RBAC三、policy.json权限实验一、keystone对象模型 二、使用token的好处 1、token缓存在客…

什么是数字化?企业如何实现数字化?

随着社会的发展与时代的进步&#xff0c;以生产为核心的企业也在进行不断的创新&#xff0c;而新一代信息技术的应用深化&#xff0c;制造业迎来了数字化转型新机遇。数字化转型近些年更多的被提及&#xff0c;越来越多的企业想通过数字化的转型&#xff0c;降低企业运营成本&a…

《Ansible变量篇:ansible中事实变量facts》

一、简介 facts组件是ansible用于采集被管理机器设备信息的一个功能, 采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac地址,时间/日期相关数据,硬件信息等。 ansible有一个模块叫setup,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用,而…

【python】剑指offer代码大集合

剑指 Offer(第 2 版) https://leetcode.cn/problem-list/xb9nqhhg/ 剑指 Offer 03. 数组中重复的数字 https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/ # 法1:哈希表(Set) class Solution:def findRepeatNumber(self, nums: [

CentOS8基础篇12:使用RPM管理telnet-server软件包

一、RPM包管理工具简介 RedHat软件包管理工具(RedHat Package Manager&#xff0c;RPM) RPM软件包工具常用于软件包的安装、查询、更新升级、校验、卸载以及生成.rpm格式的软件包等操作。 RPM软件包工具只能管理后缀是.rpm的软件包。软件包的命名格式&#xff1a; 软件名称…

java 实现pgsql数据库免密备份 Windows版本

阐述下背景&#xff1a; 最近公司项目中有个功能模块&#xff0c;需要使用java实现pgsql数据库整库的数据备份&#xff0c;没有pgsql使用经验的我&#xff0c;在网上寻找了好多大神的帖子&#xff0c;也没发现适合自己当前场景的解决方案&#xff0c;但是我把大神们的帖子按照自…

某开源远程办公软件安装配置说明

******是开源软件&#xff0c;只需要简单的配置&#xff0c;就可以在企业搭建SSL VPN&#xff0c;满足日常远程办公的需求。本篇文档为在windows服务器安装搭建openvpn记录&#xff0c;仅供参考。 拓扑说明 使用虚拟机进行测试&#xff0c;主机操作系统Windows 10和m0n0。模拟…

【Java|golang】1247. 交换字符使得字符串相同

有两个长度相同的字符串 s1 和 s2&#xff0c;且它们其中 只含有 字符 “x” 和 “y”&#xff0c;你需要通过「交换字符」的方式使这两个字符串相同。 每次「交换字符」的时候&#xff0c;你都可以在两个字符串中各选一个字符进行交换。 交换只能发生在两个不同的字符串之间…

JavaEE简单示例——MyBatis的缓存机制

简单介绍&#xff1a; 缓存机制的存在&#xff0c;是为了当我们在执行重复的SQL代码的时候&#xff0c;不需要重新向数据库进行访问&#xff0c;而是将之前查询的结果存放在内存当中&#xff0c;从而减少我们重复的获取数据库连接进行查询时候消耗的资源&#xff0c;是一种加快…

内容产品项目作品 || 项目背景及需求分析(一)

一、项目背景介绍 如果让大家来做一个没接触过的产品&#xff0c;思路&#xff1a; 先了解产品所在的行业&#xff0c;多看看第三方的行业研究的文章了解产品的主要竞品&#xff0c;这样做产品设计的时候不会乱搞 常见的内容产品形态&#xff1a;图文、音视频、直播等 二、…

走!来学习配置基于IP子网划分VLAN

划分VLAN的方式有&#xff1a;基于接口、基于MAC地址、基于子网、基于协议、基于策略&#xff08;MAC地址、IP地址、接口&#xff09; 基于IP子网划分VLAN经常适用于对安全需求不高、对移动性和简易管理需求较高的场景中。比如&#xff0c;一台PC配置多个IP地址分别访问不同网段…

Traefik v2.9-IngressRoute

文章目录简介资源交付创建CRD和RBAC创建ConfigMap创建Deployment创建Service创建traefik-dashboard-ingressroute简介 The Kubernetes Ingress Controller, The Custom Resource Way. In early versions, Traefik supported Kubernetes only through the Kubernetes Ingress …

Android SurfaceTexture说明

what 1. SurfaceTexture用来捕获视频流中的图像帧&#xff0c;视频流可以是相机预览或者是视频解码数据。 里边承接图像数据的也是GraphicBuffer, GLConsumer 作为其BufferQueue的消费方&#xff0c;取得数据后可以通过eglImage挂到opengles texture 里边对其做纹理采样。 ho…

学习笔记三:容器,镜像相关操作,并部署nginx

这里写目录标题镜像相关命令从dockerhub查找镜像容器相关操作以交互式方式启动并进入容器以守护进程方式启动容器查看正在运行的容器通过docker部署nginx服务在docker里安装nginx创建静态页面访问docker里的nginx服务流量走向&#xff1a;镜像相关命令 从dockerhub查找镜像 d…

mTip 输入法状态跟踪提示 ,可以更改热键等

ImTip ( 输入法状态跟踪提示 )最新版本是 v4.4 :免费开源&#xff0c;仅 715 KB。单文件绿色软件&#xff0c;无任何外部依赖&#xff0c;兼容 XP&#xff0c;Vista&#xff0c;Win7&#xff0c;Win8&#xff0c;Win10&#xff0c;Win11 …… 等所有流行桌面操作系统。源代码: …

Java设计模式笔记——六个创建型模式

系列文章目录 Java设计模式笔记——七大设计原则 文章目录系列文章目录一、简单工厂模式1.概念2.案例分析3.使用简单工厂模式进行改进4.总结二、工厂方法模式1.概念2.案例分析3.使用工厂方法模式进行改进4.总结三、抽象工厂模式1.概念2.案例分析3.使用抽象工厂模式改进4.总结四…

跨端技术或许是提升软件运维效率的利器

凡是代码&#xff0c;难免有 bug。 开发者们的日常&#xff0c;除了用一行行代码搭产品外&#xff0c;便是找出代码里的虫&#xff0c;俗称 debug。 ​随着移动互联网的快速发展&#xff0c;App 已经成为日常生活中不可或缺的一部分。但是在开发者/运维人员的眼里简直就是痛苦…

Win YAPI + Jenkins 实现接口自动化测试

自动化测试 传统的接口自动化测试成本高&#xff0c;大量的项目没有使用自动化测试保证接口的质量&#xff0c;仅仅依靠手动测试&#xff0c;是非常不可靠和容易出错的。 为了解决这个问题&#xff0c;使用YAPI接口自动化测试功能&#xff0c;只需要配置每个接口的入参和对 RE…

网络类型以及数据链路层协议

网络类型以及数据链路层协议网络类型是根据我们数据链路层所运行的协议及规则来划分网络类型的分类P2P --- 点到点 --- point to pointMA --- 多点接入网络BMA --- 广播型多点接入网络NBMA --- 非广播型多点接入网络数据链路层协议MA网络以太网协议特点&#xff1a;需要使用MAC…