MyBatis Plus(简称MP)是MyBatis的增强工具,旨在简化开发、提高效率。它提供了许多便捷的功能,其中之一就是条件构造器(Wrapper)。条件构造器用于构建SQL查询条件,使得开发者可以通过编程方式动态地生成复杂的SQL语句,而无需手动编写SQL字符串。本文将详细讲解MyBatis Plus的条件构造器,包括其基本概念、常用方法以及实际应用场景。
1. 基本概念
MyBatis Plus的条件构造器主要由以下几个核心类组成:
- AbstractWrapper:所有条件构造器的抽象基类,提供了基本的条件构造方法。
- QueryWrapper:用于查询条件构造。
- UpdateWrapper:用于更新条件构造。
- LambdaQueryWrapper:使用Lambda表达式进行查询条件构造。
- LambdaUpdateWrapper:使用Lambda表达式进行更新条件构造。
这些类都继承自AbstractWrapper
,因此它们共享一些基本的条件构造方法。
2. 常用方法
2.1 基本条件构造方法
- eq:等于(=)
- ne:不等于(<>)
- gt:大于(>)
- ge:大于等于(>=)
- lt:小于(<)
- le:小于等于(<=)
- like:模糊匹配(LIKE)
- notLike:不模糊匹配(NOT LIKE)
- in:在集合中(IN)
- notIn:不在集合中(NOT IN)
- isNull:为空(IS NULL)
- isNotNull:不为空(IS NOT NULL)
- between:在范围内(BETWEEN)
- notBetween:不在范围内(NOT BETWEEN)
2.2 逻辑条件构造方法
- and:逻辑与(AND)
- or:逻辑或(OR)
- nested:嵌套条件
2.3 其他方法
- orderByAsc:按升序排序
- orderByDesc:按降序排序
- groupBy:分组
- having:分组后过滤
- select:指定查询字段
3. 示例代码
3.1 使用QueryWrapper进行查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25)
.like("name", "John")
.orderByDesc("create_time");
List<User> userList = userMapper.selectList(queryWrapper);
上述代码构建了一个查询条件,查询年龄等于25且名字包含"John"的用户,并按创建时间降序排序。
3.2 使用UpdateWrapper进行更新
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("age", 25)
.set("status", 1);
userMapper.update(null, updateWrapper);
上述代码构建了一个更新条件,将年龄等于25的用户的状态更新为1。
3.3 使用LambdaQueryWrapper进行查询
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getAge, 25)
.like(User::getName, "John")
.orderByDesc(User::getCreateTime);
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
上述代码使用Lambda表达式构建了一个查询条件,查询年龄等于25且名字包含"John"的用户,并按创建时间降序排序。
3.4 使用LambdaUpdateWrapper进行更新
LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(User::getAge, 25)
.set(User::getStatus, 1);
userMapper.update(null, lambdaUpdateWrapper);
上述代码使用Lambda表达式构建了一个更新条件,将年龄等于25的用户的状态更新为1。
4. 实际应用场景
4.1 动态条件查询
在实际开发中,查询条件往往是动态的,可能根据用户输入或业务逻辑变化。使用条件构造器可以轻松应对这种情况。
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
if (user.getAge() != null) {
queryWrapper.eq("age", user.getAge());
}
if (StringUtils.isNotBlank(user.getName())) {
queryWrapper.like("name", user.getName());
}
List<User> userList = userMapper.selectList(queryWrapper);
上述代码根据用户对象的属性动态构建查询条件。
4.2 复杂条件查询
有时候需要构建复杂的查询条件,例如多层嵌套的条件。条件构造器提供了nested
方法来实现这一点。
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.nested(w -> w.eq("age", 25).or().eq("age", 30))
.and(w -> w.like("name", "John").or().like("name", "Jane"));
List<User> userList = userMapper.selectList(queryWrapper);
上述代码构建了一个复杂的查询条件,查询年龄等于25或30且名字包含"John"或"Jane"的用户。
4.3 分页查询
结合MyBatis Plus的分页插件,可以轻松实现分页查询。
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25);
Page<User> page = new Page<>(1, 10);
Page<User> userPage = userMapper.selectPage(page, queryWrapper);
上述代码查询年龄等于25的用户,并进行分页,每页10条记录。
5. 总结
MyBatis Plus的条件构造器极大地简化了SQL条件构建的过程,使得开发者可以通过编程方式动态地生成复杂的SQL语句。无论是简单的等值查询,还是复杂的嵌套条件查询,条件构造器都能轻松应对。通过结合Lambda表达式,代码的可读性和维护性也得到了显著提升。在实际开发中,合理利用条件构造器可以大大提高开发效率,减少出错的可能性。
希望本文对您理解和使用MyBatis Plus的条件构造器有所帮助。