QueryWrapper和UpdateWrapper的基本使用

在 MyBatis-Plus 中,条件构造器(QueryWrapperUpdateWrapper)是一个用于构建 SQL 查询和更新条件的工具。它提供了一种简洁的方式来构造复杂的查询条件,而不需要手写 SQL 语句,二者与 Wrapper 的关系如下图:
在这里插入图片描述
Wrapper : 条件构造抽象类,最顶端父类

  • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件,内部已经实现大量的条件构造语句,如 eq/lt/gt/like/orderby/groupby/in等条件构造。
    • QueryWrapper : 查询条件封装
    • UpdateWrapper : Update 条件封装
    • AbstractLambdaWrapper : 使用Lambda 语法
      • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
      • LambdaUpdateWrapper : Lambda 更新封装Wrapper

可以使用的条件构造主要有以下这些:
在这里插入图片描述
示例:

1. 查询:

/**
  * 查询name包含Jo,age在20到27之间,email不为空的数据
  */
@Test
public void testQueryWrapper(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name","Jo")
        .between("age",20,27)
        .isNotNull("email");
    // SELECT id,name,age,email FROM user WHERE (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
    List<User> userList = mapper.selectList(queryWrapper);
    userList.forEach(System.out::println);
}

/**
  * 将查询结果按照年龄降序id升序排列
  */
@Test
public void testOrder(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.orderByDesc("age").orderByAsc("id");
    // SELECT id,name,age,email FROM user ORDER BY age DESC,id ASC
    List<User> userList = mapper.selectList(queryWrapper);
    userList.forEach(System.out::println);
}

/**
  * 查询指定字段
  */
@Test
public void testSelect() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "age");
    // SELECT name,age FROM user
    List<Map<String, Object>> userMap = mapper.selectMaps(queryWrapper);
    userMap.forEach(System.out::println);
}

/**
  * 子查询
  */
@Test
public void testSelect(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id","select id from user where id<4");
    // SELECT id,name,age,email FROM user WHERE (id IN (select id from user where id<4))
    List<User> userList = mapper.selectList(queryWrapper);
    userList.forEach(System.out::println);
}

/**
  * 动态查询
  */
@Test
public void testContidition(){
    String name="";
    Integer age=17;

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 动态组装条件
    queryWrapper.like(!StringUtils.isEmpty(name),"name",name);
    queryWrapper.ge(!ObjectUtils.isEmpty(age),"age",age);
    // SELECT id,name,age,email FROM user WHERE (age >= ?)
    List<User> userList = mapper.selectList(queryWrapper);
    userList.forEach(System.out::println);
}

/**
  * 动态查询
  */
@Test
public void testCondition(){
    String name="";
    Integer age=17;

    // LambdaQueryWrapper可以自动获取属性对应字段名
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    // 动态组装条件
    queryWrapper.like(!StringUtils.isEmpty(name),User::getName,name);
    queryWrapper.ge(!ObjectUtils.isEmpty(age),User::getAge,age);
    // SELECT id,name,age,email FROM user WHERE (age >= ?)
    List<User> userList = mapper.selectList(queryWrapper);
    userList.forEach(System.out::println);
}

2. 删除

/**
  * 删除email为空的数据
  */
@Test
public void testDelete(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.isNull("email");
    // DELETE FROM user WHERE (email IS NULL)
    mapper.delete(queryWrapper);
}

3. 修改

/**
  * 将age>20,name包含a或者email为空的用户名修改为zandra,邮箱修改为123@qq.com
  */
@Test
public void testUpdate(){
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.gt("age",20)
        .like("name","a")
        .or()
        .isNull("email");

    User user = new User();
    user.setName("zandra");
    user.setEmail("123@qq.com");
    // UPDATE user SET name=?, email=? WHERE (age > ? AND name LIKE ? OR email IS NULL)
    mapper.update(user,updateWrapper);
}

/**
  * 将name包含a并且(age>20或者email为空)的用户名修改为zandra,邮箱修改为123@qq.com
  */
@Test
public void testUpdate(){
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.like("name","a")
        // 通过lambda表达式将条件优先级设置为一样(条件包含在同一对小括号中)
        .and(wrapper->{
            wrapper.gt("age",20)
                .or()
                .isNull("email");
        });
    // 将修改内容封装在实体对象中
    User user = new User();
    user.setName("zandra");
    user.setEmail("123@qq.com");
    // UPDATE user SET name=?, email=? WHERE (name LIKE ? AND (age > ? OR email IS NULL))
    mapper.update(user,updateWrapper);
}

/**
  * 将name包含a并且(age>20或者email为空)的用户名修改为zandra,邮箱修改为123@qq.com
  */
@Test
public void testUpdate() {
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.like("name", "a")
        .and(wrapper -> {
            wrapper.gt("age", 20)
                .or()
                .isNull("email");
        });
    // 设置修改内容
    updateWrapper.set("name","zandra").set("email","123@qq.com");
    // UPDATE user SET name=?,email=? WHERE (name LIKE ? AND (age > ? OR email IS NULL))
    mapper.update(null, updateWrapper);
}


/**
  * LambdaUpdateWrapper可以自动获取属性对应字段名
  */
@Test
public void testUpdate() {
    LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper.like(User::getName, "a")
        .and(wrapper -> {
            wrapper.gt(User::getAge, 20)
                .or()
                .isNull(User::getEmail);
        });
    // 设置修改内容
    updateWrapper.set(User::getName,"zandra").set(User::getEmail,"123@qq.com");
    // UPDATE user SET name=?,email=? WHERE (name LIKE ? AND (age > ? OR email IS NULL))
    mapper.update(null, updateWrapper);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值