MyBatisPlus条件构造器查询

wen java案例 3

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);

注意事项

  1. 防止SQL注入:使用条件构造器时,MyBatis-Plus 会自动处理参数,防止SQL注入
  2. 字段映射:Lambda表达式方式可以避免字段名拼写错误
  3. 性能优化:大量数据时建议分页查询,减少一次性查询的数据量
  4. 条件复用:可以将常用条件封装成方法复用

这样使用 MyBatis-Plus 的条件构造器,可以大大简化 SQL 编写,提高开发效率。

MyBatisPlus条件构造器查询

抱歉,评论功能暂时关闭!