速通——条件构造器(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

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值