一、条件构造器 Wrapper
Mybatis Plus 为我们提供了如下的一些条件构造器,我们可以利用它们实现查询条件、删除条件、更新条件的构造。
条件构造器用于给如下的 Mapper 方法传参,通常情况下:
- updateWrapper 用于给 update 方法传条件参数
- queryWrapper 用于给 delete 和 select 方法传参
public interface BaseMapper<T> extends Mapper<T> {int delete(@Param("ew") Wrapper<T> wrapper);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
}
举例一:like 条件构造
String name = "字母"; //name 不为空
String email = ""; //email 为空串
QueryWrapper<User> query = new QueryWrapper<>();
query.like(StringUtils.isNotEmpty(name), "name", name)
// 因为 email 为空串,该条件未生效
.like(StringUtils.isNotEmpty(email), "email", email);
List<User> list = userMapper.selectList(query);
list.forEach(System.out::println);
- QueryWrapper 是查询条件构造器,like 是一种条件构造函数,还有很多的条件构造函数。请参考:条件构造器
- 几乎所有的条件构造函数,都提供了 condition 参数实现动态 SQL。也就是参数判断是否返回 true,如果返回 false,该条件不成立。如
email=“”
,所以.like(StringUtils.isNotEmpty(email), "email", email);
的条件不成立。 - 所以最终的执行 SQL,如下(只有 name LIKE 条件,没有 email LIKE 条件):
SELECT id,name,age,email,create_time
FROM user
WHERE name LIKE % 字母 %
举例二:allEq 条件构造器
- all 表示所有
- Eq 是 equal 的缩写表示相等关系
// 构造条件
QueryWrapper<User> query = new QueryWrapper<>();
Map<String, Object> params = new HashMap<>();
params.put("name", "字母哥");
params.put("age", 18);
params.put("email", null);
// query.allEq(params,false);
query.allEq((k, v) -> !k.equals("name"), params, false);
List<User> list = userMapper.selectList(query);
list.forEach(System.out::println);
- 第一个参数是过滤器(可选参数),lambda 表达式表示 (k, v) -> !k.equals(“name”),参数的 Key 不能是 name,所以
params.put("name", "字母哥");
这个查询条件被过滤掉 - 第二个参数表示传入所有的 params 查询参数
- 第三个参数(可选参数),表示如果值为 null 是否按 IS NULL 查询,false 则忽略 null 列的查询,所以
params.put("email", null);
这个查询条件被过滤掉
最终执行的 SQL 如下:
SELECT id,name,age,email,create_time
FROM user
WHERE age = ?
更多构造器使用方法总结
请参考:官方文档:条件构造器
二、lambda 条件构造器
举例一:
// LambdaQueryWrapper<User> lambdaQ = new QueryWrapper<User>().lambda();
// LambdaQueryWrapper<User> lambdaQ = new LambdaQueryWrapper<>();
LambdaQueryWrapper<User> lambdaQ = Wrappers.lambdaQuery();
lambdaQ.like(User::getName, "字母")
.lt(User::getAge, 18);
List<User> list = userMapper.selectList(lambdaQ);
lambda 条件构造器,最终执行 SQL 如下:
SELECT id,name,age,email,create_time
FROM user
WHERE name LIKE % 字母 %
AND age < 18
举例二:
List<User> list = new LambdaQueryChainWrapper<User>(userMapper)
.likeRight(User::getName, "字母")
.and(q -> q.lt(User::getAge, 40)
.or()
.isNotNull(User::getEmail)
)
.list();
list.forEach(System.out::println);
lambda 条件构造器,最终执行 SQL 如下:
SELECT id,name,age,email,create_time
FROM user
WHERE name LIKE '字母 %'
AND (age < 18 OR email IS NOT NULL)
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力!。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学 Spring Boot2.0》
- 《Spring Security-JWT-OAuth2 一本通》
- 《实战前后端分离 RBAC 权限管理系统》
- 《实战 SpringCloud 微服务从青铜到王者》
- 《VUE 深入浅出系列》