当前位置:   article > 正文

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

mybatisplus or

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

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

1. 与连接 and()

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

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

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

  1. QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
  2. eq("attr_id",key);
  3. queryWrapper.and(qr -> qr.eq("catelog_id", catelogId));

2. 或连接 or()

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

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

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

  1. QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
  2. eq("attr_id",key);
  3. 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)这两个方法.示例如下:

  1. QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().eq("attr_type", "base".equalsIgnoreCase(type) ? 1 : 0);
  2. queryWrapper.and(qr ->
  3. qr.eq("attr_id", key).
  4. or().
  5. like("attr_name", key)
  6. );
  7. queryWrapper.and(qr -> qr.eq("catelog_id", catelogId));

生成的sql语句如下:

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/158338
推荐阅读
相关标签
  

闽ICP备14008679号