QueryWrapper是Mybatis Plus中一个优雅的条件拼装查询器,作用是让我们以Java对象的方式构建where之后的查询条件,不用直接写SQL。

Mybatis Plus QueryWrapper使用详解
QueryWrapper的使用上也是非常简单,整体思路和写SQL是非常相似的,我们来看一下下面的示例。
1、多条件匹配查询,并且多个条件之间是AND的关系
相当于sql中的 where 列名1= xxx and 列名2= xxx
源码中的方法定义:
default Children allEq(Map params) { return allEq(params, true); }
代码:
@Test public void testAllEq() { System.out.println(("----- allEq method test ------")); QueryWrapper wrapper = new QueryWrapper(); Map map = new HashMap<>(); map.put("Name", "Jack"); map.put("Age", "20"); wrapper.allEq(map); List userList = userMapper.selectList(wrapper); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Age = ? AND Name = ?) ==> Parameters: 20(String), Jack(String)<== Columns: ID, NAME, AGE, EMAIL<== Row: 2, Jack, 20, test2@baomidou.com<== Total: 1User(id=2, name=Jack, age=20, email=test2@baomidou.com)
2、单个条件匹配查询,也就是指定一个字段和这个字段对应要匹配的值
相当于SQL的 where 列=xxx
源码中的方法定义:
default Children eq(R column, Object val) { return eq(true, column, val); }
代码:
@Test public void testEq() { System.out.println(("----- eq method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("Name","Jack"); List userList = userMapper.selectList(wrapper); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Name = ?) ==> Parameters: Jack(String)<== Columns: ID, NAME, AGE, EMAIL<== Row: 2, Jack, 20, test2@baomidou.com<== Total: 1User(id=2, name=Jack, age=20, email=test2@baomidou.com)
3、不等于查询,也就是排除掉某些数据
相当于SQL中的 where 列 != xxx
也可以写成
where 列 <> xxx
源码中的方法定义:
default Children ne(R column, Object val) { return ne(true, column, val); }
代码:
@Test public void testNe() { System.out.println(("----- eq method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.ne("Name","Jack"); List userList = userMapper.selectList(wrapper); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Name <> ?) ==> Parameters: Jack(String)<== Columns: ID, NAME, AGE, EMAIL<== Row: 1, Jone, 18, test1@baomidou.com<== Row: 3, Tom, 28, test3@baomidou.com<== Row: 4, Sandy, 21, test4@baomidou.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 4User(id=1, name=Jone, age=18, email=test1@baomidou.com)User(id=3, name=Tom, age=28, email=test3@baomidou.com)User(id=4, name=Sandy, age=21, email=test4@baomidou.com)User(id=5, name=Billie, age=24, email=test5@baomidou.com)
4、大于操作
相当于SQL的 where 列 > xxx
源码中的方法定义:
default Children gt(R column, Object val) { return gt(true, column, val); }
代码:查询年龄大于22岁的
@Test public void testGt() { System.out.println(("----- gt method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.gt("Age","22"); List userList = userMapper.selectList(wrapper); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Age > ?) ==> Parameters: 22(String)<== Columns: ID, NAME, AGE, EMAIL<== Row: 3, Tom, 28, test3@baomidou.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 2User(id=3, name=Tom, age=28, email=test3@baomidou.com)User(id=5, name=Billie, age=24, email=test5@baomidou.com)
mybatis-plus还有相似的方法如 ge是大于等于,lt是小于,le是小于等于
5、配置一个有起始和结束区间的查询条件
SQL中的 between xxx and xxx
源码中的方法定义:
default Children between(R column, Object val1, Object val2) { return between(true, column, val1, val2); }
源码中的方法定义:
@Test public void testBetween() { System.out.println(("----- between method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.between("Age","21","25"); List userList = userMapper.selectList(wrapper); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Age BETWEEN ? AND ?) ==> Parameters: 21(String), 25(String)<== Columns: ID, NAME, AGE, EMAIL<== Row: 4, Sandy, 21, test4@baomidou.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 2User(id=4, name=Sandy, age=21, email=test4@baomidou.com)User(id=5, name=Billie, age=24, email=test5@baomidou.com)
另外,还有与之相似的 notBetween方法,相信看名字你也知道它的作用。
6、模糊查找,like
源码中的方法定义:
default Children like(R column, Object val) { return like(true, column, val); }
代码:
@Test public void testLike() { System.out.println(("----- like method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.like("Name", "Ja"); List userList = userMapper.selectList(wrapper); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Name LIKE ?) ==> Parameters: %Ja%(String)<== Columns: ID, NAME, AGE, EMAIL<== Row: 2, Jack, 20, test2@baomidou.com<== Total: 1User(id=2, name=Jack, age=20, email=test2@baomidou.com)
还有相似功能的方法:notLike、likeLeft、likeRight
7、查找指定的某列值为空
SQL中的 is null
源码中的方法定义:
default Children isNull(R column) { return isNull(true, column); }
代码:
@Test public void testIsNull() { System.out.println(("----- isNull method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.isNull("Name"); List userList = userMapper.selectList(wrapper); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Name IS NULL) ==> Parameters: <== Total: 0
还有类似的方法:isNotNull
8、匹配多个值
SQL中的 in(x,xx, xxx)
源码中的方法定义:
default Children in(R column, Object... values) { return in(true, column, values); }
代码:
@Test public void testIn() { System.out.println(("----- in method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.in("Age",20,21,22,23); List userList = userMapper.selectList(wrapper); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Age IN (?,?,?,?)) ==> Parameters: 20(Integer), 21(Integer), 22(Integer), 23(Integer)<== Columns: ID, NAME, AGE, EMAIL<== Row: 2, Jack, 20, test2@baomidou.com<== Row: 4, Sandy, 21, test4@baomidou.com<== Total: 2User(id=2, name=Jack, age=20, email=test2@baomidou.com)User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
类似的方法:notIn、inSql、notInSql
我们使用in的时候,有时候会使用子查询,也就是in的括号里是一个sql语句,inSql、notInSql两个方法就是支持sql语句的in语法。
8、数据分组
SQL:groupBy
源码中的方法定义:
default Children groupBy(R column) { return groupBy(true, column); }
代码:按照年龄求所有人的年龄分组列表,也就是看看当前表里所有人都在哪个年龄
@Test public void testGroupBy() { System.out.println(("----- groupBy method test ------")); LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.groupBy(User::getAge).select(User::getAge); List userList = userMapper.selectList(lqw); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT age FROM user GROUP BY age ==> Parameters: <== Columns: AGE<== Row: 18<== Row: 20<== Row: 21<== Row: 24<== Row: 28<== Total: 5User(id=null, name=null, age=18, email=null)User(id=null, name=null, age=20, email=null)User(id=null, name=null, age=21, email=null)User(id=null, name=null, age=24, email=null)User(id=null, name=null, age=28, email=null)
9、按照指定属性列的顺序排序,并输出数据
SQL:ORDER BY
源码中的方法定义:
default Children orderByAsc(R column) { return orderByAsc(true, column); }
代码:
@Test public void testOrderBy() { System.out.println(("----- orderBy method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.orderByAsc("Age"); List userList = userMapper.selectList(wrapper); userList.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user ORDER BY Age ASC ==> Parameters: <== Columns: ID, NAME, AGE, EMAIL<== Row: 1, Jone, 18, test1@baomidou.com<== Row: 2, Jack, 20, test2@baomidou.com<== Row: 4, Sandy, 21, test4@baomidou.com<== Row: 5, Billie, 24, test5@baomidou.com<== Row: 3, Tom, 28, test3@baomidou.com<== Total: 5User(id=1, name=Jone, age=18, email=test1@baomidou.com)User(id=2, name=Jack, age=20, email=test2@baomidou.com)User(id=4, name=Sandy, age=21, email=test4@baomidou.com)User(id=5, name=Billie, age=24, email=test5@baomidou.com)User(id=3, name=Tom, age=28, email=test3@baomidou.com)
QueryWrapper提供的条件配置方法还有很多,基本完全覆盖了我们平时开发中的所需要写的SQL场景,大家可以动手写一写,练一练,感受一下QueryWrapper使用便携性。