首页 > 其他分享 >速通——条件构造器(Wrapper)

速通——条件构造器(Wrapper)

时间:2024-07-26 21:27:20浏览次数:15  
标签:QueryWrapper name tdm age userMapper Wrapper 查询 构造 速通

在 MyBatis-Plus 中,Wrapper 类是构建查询和更新条件的核心工具。利用MyBatis-Plus的Wrapper用于构建复杂的数据库查询条件。允许链式调用。

核心条件构造器

Wrapper的层次结构为

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

- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
    - QueryWrapper : 查询/删除条件封装
    - UpdateWrapper : 修改条件封装
    - AbstractLambdaWrapper : 使用Lambda 语法
        - LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
        - LambdaUpdateWrapper : Lambda 更新封装Wrapper

在讲解几个实现类之前,先对常用的通用方法进行讲解

常用的通用方法

g 是greater=大于

l 是 less =小于

e 是equals =等于

所以,不难看出

符号描述
eq等于 (equal)
ne不等于 (not equal)
le小于等于 (less than or equal)
lt小于 (less than)
gt大于 (greater than)
ge大于等于 (greater than or equal)

 like

 @Test
    public void testLike() {
        // 1. 使用 like 匹配 name 字段包含 "tdm" 的记录
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.like("name", "tdm");
        List<User> users = userMapper.selectList(wrapper);
        System.out.println("like: " + users);
        // 对应的 SQL 语句:SELECT * FROM user WHERE name LIKE '%tdm%'

        // 2. 使用 notLike 匹配 name 字段不包含 "tdm" 的记录
        QueryWrapper<User> wrapper2 = new QueryWrapper<>();
        wrapper2.notLike("name", "tdm");
        List<User> users2 = userMapper.selectList(wrapper2);
        System.out.println("notLike: " + users2);
        // 对应的 SQL 语句:SELECT * FROM user WHERE name NOT LIKE '%tdm%'

        // 3. 使用 likeLeft 匹配 name 字段以 "tdm" 开头的记录
        QueryWrapper<User> wrapper3 = new QueryWrapper<>();
        wrapper3.likeLeft("name", "tdm");
        List<User> users3 = userMapper.selectList(wrapper3);
        System.out.println("likeLeft: " + users3);
        // 对应的 SQL 语句:SELECT * FROM user WHERE name LIKE 'tdm%'

        // 4. 使用 likeRight 匹配 name 字段以 "tdm" 结尾的记录
        QueryWrapper<User> wrapper4 = new QueryWrapper<>();
        wrapper4.likeRight("name", "tdm");
        List<User> users4 = userMapper.selectList(wrapper4);
        System.out.println("likeRight: " + users4);
        // 对应的 SQL 语句:SELECT * FROM user WHERE name LIKE '%tdm'
    }

还有更多在官网详细查询条件构造器 | MyBatis-Plus

 

Wrapper实现类

1. QueryWrapper:

  • 
    
    public class WrapperTest {
    
        @Resource
        private UserMapper userMapper;
    
        @Test
        public void testQueryWrapper() {
            // 构建查询条件
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            // 查询 name 等于 "tdm" 的记录
            queryWrapper.eq("name", "tdm"); 
    
            // 执行查询
            List<User> users = userMapper.selectList(queryWrapper);
            System.out.println("QueryWrapper: " + users);
        }
    }
    
  •  

    QueryWrapper 是 Mybatis-Plus 提供的用于构建查询条件的类,它使用字符串形式的字段名来指定查询条件。在上面的示例中,我们使用 eq("name", "tdm") 来指定查询 name 字段等于 "tdm" 的记录。QueryWrapper 支持多种条件构建方法,例如 negtltgeleinnotInisNullisNotNulllikenotLikelikeLeftlikeRight 等。

