用mp也可以方便的实现稍复杂点的条件查询,当然了很复杂的就还是要xml编写sql了。

一、wapper介绍

先看下mp的条件构造抽象类的结构:

  • Wrapper: 条件构造抽象类,最顶端父类
  • AbstractWrapper: 用于查询条件封装,生成 sql 的 where 条件
  • QueryWrapper: Entity 对象封装操作类,不是用lambda语法
  • UpdateWrapper: Update 条件封装,用于Entity对象更新操作
  • AbstractLambdaWrapper: Lambda 语法使用 Wrapper统一处理解析lambda获取数据库字段
  • LambdaQueryWrapper: 用于Lambda语法使用的查询Wrapper
  • LambdaUpdateWrapper: Lambda 更新封装Wrapper

不过最常用的还是QueryWrapperUpdateWrapper等这些。

套路还是那样,先创建QueryWrapper对象,然后再调用各种方法。

    // 测试条件查询
@Test
void testQueryWrapper() {
//创建对象,泛型里加上实体对象
QueryWrapper<User> wrapperUser = new QueryWrapper<>(); // 设置查询的条件
// ge表示 >= , 这里就是查询age字段,大于40的数据
wrapperUser.ge("age", 40);
// 调用查询方法中,传入wrapper对象
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users); }

这里就会查询表里age>=40,的数据,看下执行过程的sql语句:

二、常用的条件方法

在构造条件的时候,除了上面的ge,还有很多其他的方法,这里简单介绍下比较常用的,并且贴出执行的sql。

1. gt 表示 >

        ... ...
// gt表示 > , 这里就是查询age字段,大于40的数据
wrapperUser.gt("age", 40);
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age > ?
==> Parameters: 40(Integer)

2. le 表示 <=

        ... ...
// le表示 <=, 这里就是查询age字段,小于等于40的数据
wrapperUser.le("age", 40);
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age <= ?
==> Parameters: 40(Integer)

3. lt 表示 <

        ... ...
// lt表示 <, 这里就是查询age字段,小于40的数据
wrapperUser.lt("age", 40);
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age < ?
==> Parameters: 40(Integer)

4. isNull 表示 查询值为null

        ... ...
// isNull
wrapperUser.isNull("name");
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name IS NULL
==> Parameters:
<== Total: 0

5. isNotNull 表示 查询值为不为null

        ... ...
// isNotNull
wrapperUser.isNotNull("name");
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name IS NOT NULL
==> Parameters:

6. eq 表示 =

        ... ...
// eq
wrapperUser.eq("name", "大周4");
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name = ?
==> Parameters: 大周4(String)

7. ne 表示 !=

        ... ...
// eq
wrapperUser.ne("name", "大周4");
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name <> ?
==> Parameters: 大周4(String)

8. between 表示 在范围之间,包含边界值

        ... ...
// between
wrapperUser.between("age", 40, 50);
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age BETWEEN ? AND ?
==> Parameters: 40(Integer), 50(Integer)

9. notBetween 表示 在范围之外,不含边界值

        ... ...
// between
wrapperUser.notBetween("age", 40, 50);
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age NOT BETWEEN ? AND ?
==> Parameters: 40(Integer), 50(Integer)

10. notBetween 表示 在范围之外,不含边界值

        ... ...
// between
wrapperUser.notBetween("age", 40, 50);
... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age NOT BETWEEN ? AND ?
==> Parameters: 40(Integer), 50(Integer)

11. allEq 多条件查询

如果我where后面要加多个条件,可以使用allEq。先创建一个hashmap,然后把多个条件put进去,再调用allEq即可。

    @Test
void testQueryWrapper() {
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
Map<String, Object> map = new HashMap<>();
map.put("id", 5);
map.put("name", "wesson5");
map.put("age", 29);
wrapperUser.allEq(map);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users); }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ?
==> Parameters: wesson5(String), 5(Integer), 29(Integer)

12. .链式编程,多条件查询

此外,还可以使用链式编程,直接在后面继续.调用别的方法。

    @Test
void testQueryWrapper() {
//创建对象,泛型里加上实体对象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.eq("age", 29)
.eq("name", "wesson5")
.eq("id", 5);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users); }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age = ? AND name = ? AND id = ?
==> Parameters: 29(Integer), wesson5(String), 5(Integer)

13. or、and

默认情况下,在不调拨or()方法的情况下,是使用and()。

    @Test
void testQueryWrapper() {
//创建对象,泛型里加上实体对象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.eq("age", 29)
.or()
.eq("name", "wesson5")
.or()
.eq("id", 5);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users); }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age = ? OR name = ? OR id = ?
==> Parameters: 29(Integer), wesson5(String), 5(Integer)

14. 嵌套or、嵌套and

查询sql经常会有嵌套or或者and的情况,可以这样写:

    @Test
void testQueryWrapper() {
//创建对象,泛型里加上实体对象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.eq("age", 29)
.or(
i -> i.eq("name", "wesson5")
.or()
.eq("id", 5)
);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users); }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age = ? OR ( name = ? OR id = ? )
==> Parameters: 29(Integer), wesson5(String), 5(Integer)

15. in、notIn

等于sql里的 in和not in。

    @Test
