MyBatis-Plus 条件构造器查询详解
基本用法
// 创建条件构造器
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 基本条件查询
queryWrapper.eq("name", "张三") // 等于
.ne("age", 20) // 不等于
.gt("age", 18) // 大于
.ge("age", 18) // 大于等于
.lt("age", 60) // 小于
.le("age", 60); // 小于等于
常用条件方法
1 模糊查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "张") // LIKE '%张%'
.notLike("name", "王") // NOT LIKE '%王%'
.likeLeft("name", "张") // LIKE '%张'
.likeRight("name", "张"); // LIKE '张%'
2 范围查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.between("age", 18, 30) // BETWEEN 18 AND 30
.notBetween("age", 18, 30) // NOT BETWEEN 18 AND 30
.in("age", 18, 20, 25) // IN (18,20,25)
.notIn("age", 18, 20, 25); // NOT IN (18,20,25)
3 空值判断
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.isNull("email") // IS NULL
.isNotNull("email"); // IS NOT NULL
4 多条件组合
// AND 和 OR 条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三")
.and(w -> w.eq("age", 20).or().eq("age", 25))
.or()
.eq("status", 1);
Lambda 表达式方式(推荐)
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
// 使用 Lambda 表达式,避免硬编码字段名
lambdaQuery.eq(User::getName, "张三")
.ge(User::getAge, 18)
.like(User::getEmail, "@qq.com");
排序和分页
1 排序
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("age") // ORDER BY age ASC
.orderByDesc("create_time"); // ORDER BY create_time DESC
// Lambda 方式
lambdaQuery.orderByAsc(User::getAge)
.orderByDesc(User::getCreateTime);
2 分页
// 创建分页对象 Page<User> page = new Page<>(1, 10); // 第1页,每页10条 // 分页查询 Page<User> userPage = userMapper.selectPage(page, queryWrapper); List<User> userList = userPage.getRecords(); // 获取数据 long total = userPage.getTotal(); // 总记录数
复杂查询示例
1 多表关联查询
// 自定义查询(使用 Wrapper 作为参数)
Page<User> page = new Page<>(1, 10);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("u.*, d.dept_name") // 指定查询字段
.eq("u.status", 1)
.like("u.name", "张");
// 在 mapper 中使用注解或 XML 实现多表查询
List<UserVO> list = userMapper.selectUserWithDept(page, wrapper);
2 动态条件查询
public List<User> selectUserByCondition(String name, Integer age, String email) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
// 动态添加条件
wrapper.eq(StringUtils.isNotBlank(name), User::getName, name)
.ge(age != null, User::getAge, age)
.like(StringUtils.isNotBlank(email), User::getEmail, email);
return userMapper.selectList(wrapper);
}
Wrapper 类型选择
| Wrapper类型 | 用途 | 示例 |
|---|---|---|
| QueryWrapper | 普通查询 | new QueryWrapper<>() |
| LambdaQueryWrapper | Lambda查询 | new LambdaQueryWrapper<>() |
| UpdateWrapper | 更新操作 | new UpdateWrapper<>() |
| LambdaUpdateWrapper | Lambda更新 | new LambdaUpdateWrapper<>() |
更新操作
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("age", 30)
.set("email", "new@email.com")
.eq("name", "张三");
userMapper.update(null, updateWrapper);
// Lambda 更新
LambdaUpdateWrapper<User> lambdaUpdate = new LambdaUpdateWrapper<>();
lambdaUpdate.set(User::getAge, 30)
.eq(User::getName, "张三");
userMapper.update(null, lambdaUpdate);
注意事项
- 防止SQL注入:使用条件构造器时,MyBatis-Plus 会自动处理参数,防止SQL注入
- 字段映射:Lambda表达式方式可以避免字段名拼写错误
- 性能优化:大量数据时建议分页查询,减少一次性查询的数据量
- 条件复用:可以将常用条件封装成方法复用
这样使用 MyBatis-Plus 的条件构造器,可以大大简化 SQL 编写,提高开发效率。