2. UpdateWrapper:

  •  
    
    public class WrapperTest {
    
        @Resource
        private UserMapper userMapper;
    
        @Test
        public void testUpdateWrapper() {
            // 构建更新条件
            UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
            // 更新 name 等于 "tdm" 的记录的 age 为 20
            updateWrapper.eq("name", "tdm").set("age", 20); 
    
            // 执行更新
            userMapper.update(null, updateWrapper);
        }
    }
    
  • UpdateWrapper 是 Mybatis-Plus 提供的用于构建更新条件的类,它与 QueryWrapper 类似,但用于更新操作。在上面的示例中,我们使用 eq("name", "tdm").set("age", 20) 来指定更新 name 字段等于 "tdm" 的记录的 age 属性为 20。UpdateWrapper 支持多种条件构建方法,与 QueryWrapper 相同。

3. LambdaQueryWrapper:

  •  
    public class WrapperTest {
    
        @Resource
        private UserMapper userMapper;
    
        @Test
        public void testLambdaQueryWrapper() {
            // 构建查询条件
            LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            // 查询 name 等于 "tdm" 的记录
            lambdaQueryWrapper.eq(User::getName, "tdm"); 
    
            // 执行查询
            List<User> users = userMapper.selectList(lambdaQueryWrapper);
            System.out.println("LambdaQueryWrapper: " + users);
        }
    }
    
  • LambdaQueryWrapper 是 Mybatis-Plus 提供的用于构建查询条件的类,它使用 Lambda 表达式来指定字段,避免了字符串形式的字段名带来的错误风险。在上面的示例中,我们使用 eq(User::getName, "tdm") 来指定查询 name 字段等于 "tdm" 的记录。LambdaQueryWrapper 支持多种条件构建方法,与 QueryWrapper 相同。

4. LambdaUpdateWrapper:

  •  
    public class WrapperTest {
    
        @Resource
        private UserMapper userMapper;
    
        @Test
        public void testLambdaUpdateWrapper() {
            // 构建更新条件
            LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
            // 更新 name 等于 "tdm" 的记录的 age 为 20
            lambdaUpdateWrapper.eq(User::getName, "tdm").set(User::getAge, 20); 
            // 执行更新
            userMapper.update(null, lambdaUpdateWrapper);
        }
    }
    
  • LambdaUpdateWrapper 是 Mybatis-Plus 提供的用于构建更新条件的类,它与 LambdaQueryWrapper 类似,但用于更新操作。在上面的示例中,我们使用 eq(User::getName, "tdm").set(User::getAge, 20) 来指定更新 name 字段等于 "tdm" 的记录的 age 属性为 20。LambdaUpdateWrapper 支持多种条件构建方法,与 LambdaQueryWrapper 相同。

链式调用

MyBatis-Plus支持链式调用,因为Wrapper实现类中,方法都返回this。这样,每次方法调用后,都可以继续调用下一个方法,而不需要显式地保存和传递对象的引用。

链式调用之间默认用 AND 连接,需要用OR 或者AND的别的方法可以自行调用

QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();
        QueryWrapper<User> queryWrapper2 =new QueryWrapper<>();
        QueryWrapper<User> queryWrapper3 = new QueryWrapper<>();
        /*SELECT id,name,age,email FROM user WHERE (age < ? OR age > ?)*/
        queryWrapper1.lt("age", 20).or().gt("age", 30);
        List<User> list1 = userService.list(queryWrapper1);
        list1.forEach(System.out::println);
        /*SELECT id,name,age,email FROM user WHERE (age >= ? AND age <= ?)*/
        queryWrapper2.ge("age",20).le("age",30);
        List<User> list2 =userService.list(queryWrapper2);
        list2.forEach(System.out::println);
        /*SELECT id,name,age,email FROM user WHERE (email LIKE ? AND (age < ? OR age > ?))*/
        queryWrapper3.like("email", "baomidou.com").and(wrapper -> wrapper.lt("age", 30).or().gt("age", 40));
        List<User> list3 = userService.list(queryWrapper3);
        list3.forEach(System.out::println);

 list1

