文章目录
1. 条件构造器
在Mybatis-Plus中,Wrapper接口的实现类关系如下:

可以看到,AbstractWrapper和AbstractChainWrapper是重点实现,接下来我们重点学习AbstractWrapper以及其子类。
说明:
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类 用于生成 sql的 where 条件, entity 属性也用于生成 sql 的 where 条件 注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为。
下面学习具体的条件构造器
1. allEq
该方法用来查找所有符合条件的数据。
1.1 说明

1.2 测试用例(我们主要是查看生成的SQL)
params为:
Map<String, Object> params = new HashMap<>();
params.put("name", "李四");
params.put("age", "20");
params.put("password", null);
1.2.1 wrapper.allEq(params):包含null
生成的SQL为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (password IS NULL AND name = ? AND age = ?)
...
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.allEq(params);
this.userMapper.selectList(wrapper);
...

1.2.2 wrapper.allEq(params, false):不包含null
生成的SQL为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? AND age = ?)
...
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.allEq(params, false);
this.userMapper.selectList(wrapper);
...

1.2.3 wrapper.allEq((k, v) -> (k.equals(“age”) || k.equals(“id”)), params):过滤器过滤出指定的条件
示例1:
生成的SQL为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (age = ?)
...
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 这里查询的是查询的key要么是age要么是id
wrapper.allEq((k, v) -> (k.equals("age") || k.equals("id")), params);
this.userMapper.selectList(wrapper);
...
示例2:
生成的SQL为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? AND age = ?)
...
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 这里查询的是查询的key要么是age要么是id要么是name
wrapper.allEq((k, v) -> (k.equals("age") || k.equals("id") || k.equals("name")), params);
this.userMapper.selectList(wrapper);
...
2. 基本比较操作
eq(equal):等于 =ne(not equal):不等于 <>gt(greater than):大于 >ge(Greater than or equal to):大于等于 >=It(less than):小于 <le(Less than or equal to):小于等于 <=between:BETWEEN 值1 AND 值2notBetween:NOT BETWEEN 值1 AND 值2in:字段 IN (value.get(0), value.get(1), …)notIn:字段 NOT IN (v0, v1, …)
示例代码:
@Test
public void testEq() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 查找 满足下面3个条件的人
// 1. password 等于 123456
// 2. age 大于等于 20
// 3. 名字是 "李四" or "王五" or "赵六"
wrapper.eq("password", "123456")
.ge("age", 20)
.in("name", "李四", "王五", "赵六");
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (password = ? AND age >= ? AND name IN (?,?,?))

3. 模糊查询

示例代码:
@Test
public void testLike() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// name like '%五'
wrapper.likeLeft("name", "五");
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name LIKE '%五')

4. 排序

示例代码;

@Test
public void testOrderByAgeDesc() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 按照age和name逆序排序
// SELECT id,user_name,password,name,age,email FROM tb_user ORDER BY age ASC,name ASC
wrapper.orderBy(true, true, "age", "name");
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql为:com.tian.springbootmybatisplus.SpringbootMybatisplusApplicationTests#testOrderByAgeDesc

5. 逻辑查询

示例代码:
@Test
public void testOr() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 查询name为王五 或者 age为21的用户
wrapper.eq("name", "王五").or().eq("age", 21);
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? OR age = ?)

6. select(指定查询的字段:默认所有)
在Mybatis-Plus查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。
示例代码:
查询 name 为 王五 或者 age 为 21 的用户的 id和name和age
@Test
public void testSelect() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 查询 name 为 王五 或者 age 为 21 的用户的 id和name和age
wrapper.eq("name", "王五")
.or()
.eq("age", 21)
.select("id", "name", "age"); //指定查询的字段
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql为:SELECT id,name,age FROM tb_user WHERE (name = ? OR age = ?)
