Wrapper条件构造器
# Wrapper条件构造器
Wrapper条件构造抽象类在MP中非常重要,它实现类关系如下:
可以看到,AbstractWrapper
和AbstractChainWrapper
是重点实现,接下来我们重点学习AbstractWrapper
以及其⼦类。官方学习文档 (opens new window)。
警告
不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输
- wrapper 很重
- 传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)
- 正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作
- 我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr
# AbstractWrapper
QueryWrapper(LambdaQueryWrapper)
和 UpdateWrapper(LambdaUpdateWrapper)
的父类,用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件。注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为
# allEq
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
全部eq(或个别isNull)。
- 参数说明:
- params : key为数据库字段名,value为字段值
- null2IsNull : 为true则在map的value为null时调用 isNull 方法,为false时则忽略value为null的
- 例子:
- 例1:
allEq({id:1,name:"老王",age:null})
--->id = 1 and name = '老王' and age is null
- 例2:
allEq({id:1,name:"老王",age:null}, false)
--->id = 1 and name = '老王'
- 例1:
allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
- 参数说明:
filter
: 过滤函数,是否允许字段传入比对条件中params
与null2IsNull
: 同上
- 例子:
- 例1:
allEq((k,v) -> k.contains("a"), {id:1,name:"老王",age:null})
--->name = '老王' and age is null
- 例2:
allEq((k,v) -> k.contains("a"), {id:1,name:"老王",age:null}, false)
--->name = '老王'
- 例1:
# 测试用例
@RunWith(SpringRunner.class)
@SpringBootTest
public class MPWrapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testQueryWrapper() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
Map<String, Object> params = new HashMap<>();
params.put("name", "jack");
params.put("age", "20");
params.put("email", null);
// wrapper.allEq(params); // SELECT id,name,age,email FROM user WHERE (name = ? AND age = ? AND email IS NULL)
// wrapper.allEq(params, false); // SELECT id,name,age,email FROM user WHERE (name = ? AND age = ?)
wrapper.allEq((k, v) -> (!k.equals("email")), params); // SELECT id,name,age,email FROM user WHERE (name = ? AND age = ?)
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
}
# 基本⽐较操作
Wrapper 支持基本比较操作,如下:
- eq:等于 =
- ne:不等于 <>
- gt:⼤于 >
- ge:⼤于等于 >=
- lt:⼩于 <
- le:⼩于等于 <=
- between:BETWEEN 值1 AND 值2
- notBetween:NOT BETWEEN 值1 AND 值2
- in:字段 IN (v0, v1, ...)
- notIn:字段 NOT IN (v0, v1, ...)
测试用例:
@Test
public void testQueryWrapperCompare() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("email", "test2@baomidou.com")
.ge("age", 20)
.in("name", "Jack", "Jone");
// SELECT id,name,age,email FROM user WHERE (email = ? AND age >= ? AND name IN (?,?))
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
# 模糊查询
Wrapper 支持模糊查询,如下:
- like:LIKE '%val%',例:
like("name", "王") ---> name like '%王%'
- notLike:NOT LIKE '%val%',例:
notLike("name", "王") ---> name not like '%王%'
- likeLeft:LIKE '%val',例:
likeLeft("name", "王") ---> name like '%王'
- likeRight:LIKE 'val%',例:
likeRight("name", "王") ---> name like '王%'
测试用例:
@Test
public void testQueryWrapperLike() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "J");
// SELECT id,name,age,email FROM user WHERE (name LIKE %J%)
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
# 排序
- orderBy:ORDER BY 字段, ... ,例:
orderBy(true, true, "id", "name") ---> order by id ASC,name ASC
- orderByAsc:ORDER BY 字段, ... ASC,例:
orderByAsc("id", "name") ---> order by id ASC,name ASC
- orderByDesc:ORDER BY 字段, ... DESC,例:
orderByDesc("id", "name") ---> order by id DESC,name DESC
测试用例:
@Test
public void testQueryWrapperSort() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("age");
// SELECT id,name,age,email FROM user ORDER BY age DESC
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
# 逻辑查询
- or:拼接 OR,主动调⽤ or 表示紧接着下⼀个⽅法不是⽤ and 连接! (不调⽤ or 则默认为使⽤ and 连接)
- and:AND 嵌套,例:
and(i -> i.eq("name", "李⽩").ne("status", "活着")) ---> and (name = '李 ⽩' and status <> '活着')
测试用例:
@Test
public void testQueryWrapperJoin() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "Jack").or().eq("age", 20);
// SELECT id,name,age,email FROM user WHERE (name = ? OR age = ?)
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
# select
在MP查询中,默认查询所有的字段,如果有需要也可以通过select
⽅法进⾏指定字段。
测试用例:
@Test
public void testQueryWrapperSelect() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "name");
// SELECT id,name FROM user
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
以上是Wrapper条件构造器的简单使用,如果你的jdk是1.8+版本,可以使用lambda语法,简化columns的写法。用法大同小异,这里不赘述,更多见官网。
上次更新: 5/30/2023, 11:23:39 PM