Mybatis-Plus:条件构造器(allEq、基本比较操作、模糊查询、排序、逻辑查询、select)

本文详细介绍了Mybatis-Plus中的条件构造器,包括allEq方法的使用,如如何处理null值,以及基本比较操作、模糊查询、排序、逻辑查询和指定字段选择等功能,并给出了相应的测试用例和SQL生成结果。
摘要由CSDN通过智能技术生成

本节案例承接上节案例

1. 条件构造器

Mybatis-Plus中,Wrapper接口的实现类关系如下:
在这里插入图片描述

可以看到,AbstractWrapperAbstractChainWrapper是重点实现,接下来我们重点学习AbstractWrapper以及其子类。

说明:

QueryWrapper(LambdaQueryWrapper)UpdateWrapper(LambdaUpdateWrapper) 的父类 用于生成 sqlwhere 条件, entity 属性也用于生成 sqlwhere 条件 注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为。

下面学习具体的条件构造器


1. allEq

该方法用来查找所有符合条件的数据


1.1 说明

在这里插入图片描述


1.2 测试用例(我们主要是查看生成的SQL)

params为:

        Map<String, Object> params = new HashMap<>();
        params.put("name", "李四");
        params.put("age", "20");
        params.put("password", null);

1.2.1 wrapper.allEq(params):包含null

生成的SQL为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (password IS NULL AND name = ? AND age = ?)

		...
        QueryWrapper<User> wrapper = new QueryWrapper<>();
       
        wrapper.allEq(params);
        
        this.userMapper.selectList(wrapper);
        ...

在这里插入图片描述


1.2.2 wrapper.allEq(params, false):不包含null

生成的SQL为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? AND age = ?)

		...
        QueryWrapper<User> wrapper = new QueryWrapper<>();
       
        wrapper.allEq(params, false);
        
        this.userMapper.selectList(wrapper);
        ...

在这里插入图片描述


1.2.3 wrapper.allEq((k, v) -> (k.equals(“age”) || k.equals(“id”)), params):过滤器过滤出指定的条件

示例1:

生成的SQL为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (age = ?)

		...
        QueryWrapper<User> wrapper = new QueryWrapper<>();
       
       // 这里查询的是查询的key要么是age要么是id
        wrapper.allEq((k, v) -> (k.equals("age") || k.equals("id")), params);
        
        this.userMapper.selectList(wrapper);
        ...

示例2:

生成的SQL为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? AND age = ?)

		...
        QueryWrapper<User> wrapper = new QueryWrapper<>();
       
       // 这里查询的是查询的key要么是age要么是id要么是name
       wrapper.allEq((k, v) -> (k.equals("age") || k.equals("id") || k.equals("name")), params);
        
        this.userMapper.selectList(wrapper);
        ...

2. 基本比较操作

  • eq(equal):等于 =
  • ne(not equal):不等于 <>
  • gt(greater than):大于 >
  • ge(Greater than or equal to):大于等于 >=
  • It(less than):小于 <
  • le(Less than or equal to):小于等于 <=
  • between:BETWEEN 值1 AND 值2
  • notBetween:NOT BETWEEN 值1 AND 值2
  • in:字段 IN (value.get(0), value.get(1), …)
  • notIn:字段 NOT IN (v0, v1, …)

示例代码:

    @Test
    public void testEq() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();

        // 查找 满足下面3个条件的人
        // 1. password 等于 123456
        // 2. age 大于等于 20
        // 3. 名字是 "李四" or "王五" or "赵六" 
        wrapper.eq("password", "123456")
                .ge("age", 20)
                .in("name", "李四", "王五", "赵六");

        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

生成的sql为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (password = ? AND age >= ? AND name IN (?,?,?))
在这里插入图片描述


3. 模糊查询

like

示例代码:

    @Test
    public void testLike() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // name like '%五'
        wrapper.likeLeft("name", "五");

        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

生成的sql为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name LIKE '%五')
在这里插入图片描述


4. 排序

在这里插入图片描述

示例代码;

在这里插入图片描述

    @Test
    public void testOrderByAgeDesc() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 按照age和name逆序排序
        // SELECT id,user_name,password,name,age,email FROM tb_user ORDER BY age ASC,name ASC
        wrapper.orderBy(true, true, "age", "name");

        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

生成的sql为:com.tian.springbootmybatisplus.SpringbootMybatisplusApplicationTests#testOrderByAgeDesc
在这里插入图片描述


5. 逻辑查询

在这里插入图片描述

示例代码:

    @Test
    public void testOr() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        
        // 查询name为王五 或者 age为21的用户
        wrapper.eq("name", "王五").or().eq("age", 21);

        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

生成的sql为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? OR age = ?)

在这里插入图片描述


6. select(指定查询的字段:默认所有)

Mybatis-Plus查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。

示例代码:

查询 name 为 王五 或者 age 为 21 的用户的 id和name和age

    @Test
    public void testSelect() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 查询 name 为 王五 或者 age 为 21 的用户的 id和name和age
        wrapper.eq("name", "王五")
                .or()
                .eq("age", 21)
                .select("id", "name", "age"); //指定查询的字段
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

生成的sql为:SELECT id,name,age FROM tb_user WHERE (name = ? OR age = ?)

在这里插入图片描述



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值