Mybatis-Plus中的and()和or()的使用与原理介绍

一. 简单无优先级连接(即无括号的sql语句)

简单来说,两个子条件间默认and与连接,若两个之间显式写出or()则or或连接.

1. 与连接 and()

当需要简单的将两个条件与连接,则最直接的写法为:

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
eq("attr_id",key).
eq("catelog_id",catelogId);

当然也可以显式地写出and()如下,但没必要:

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
eq("attr_id",key);

queryWrapper.and(qr -> qr.eq("catelog_id", catelogId));

2. 或连接 or()

当需要简单的将两个条件或连接,则最直接的写法为:

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
eq("attr_id",key).
or().
eq("catelog_id",catelogId);

当然也可以如下,但不那么直观:

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
eq("attr_id",key);

queryWrapper.or(qr -> qr.eq("catelog_id", catelogId));

二. 复杂有优先级的的连接

上面有2个不推荐的做法,是因为sql语句为A or B , A and B这种简单连接.当涉及到诸如 A and ( B or C) and D 这类的复杂有优先级的的连接,直接拼接会导致成为 A and B or C and D.所以这时候需要需要or(Consumer consumer),and(Consumer consumer)这两个方法.示例如下:

        QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().eq("attr_type", "base".equalsIgnoreCase(type) ? 1 : 0);


        queryWrapper.and(qr -> 
                qr.eq("attr_id", key).
                   or().
                   like("attr_name", key)
        );
        


        queryWrapper.and(qr -> qr.eq("catelog_id", catelogId));
        

生成的sql语句如下:

select ...
WHERE (attr_type = ? AND ( (attr_id = ? OR attr_name LIKE ?) ) AND ( (catelog_id = ?) ))
...;

由此还可见or(Consumer consumer),and(Consumer consumer)这两个方法参数为Consumer时,会在连接处生成2对括号,以此提高优先级.

  • 24
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Mybatis-Plus,可以混用and和or来构建复杂的查询条件。例如,可以使用and连接多个条件,也可以使用or连接多个条件,还可以同时使用and和or来构建查询条件。 使用and连接多个条件时,查询结果必须同时满足所有条件。例如,查询年龄大于20且性别为男的用户,可以使用如下代码: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("gender", "男").gt("age", 20); List<User> userList = userMapper.selectList(wrapper); ``` 使用or连接多个条件时,查询结果只需要满足其一个条件即可。例如,查询年龄大于20或性别为男的用户,可以使用如下代码: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.or(i -> i.gt("age", 20)).or(i -> i.eq("gender", "男")); List<User> userList = userMapper.selectList(wrapper); ``` 同时使用and和or来构建查询条件时,可以使用括号来明确优先级。例如,查询年龄大于20且(性别为男或姓名为张三)的用户,可以使用如下代码: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.gt("age", 20).and(i -> i.eq("gender", "男").or().eq("name", "张三")); List<User> userList = userMapper.selectList(wrapper); ``` ### 回答2: mybatis-plus是一个比mybatis更加方便实用的ORM框架,它提供了许多基于mybatis的功能拓展,以简化数据访问层的开发工作。其and和or混用是mybatis-plus一种实用功能,它可以帮助我们更快地查询到符合条件的数据。 当我们需要查询符合多个条件的数据时,我们通常会使用and关键字来连接多个条件。但是,当我们需要查询符合任意一个条件的数据时,就需要使用or关键字。而在一些实际的查询场景,我们可能需要同时使用and和or来查询数据,这时就需要用到mybatis-plus的and和or混用。 在mybatis-plus,我们可以使用QueryWrapper类来实现and和or混用的查询。首先,我们可以使用QueryWrapper的lambda表达式来封装需要查询的条件,然后使用and和or关键字来连接这些条件。例如,我们可以使用以下代码来查询schoolId为1并且grade为2或者3的学生信息: QueryWrapper<Student> wrapper = new QueryWrapper<>(); wrapper.lambda().eq(Student::getSchoolId, 1).and(i -> i.eq(Student::getGrade, 2).or().eq(Student::getGrade, 3)); List<Student> students = studentMapper.selectList(wrapper); 在上述代码,我们使用了eq方法来添加等于条件,and方法来添加and条件,or方法来添加or条件。使用i -> i.eq(Student::getGrade, 2)的方式来封装了grade等于2的条件,同时使用or() .eq(Student::getGrade, 3)的方式来封装了grade等于3的条件。这样,我们就实现了and和or混用的查询。 综上所述,mybatis-plus的and和or混用可以帮助我们更方便地查询符合多个条件的数据,其使用方式十分灵活和方便,使用QueryWrapper的lambda表达式可以帮助我们更加便捷地封装查询条件。 ### 回答3: Mybatis-plusMybatis的增强工具包,其包含了许多实用的功能。当我们在使用Mybatis-plus进行数据操作时,经常需要使用and和or混合使用来实现更加复杂的查询条件。这其需要注意以下几点: 1. 明确使用哪种逻辑连接符 在使用and和or混合使用时,需要明确使用哪种逻辑连接符。and表示必须满足所有条件才能查询到结果,而or则表示只需要满足其任意一个条件即可查询到结果。因此,在使用and和or混合使用时,需要根据实际需求选择哪种逻辑连接符。 2. 设定括号分组 在使用and和or混合使用时,括号分组的设定非常重要。括号分组可以控制逻辑运算的先后顺序,进而实现更加复杂的查询条件。例如,我们需要查询所有age>20或者name包含"Tom"并且createTime>2022-01-01的记录,可以使用如下语句: LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.and(wq -> wq.like(User::getName, "Tom")).or(wq -> wq.gt(User::getAge, 20).gt(User::getCreateTime, LocalDateTime.parse("2022-01-01 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))); 在这个例子,我们首先使用一个and语句组将name包含"Tom"和createTime>2022-01-01这两个条件分组,其name包含"Tom"的条件用了一个like操作符;然后再使用or语句组将age>20和前面得到的条件组合起来,其age>20的条件使用gt(大于)操作符,createTime>2022-01-01的条件使用gt(大于)操作符并使用LocalDateTime.parse方法将字符串转换为LocalDateTime类型的时间。 3. 注意实体类字段的数据类型 在使用and和or混合使用时,需要注意实体类字段的数据类型是否与查询条件的数据类型一致。如果实体类字段的数据类型与查询条件的数据类型不一致,则需要进行数据类型的转换。例如,在使用and和or混合使用时,如果实体类字段的数据类型为LocalDateTime,而查询条件的数据类型为字符串,则需要使用LocalDateTime.parse方法将字符串转换为LocalDateTime类型的时间。 总之,在使用Mybatis-plus进行and和or混合使用时,需要明确使用哪种逻辑连接符,设定括号分组以及注意实体类字段的数据类型,才能实现更加复杂的查询条件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值