Mybatis-Plus——条件构造器和常用接口

1、Wrapper介绍

我们先查看以下Wrapper抽象类的继承体系 标出了我们常用的子类

在这里插入图片描述

  • Wrapper:条件构造类,是父类
    • AbstractWrapper : 用于查询条件的封装,生成sql的where条件
      • QueryWrapper : 查询条件封装
      • UpdateWrapper : Update条件的封装
      • AbstractLambdaWrapper : 使用Lambda语法
        • LambdaQueryWrapper:用于Lambda语法使用的查询Wrapper
        • LambdaUpdateWrapper: 更新封装的Wrapper(Lambda)

2、QueryWrapper使用

SpringBoot测试

@SpringBootTest
public class MybatisPlusWrapperTest {
    @Autowired
    private UserMapper userMapper;
}

①组装查询条件

 @Test
    public void test01(){
    //查询用户名包含a 年龄18-25之间 邮箱信息不为Null的用户信息
    QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    queryWrapper.like("user_name","a")
                    .between("age",18,25)
                            .isNotNull("email");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

②组装排序条件

@Test
public void test02(){
    //将age字段按照降序排序 id字段升序排序
    QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    queryWrapper.orderByDesc("age").orderByAsc("id");

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

③组装删除条件

@Test
public void test03(){
    //将email为null的字段进行删除
    QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    queryWrapper.isNull("email");

    //UPDATE t_user SET ready_delete=1 WHERE ready_delete=0 AND (email IS NULL)
    //因为我们有逻辑删除 所以执行删除操作时 实际上执行的是修改
    int result = userMapper.delete(queryWrapper);
    System.out.println("受影响的行数: " + result);
}

④条件的优先级

@Test
public void test04(){
    //将年龄大于18并且用户名中含有a 或 邮箱为Null的用户进行修改
    //UPDATE t_user SET age=?, email=?
    //WHERE ready_delete=0 AND (user_name LIKE ? AND age > ? OR email IS NULL)
    QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    queryWrapper.like("user_name","a")
            .gt("age",18).or().isNull("email");

    User user = new User();
    user.setAge(18);
    user.setEmail("test@qq.com");
    int update = userMapper.update(user, queryWrapper);
    System.out.println("受影响的行数:" + update);


}
@Test
public void test05(){
    //UPDATE t_user SET age=?, email=?
    // WHERE ready_delete=0 AND (user_name LIKE ? AND (age > ?) OR email IS NULL)
    QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    //lambda表达式内的逻辑 优先运算
    queryWrapper.like("user_name","a").and(i -> i.gt("age",18))
            .or().isNull("email");
    User user = new User();
    user.setAge(18);
    user.setEmail("test2@qq.com");
    int update2 = userMapper.update(user, queryWrapper);
    System.out.println("受影响的行数:" + update2);
}

⑤组装select子句

@Test
public void test06(){
    //查询用户信息username,age的字段
    //SELECT user_name,age FROM t_user WHERE ready_delete=0
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("user_name","age");
    //selectMaps() 返回map集合 通常配合select()使用
    //这样做的目的是避免没有被查询到的列值为null
    List<Map<String, Object>> lists = userMapper.selectMaps(queryWrapper);
    lists.forEach(System.out::println);
}

⑥子查询

@Test
public void test07(){
    //查询id小于等于5的用户  信息 (子查询实现)
    //SELECT uid AS id,user_name AS name,age,email,ready_delete FROM t_user
    // WHERE ready_delete=0 AND (uid IN (select uid from t_user where uid <=5))
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("uid","select uid from t_user where uid <=5");
    List<User> lists = userMapper.selectList(queryWrapper);
    lists.forEach(System.out::println);
}

3、UpdateWrapper使用

@Test
public void test08(){
    //将年龄大于15或邮箱为null 并且 用户名中含有a的用户信息修改
    // UPDATE t_user SET age=?,email=?
    // WHERE ready_delete=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.set("age",18).set("email","test@qq.com").like("user_name","a")
            .and(i -> i.gt("age",15).or().isNull("email"));

    int result = userMapper.update(null, updateWrapper);
    System.out.println("result:" +result);
}

4、condition

在开发中,组装条件是常见的,这些数据来源于用户的输入,是可选的,因此在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,反之,以免影响sql执行的效率问题。

@Test
    public void test09(){
        //模拟开发场景
        String username = "";
        Integer ageBegin = 20;
        Integer ageEnd = 30;

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotBlank(username)){
            //判断某个字符是否不为空字符串 不为null,不为空字符串
            queryWrapper.like("user_name",username);
        }
        if (ageBegin != null){
            queryWrapper.ge("age",ageBegin);
        }
        if (ageEnd != null){
            queryWrapper.le("age",ageEnd);
        }
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);
    }

