MybatisPlus快速上手:
MybatisPlus快速上手1——MybatisPlus插件的介绍和整合
Mybatis快速上手2——通用的CRUD操作
PlusMybatisPlus快速上手3——相关配置
条件构造器 Wrapper
在MybatisPlus中,Wrapper接口的实现类关系如下(IDEA按CTRL+H):
可以看到,AbstractWrappe
r和AbstractChainWrapper
是重点实现,接下来我们重点学习AbstractWrapper以及其子类。
说明:
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类 用于生成 sql的 where 条件, entity 属性也用于生成 sql 的 where 条件 注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为
allEq
说明
全部eq(或个别isNull)
个别参数说明: params :
key
为数据库字段名,
value
为字段值
null2IsNull
: 为 true 则在 map 的 value 为 null 时调用 isNull 方法,为 false 时则忽略 value 为 null 的
//allEq方法
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
例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 = '老王
个别参数说明:
filter
: 过滤函数,是否允许字段传入比对条件中 params 与
null2IsNull
: 同上
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)
例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 = '老王'
测试用例
@Test
public void testAllEq(){
Map<String,Object> params = new HashMap<>();
params.put("name","张三");
params.put("age",45);
params.put("password",null);
QueryWrapper<User> wrapper = new QueryWrapper<>();
//对应的sql语句 SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE password = ? AND name = ? AND age = ?
//wrapper.allEq(params);
// 对应的sql语句 SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? AND age = ?
//wrapper.allEq(params,false); //false表示不用将null值当做查询的条件
wrapper.allEq((k, v) -> (k.equals("age")|| k.equals("id")||k.equals("name")),params);
//传入的 params 参数是否能被作为sql查询条件,取决于lambda表达式所对比之后的结果,即password!=age||id 则不会作为查询结果
// 对应的sql语句 SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? AND age = ?
List<User> userList = mapper.selectList(wrapper);
for (User user : userList) {
System.out.println(user);
}
}
基本比较操作
eq:等于 =
ne:不等于 <>
gt:大于 >
ge:大于等于 >=
lt:小于 <
le:小于等于 <=
between:BETWEEN 值1 AND 值2
notBetween:NOT BETWEEN 值1 AND 值2
in:字段 IN (value.get(0), value.get(1), …)
notIn:字段 NOT IN (v0, v1, …)
测试
@Test
public void testEq() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
//SELECT id,user_name,password,name,age,email FROM tb_user WHERE password = ? AND age >= ? AND name IN (?,?,?)
wrapper.eq("password", "123456")
.ge("age", 20)
.in("name", "李四", "王五", "赵六");
List<User> users = this.mapper.selectList(wrapper);
for (User user : users) { System.out.println(user);
}
}
模糊查询
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 testLike(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name LIKE ?
wrapper.likeLeft("name","五");//Parameters: %五(String)
List<User> userList = mapper.selectList(wrapper);
for (User user : userList) {
System.out.println(user);
}
}
排序
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 testOrderBy(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//SELECT id,user_name,name,age,email AS mail FROM tb_user ORDER BY age DESC
wrapper.orderByDesc("age");//按照年龄倒叙排序
List<User> userList = mapper.selectList(wrapper);
for (User user : userList) {
System.out.println(user);
}
}
逻辑查询
or
- 拼接 OR
- 主动调用 or 表示紧接着下一个方法不是用 and 连接!(不调用 or 则默认为使用 and 连接)
and
- AND 嵌套
- 例: and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status <> '活着')
测试用例
@Test
public void testOr(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//SELECT id,user_name,name,age,email AS mail FROM tb_user ORDER BY age DESC
//wrapper.eq("name","王五").eq("age",21);//条件之间为and关系
wrapper.eq("name","王五").or().eq("age",21);//条件之间为or关系
//Preparing: SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? OR age = ?
List<User> userList = mapper.selectList(wrapper);
for (User user : userList) {
System.out.println(user);
}
}
指定需要查询的字段 select
在 MybatisPlus 查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。
@Test
public void testSelect(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//Preparing: SELECT id,name,age FROM tb_user WHERE name = ? OR age = ?
wrapper.eq("name","王五")
.or()
.eq("age",21)
.select("id","name","age");//指定需要查询的字段
List<User> userList = mapper.selectList(wrapper);
for (User user : userList) {
System.out.println(user);
}
}