MybatisPlus 第 2 篇-条件构造器的应用及总结

一、条件构造器Wrapper

Mybatis Plus为我们提供了如下的一些条件构造器,我们可以利用它们实现查询条件、删除条件、更新条件的构造。

file

条件构造器用于给如下的Mapper方法传参,通常情况下:

  • updateWrapper用于给update方法传条件参数
  • queryWrapper用于给deleteselect方法传参
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);
}

特别说明:
@Param("ew") Wrapper<T> wrapper 中的 ew 表示 entity Wrapper 的简写,需要传入 Wrapper 对象作为参数。
@Param("et") T entity 中的 et 表示 entity T 的简写,需要传入T为泛型的 entity 实体对象作为参数。

举例一: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是一种条件构造函数,还有很多的条件构造函数。请参考:条件构造器

file

几乎所有的条件构造函数,都提供了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 %字母%

二、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 )

三、QueryWrapper与LambdaQueryWrapper比较

1 QueryWrapper使用方式

        QueryWrapper<User> wrapper = new QueryWrapper<User>()
                .eq(StringUtils.isNotBlank(user.getNickName()), "nick", user.getNickName())
                .eq(user.getId() != null,"id", user.getId());
        List<User> userList = userDao.selectList(wrapper);

2 LambdaQueryWrapper 使用方式

 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
                .eq(StringUtils.isNotBlank(user.getNickName()), User::getNickName, user.getNickName())
                .eq(user.getId() != null, User::getId, user.getId());
        List<User> userList = userDao.selectList(wrapper);

3 使用区别

QueryWrapper列名匹配使用的是 “数据库中的字段名(一般是下划线规则)
LambdaQueryWrapper列名匹配使用的是“Lambda的语法,偏向于对象

4 LambdaQueryWrapper的优势

不同写“列名”,而是使用纯java的方式,避免了拼写错误(LambdaQueryWrapper的写法如果有错,则在编译期就会报错,而QueryWrapper需要运行的时候调用该方法才会报错)

为者常成,行者常至