【mybatis-plus】条件查询
用mp也可以方便的实现稍复杂点的条件查询,当然了很复杂的就还是要xml编写sql了。
一、wapper介绍
先看下mp的条件构造抽象类的结构:

Wrapper: 条件构造抽象类,最顶端父类AbstractWrapper: 用于查询条件封装,生成 sql 的 where 条件QueryWrapper: Entity 对象封装操作类,不是用lambda语法UpdateWrapper: Update 条件封装,用于Entity对象更新操作AbstractLambdaWrapper: Lambda 语法使用 Wrapper统一处理解析lambda获取数据库字段LambdaQueryWrapper: 用于Lambda语法使用的查询WrapperLambdaUpdateWrapper: Lambda 更新封装Wrapper
不过最常用的还是QueryWrapper、UpdateWrapper等这些。
套路还是那样,先创建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】条件查询的更多相关文章
- Mybatis多条件查询
在Mybatis多条件查询中: 1.参数如果是多条件,则需要将将添加到Map集合中进行传入. 2.就是将其参数用有序数字进行代替. Mybatis单个String类型参数传递 mysql文如下,传入参 ...
- mybatis 按照条件查询
mybatis 按照条件查询 @Autowired private StudentMapper studentMapper; @Override public Map getStudentList(i ...
- MyBatis参数条件查询传入的值为0时的判断
MyBatis条件查询对字段判断是否为空一般为: <if test="testValue!=null and testValue != ''"> and test_va ...
- SSM整合 mybatis多条件查询与分页
多条件查询与分页: 通过页面的houseName.floorage获取值传到前端视图(HouseSearchVO)实体类中的houseName,floorage建立houseSearchVO对象. 通 ...
- Mybatis实现条件查询(三)
1. 准备 请先完成Mybatis基本配置(一)的基本内容 2. 疑问 我们再Mybatis基本配置(一)中实现了按照商品ID进行查询商品信息,可是在实际应用中却很少出现根据ID来查询商品的情况.因为 ...
- mybatis if条件查询 及<号的问题
摘录自:http://flt95.blog.163.com/blog/static/12736128920136185841551/ <if test="p=='1'"> ...
- mybatis中条件查询大于等于和小于等于写法
原符号 < <= > >= & ' "替换符号 < <= > >= & ' " createDat ...
- SSM-MyBatis-13:Mybatis中多条件查询
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类 public class Book { private Integer bookID; private ...
- mybatis按datetime条件查询,参数为时间戳时
mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...
- Mybatis中动态SQL多条件查询
Mybatis中动态SQL多条件查询 mybatis中用于实现动态SQL的元素有: if:用if实现条件的选择,用于定义where的字句的条件. choose(when otherwise)相当于Ja ...
随机推荐
- qsort的cmp函数理解
qsort使用 近期频繁使用qsort函数,但是对于cmp函数却一直不太熟悉,现用现查.故写一篇小笔记记录一下. 函数原型: void qsort(void *base,size_t NumEle,s ...
- 死磕以太坊源码分析之Fetcher同步
死磕以太坊源码分析之Fetcher同步 Fetcher 功能概述 区块数据同步分为被动同步和主动同步: 被动同步是指本地节点收到其他节点的一些广播的消息,然后请求区块信息. 主动同步是指节点主动向其他 ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 小bug小坑总结
1. 小程序canvas那些原生组件的层级默认是最高的,而且不能更改,平常的div弹框什么的上面就会显示出原生组件的内容, 解决办法:cover-view,cover-image,button 2. ...
- 在 Spring Boot 中使用 Flyway
一.Flyway 介绍 Flyway 是一个开源的数据库迁移工具,MySQL, SQL Server, Oracle 等二十多种数据库 在 Flyway 中数据库的所有改变均称为迁移(migratio ...
- Spring Cloud 学习 (二) Ribbon
负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式:一种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix:另一种是将负载均衡逻辑以代码的形式封装到服务消费 ...
- 第15.7节 PyQt入门学习:PyQt5应用构建详细过程介绍
一. 引言 在上节<第15.6节 PyQt5安装与配置>结束了PyQt5的安装和配置过程,本节将编写一个简单的PyQt5应用,介绍基本的PyQt5应用的文件组成及相关工具的使用. 本节的应 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的调色板palette属性和字体font属性设置
一.调色板 在Qt Designer的部件属性中,有个部件调色板(palette)的属性,进入后,如下图所示: 1.调色板palette Qt中提供的调色板palette用于管理控件的外观显示,对应P ...
- AWD不死马与克制方法
一个简单的不死马如: <?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '.3.php'; ...
- Scrum 冲刺 第五篇
Scrum 冲刺 第五篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 初步完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成后台首页模块数据库的接口 钟俊豪 ...