在MP中,Wrapper接⼝的实现类关系如下:
可以看到,AbstractWrapper和AbstractChainWrapper是重点实现,接下来我们重点学习AbstractWrapper以及其子类。
说明:
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为
1、allEq
1.1、说明
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 = '⽼王'
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.indexOf("a") > 0, {id:1,name:"老王",age:null}) ---> name = '老王' and age is null
例2: allEq((k,v) -> k.indexOf("a") > 0, {id:1,name:"老王",age:null},false) ---> name = '老王'
1.2、测试用例
/*
测试条件构建器 allEq
*/
@Test
public void testAllEq(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 构建map
Map<String, Object> map = new HashMap<>();
map.put("name","jack");
map.put("age",null);
// WHERE name = ? AND age IS NULL
// queryWrapper.allEq(map);
// WHERE name = ?
// queryWrapper.allEq(map,false);
// SELECT id,name,age,email AS mail,user_name FROM tb_user
// queryWrapper.allEq(false,map,true);
// WHERE age IS NULL
queryWrapper.allEq((k,v) -> k.equals("name"),map);
List<User> users = userMapper.selectList(queryWrapper);
for (User user : users) {
System.out.println(user);
}
}
2、基本比较操作
eq 等于 = between BETWEEN 值1 AND 值2
ne 不等于 notBetween NOT BETWEEN 值1 AND 值2
gt 大于 > in 字段 IN (value.get(0), value.get(1), ...)
ge 大于等于 >= notIn 字段 NOT IN (v0, v1, ...)
lt 小于 <
le 小于等于 <=
测试用例
/*
基本比较操作
*/
@Test
public void testWrapper(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// WHERE email = ? AND age >= ? AND name IN (?,?)
queryWrapper.eq("email","zimu@lagou.com")
.ge("age",20)
.in("name","子慕","应颠");
List<User> users = userMapper.selectList(queryWrapper);
for (User user : users) {
System.out.println(user);
}
}
3、模糊查询
- like
- LIKE '%值%'
- 例: like("name", "王") ---> name like '%王%'
- notLike
- NOT LIKE '%值%'
- 例: notLike("name", "王") ---> name not like '%王%'
- likeLeft
- LIKE '%值'
- 例: likeLeft("name", "王") ---> name like '%王'
- likeRight
- LIKE '值%'
- 例: likeRight("name", "王") ---> name like '王%'
测试用例
/*
模糊查询
*/
@Test
public void testWrapperLike(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name","子");
List<User> users = userMapper.selectList(queryWrapper);
for (User user : users) {
System.out.println(user);
}
}
4、排序
- 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
5、逻辑查询
-
or
-
拼接 OR
-
主动调用or 表示紧接着下一个方法不是用and 连接!(不调用or 则默认为使用and 连接)
-
-
and
-
AND 嵌套
-
例: and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status <> '活着')
-
6、select
在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。
4、5、6测试用例
/*
排序查询、逻辑查询、select
*/
@Test
public void testWrapper2(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// queryWrapper.orderByDesc("age");
queryWrapper.eq("name","jack").or().eq("age",28).select("name");
List<User> users = userMapper.selectList(queryWrapper);
for (User user : users) {
System.out.println(user);
}
}