void testQueryWrapper() {
//创建对象,泛型里加上实体对象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.in("id", 1, 2, 3);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users); }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND id IN (?,?,?)
==> Parameters: 1(Integer), 2(Integer), 3(Integer)

16. inSql、notinSql

inSql、notinSql可以用来子查询,比如 where id in (select * ... ...)

    @Test
void testQueryWrapper() {
//创建对象,泛型里加上实体对象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.in("id", "select id from user where id < 5");
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users); }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND id IN (?)
==> Parameters: select id from user where id < '5'(String)

17. last

last可以直接拼接sql到最后,只能调用一次,多次调用以最后一次为准。

注意:有sql注入的风险,慎用。

    @Test
void testQueryWrapper() {
//创建对象,泛型里加上实体对象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.last("limit 1");
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users); }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 limit 1
==> Parameters:

18. 指定要查询的列

只查询出指定的字段,比如"id", "name", "age"。

    @Test
void testQueryWrapper() {
//创建对象,泛型里加上实体对象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.select("id", "name", "age");
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users); }

mp执行的sql:

==>  Preparing: SELECT id,name,age FROM user WHERE deleted=0
==> Parameters:

以上是一些在业务开发中常用的,稍复杂些的条件查询,实际情况可能还有其他组合变化。

【mybatis-plus】条件查询的更多相关文章

  1. Mybatis多条件查询

    在Mybatis多条件查询中: 1.参数如果是多条件,则需要将将添加到Map集合中进行传入. 2.就是将其参数用有序数字进行代替. Mybatis单个String类型参数传递 mysql文如下,传入参 ...

  2. mybatis 按照条件查询

    mybatis 按照条件查询 @Autowired private StudentMapper studentMapper; @Override public Map getStudentList(i ...

  3. MyBatis参数条件查询传入的值为0时的判断

    MyBatis条件查询对字段判断是否为空一般为: <if test="testValue!=null and testValue != ''"> and test_va ...

  4. SSM整合 mybatis多条件查询与分页

    多条件查询与分页: 通过页面的houseName.floorage获取值传到前端视图(HouseSearchVO)实体类中的houseName,floorage建立houseSearchVO对象. 通 ...

  5. Mybatis实现条件查询(三)

    1. 准备 请先完成Mybatis基本配置(一)的基本内容 2. 疑问 我们再Mybatis基本配置(一)中实现了按照商品ID进行查询商品信息,可是在实际应用中却很少出现根据ID来查询商品的情况.因为 ...

  6. mybatis if条件查询 及<号的问题

    摘录自:http://flt95.blog.163.com/blog/static/12736128920136185841551/ <if test="p=='1'"> ...

  7. mybatis中条件查询大于等于和小于等于写法

    原符号 < <= > >= & ' "替换符号 < <= > >= & &apos; " createDat ...

  8. SSM-MyBatis-13:Mybatis中多条件查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类 public class Book { private Integer bookID; private ...

  9. mybatis按datetime条件查询,参数为时间戳时

    mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...

  10. Mybatis中动态SQL多条件查询

    Mybatis中动态SQL多条件查询 mybatis中用于实现动态SQL的元素有: if:用if实现条件的选择,用于定义where的字句的条件. choose(when otherwise)相当于Ja ...

随机推荐

  1. 03_Service的绑定

    Start Service启动的Service,Application退出,Service也不会退出: Bind Service启动的Service,Application退出,Service就会退出 ...

  2. HOOK API函数跳转详解

    原文链接:https://blog.csdn.net/cosmoslife/article/details/7670951 结合课件逆向11分析

  3. Beta冲刺随笔——Day_Six

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...

  4. Spring Boot + MongoDB 使用示例

    本文分别使用 MongoRepository 和 MongoTemplate 实现 MongoDB 的简单的增删改查 本文使用 docker 安装 MongoDB: 使用示例 application. ...

  5. 第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识

    Python被视为一种面向对象的语言,在介绍Python类相关的内容前,本节对面向对象程序设计相关的概念进行简单介绍. 一.    类和对象(实例) 在面向对象的程序设计(OOP)过程中有两个重要概念 ...

  6. jarvisoj babyphp

    jarvisoj babyphp 涉及知识点: (1)GitHack处理.git源码泄露 (2)php代码注入 解析: 进入题目界面. 看到题目中的用了git那么第一反应肯定是可能存在.git源码泄露 ...

  7. 效率神器-MouseInc推荐和使用

    主要功能 鼠标手势 按住右键滑动即可开始使用. 配置细微,可自由修改手势宽度,颜色,识别灵敏度等. 支持黑名单,支持特定软件自定义手势,支持复合动作. 功能非常强大,比如下面的操作: 选中一个网址,画 ...

  8. 谈Vite在Electron环境下吃花卷拉馒头的现象

    缘起 在Electron的渲染进程中(也就是页面代码中), 我们常常使用process.env来携带一些环境变量, 比如HTTP服务地址的基质,本地静态资源的路径等 这样做主要有两个目的 一个是方便开 ...

  9. caffe源码 全连接层

    图示全连接层 如上图所示,该全链接层输入n * 4,输出为n * 2,n为batch 该层有两个参数W和B,W为系数,B为偏置项 该层的函数为F(x) = W*x + B,则W为4 * 2的矩阵,B ...

  10. 题解-Happy New Year

    题解-Happy New Year Happy New Year 给定 \(n\),\(m\) 和 \(k\).有一个序列 \(a\{m\}\) 初始值为 \(0\).有 \(n\) 种操作,每种可以 ...