简化开发

@Test
public void test10(){
    String username = "a";
    Integer ageBegin = 20;
    Integer ageEnd = 30;
    //使用condition条件进行组装
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like(StringUtils.isNotBlank(username),"user_name",username)
            .ge(ageBegin != null,"age",ageBegin)
            .le(ageEnd != null,"age",ageEnd);
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

5、LambdaQueryWrapper

@Test
public void test11(){
    //定义查询条件 可能为null 用户未输入
    String username = "a";
    Integer ageBegin = 10;
    Integer ageEnd = 24;
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();

    //避免使用字符串表示字段 防止运行时异常
    queryWrapper.like(StringUtils.isNotBlank(username),User::getName,username)
            .ge(ageBegin != null, User::getAge,ageBegin)
            .le(ageEnd != null,User::getAge,ageEnd);

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

6、LambdaUpdateWrapper

@Test
public void test12(){
    LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper.set(User::getAge,18)
            .set(User::getEmail,"test@163.com")
            .like(User::getName,"a")
            .and(i -> i.lt(User::getAge,22).or().isNull(User::getEmail));
    //lambda表达式优先运算
    User user = new User();
    int update = userMapper.update(user, updateWrapper);
    System.out.println(update);
}
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: Mybatis-Plus条件构造是一种方便的查询条件构造工具,可以通过链式调用的方式构造出复杂的查询条件。它支持多种查询条件,包括等于、不等于、大于、小于、模糊查询等,还可以通过Lambda表达式来构造查询条件,使得代码更加简洁易懂。同时,Mybatis-Plus条件构造还支持分页查询、排序等功能,可以满足大部分的查询需求。 ### 回答2: Mybatis-Plus 是一款增强 Mybatis 功能的开发包,它提供了很多便捷的操作方式以简化 Mybatis 的开发,其中条件构造就是其中之一。 Mybatis-Plus条件构造能够帮助我们构建查询条件,使我们省去了手写 SQL 语句的烦恼。在使用条件构造之前,我们需要先导入依赖包。 下面是条件构造的创建方式: Wrapper wrapper = new WrapperBuilder().and("name={0}", "Lucy").and("age>{0}", 18).build(); 其中,WrapperBuilder 是构造的构建工具类,and() 方法用于添加多个条件。构建条件之后,我们可以将条件传递给 Mybatis-Plus 的查询方法进行查询操作。 除了上述的构建方式,条件构造还支持 QueryWrapper、UpdateWrapper 和 LambdaQueryWrapper 等多种构建方式,不同的构建方式可以满足不同的查询需求。 使用 Mybatis-Plus条件构造,我们可以通过灵活的组合多个查询条件,快速地构建满足我们需求的 SQL 语句。同时,在实际使用过程中,我们还需要注意一些常见的使用技巧: 1. 使用占位符。在构建 SQL 语句时,我们需要使用占位符来避免 SQL 注入的风险。 2. 处理字段映射。在使用条件构造时,需要注意数据库表名和实体类属性名之间的映射关系。如果两者不一致,需要进行处理。 3. 处理关联表查询。当我们需要查询多张表时,需要通过关联查询的方式来完成,并且需要处理好关系的映射。 总之,Mybatis-Plus条件构造能够为我们节约很多时间和精力。当然,在使用时需要注意一些使用技巧,以便更好地发挥它的能力。 ### 回答3: MyBatis-Plus是一个基于MyBatis的增强工具,为MyBatis提供了更加便捷、高效的持久层操作方式。它的条件构造是其中一个功能强大的组件,用于链式构建SQL查询条件,无需手动拼接SQL语句,提高了代码可读性和可维护性。 条件构造提供了多种查询方式,包括等于、大于、小于、in、between、like等,可以满足大部分的查询需求。我们可以通过Lambda表达式来指定查询条件,这种方式比传统的字符串拼接更加安全、可读,可以少写一些防注入的代码。 MyBatis-Plus条件构造还支持分页查询,可以通过Page对象指定当前页码、每页显示数量等,方便地实现分页查询。同时,条件构造也支持排序、自定义SQL片段等功能,使得查询功能更加多样化和灵活。 除了条件构造MyBatis-Plus还提供了其他很多方便的功能,例如注解式CRUD、自动代码生成等。相信在项目开发中使用MyBatis-Plus可以极大地提高开发效率和代码质量,使得持久层操作更加简洁、优雅。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Philosophy7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值