list2

list3

标签:QueryWrapper,name,tdm,age,userMapper,Wrapper,查询,构造,速通
From: https://blog.csdn.net/weixin_63698171/article/details/140723090

相关文章

  • 构造题!
    构造题真的是能靠做题练出来的吗,看样子只能见一题学一题了构造题基本都是将题目里的复杂操作都转化成一些基本的,不变的,简洁的操作,以便代码可以处理每种情况CF1916D根本没思路。首先打个表,发现可能可以只用1,6,9,0来构造。一种简单的构造是在平方数后面加两个0,通过打表发现,可以......
  • 如果查询不在构造函数中,为什么 Sqlalchemy 会清理查询结果?
    我创建了一个类Result,它接受sqlalchemy语句,存储该语句,执行该语句,并存储执行结果。如果直接在__init__()中执行该语句,下面的脚本将产生预期的结果:1TestJE12TestJE2但是如果该语句在set_result()中执行,下面的脚本输出Nores......
  • Numpythonic 方式从所需的时间步长和窗口大小构造窗口向量
    给定参数timestep=2window_size=3我已经展平了大小为9的时间序列向量。内容是:arr=np.array([1,2,3,4,5,6,7,8,9])如何使用这些参数重塑/构造窗口时间序列?我希望输出具有形状unknown,window_size)所以,它的输出将是这样的矩阵:windowed_arr=np......
  • C++ - 目录 - 一周速通
    基础入门免费教程希望可以帮助每一位编程爱好者!开源地址:点我加入开发工具随课习题文章目录C++基础-0-了解历史C++基础-1-开始入门C++基础-2-数据类型C++基础-3-变量常量C++基础-4-运算符号C++基础-5-条件判断C++基础-6......
  • 【C++】再探构造函数 - 初始化列表详解
    ......
  • C++(构造函数参数列表初始化)
    目录1.构造函数参数列表初始化的语法2.为什么使用参数列表初始化3.示例4.常量和引用成员的示例5.使用参数列表初始化的注意事项6.总结在C++中,构造函数参数列表初始化(initializerlist)是一种用于在对象创建时初始化成员变量的语法。这种方式在性能和可读性方面具有一些优势,......
  • 【学习笔记】构造函数、原型对象、原型链
    在JavaScript中,每个对象都有一个原型对象,原型对象也是一个对象,它包含了对象的共享属性和方法。每个构造函数(除了箭头函数)都有一个prototype属性,该属性指向构造函数的原型对象。当我们使用构造函数创建一个新对象时,该对象会继承构造函数的原型对象中的属性和方法,这种继承关系......
  • FreeRTOS操作系统(详细速通篇)——— 第十章
            本专栏将对FreeRTOS进行快速讲解,带你了解并使用FreeRTOS的各部分内容。适用于快速了解FreeRTOS并进行开发、突击面试、对新手小白非常友好。期待您的后续关注和订阅!目录FreeRTOS任务相关API函数1任务优先级相关API函数(1)uxTaskPriorityGet(2)vTaskPriorityS......
  • C++深拷贝构造函数解决浅拷贝的堆区内存重复释放问题
    1.简单介绍先简单介绍一下浅拷贝和深拷贝:浅拷贝->简单的赋值拷贝操作,默认的拷贝构造函数就是浅拷贝。深拷贝->在堆区重新申请空间,进行拷贝操作。2.问题展示下面用代码示例明了地展示默认拷贝构造函数浅拷贝带来地堆区内存重复释放问题:#include<iostream>usingnamespace......
  • modint 默认构造函数的一些想法
    今、在zhengruioi.com上参加模拟赛时被卡常了。这道题目涉及对\(998244353\)取模的操作,故我使用我自制的由atcoder::static_modint改写而来的modint完成了代码,这两个板子大致如下://modinttemplate<unsignedumod>structmodint{/*{{{*/staticconstexprintmod......