广告位联系
返回顶部
分享到

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

java 来源:互联网 作者:佚名 发布时间:2022-09-12 08:07:06 人浏览
摘要

一. 简单无优先级连接(即无括号的sql语句) 简单来说,两个子条件间默认and与连接,若两个之间显式写出or()则or或连接. 1. 与连接 and() 当需要简单的将两个条件与连接,则最直接的写法为:

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

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

1. 与连接 and()

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

1

2

3

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().

eq("attr_id",key).

eq("catelog_id",catelogId);

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

1

2

3

4

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().

eq("attr_id",key);

  

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

2. 或连接 or()

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

1

2

3

4

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().

eq("attr_id",key).

or().

eq("catelog_id",catelogId);

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

1

2

3

4

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)这两个方法.示例如下:

1

2

3

4

5

6

7

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语句如下:

1

2

3

select ...

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

...;

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

补充:MybatisPlus中and和or的组合使用

案例1:where   A=? and B=? 

1

2

//SELECT id,name,age,sex FROM student WHERE (name = ? AND age = ?)

List<Student> list = studentService.lambdaQuery().eq(Student::getName, "1").eq(Student::getAge, 1).list();

案例2:where A=? or B=? 

1

2

//SELECT id,name,age,sex FROM student WHERE (name = ? OR age = ?)

List<Student> list = studentService.lambdaQuery().eq(Student::getName, "1").or().eq(Student::getAge, 12).list();

案例3:where A=? or(C=? and D=?) 

1

2

3

4

5

6

7

  //SELECT id,name,age,sex FROM student WHERE (name = ? OR (name = ? AND age = ?))

List<Student> list =

    studentService

        .lambdaQuery()

        .eq(Student::getName, "1")

        .or(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12))

        .list();

案例4:where (A=?andB=?)or(C=?andD=?) 

1

2

3

4

5

6

7

// SELECT id,name,age,sex FROM student WHERE ((name = ? AND age = ?) OR (name = ? AND age = ?))

List<Student> list =

    studentService

        .lambdaQuery()

        .and(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12))

        .or(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12))

        .list();

案例5:whert  A =? or (B=? and ( C=? or D=?)) 

1

2

3

4

5

6

7

8

9

10

// SELECT * FROM student WHERE ((name <> 1) OR (name = 1 AND (age IS NULL OR age >= 11)))

List<Student> list =

    studentService

        .lambdaQuery()

        .and(wp -> wp.ne(Student::getName, "1"))

        .or(

            wp ->

                wp.eq(Student::getName, "1")

                    .and(wpp -> wpp.isNull(Student::getAge).or().ge(Student::getAge, 11)))

        .list();


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/qq_43318840/article/details/125704216
    Tag :
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计