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

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis-Plus:条件构造器(allEq基本比较操作模糊查询排序逻辑查询select)相关的知识,希望对你有一定的参考价值。

本节案例承接上节案例

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. 模糊查询

示例代码:

    @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 = ?)



以上是关于Mybatis-Plus:条件构造器(allEq基本比较操作模糊查询排序逻辑查询select)的主要内容,如果未能解决你的问题,请参考以下文章

MP教程-条件构造

25 mybatis-plus常用语法

MyBatis-Plus02_条件构造器QueryWrapperUpdateWrapperconditionLambdaQuery

mybatis-plus条件构造器EntityWrapper

mybatis-plus条件构造器

mybatis-plus条件构造器