MyBatisPlus--条件构造器和常用接口

1、Wrapper介绍

在这里插入图片描述
Wrapper : 条件构造抽象类,最顶端父类

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

官网地址:条件构造器 | MyBatis-Plus (baomidou.com)

本节测试,全部采用Mapper CURD;创建测试类,路径为src/test/java/com/mybatisplus_demo/MyBatisPlusWrapperTest.java

@SpringBootTest
@RunWith(SpringRunner.class)
public class MyBatisPlusWrapperTest {
    @Autowired(required = false)
    private UserMapper userMapper;

    // 待添加测试方法
}

2、QueryWrapper

a>组装查询条件
@Test
public void testSelectList() {
    //查询用户名包含e,年龄在18到24之间,并且邮箱不为null的用户信息
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name", "e").between("age", 18, 24).isNotNull("email");
    List<User> users = userMapper.selectList(queryWrapper);
    System.out.println(users);
}

在这里插入图片描述

b>组装排序条件
public void testSelectList() {
    // 按年龄降序查询用户,如果年龄相同则按id升序排列
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.orderByDesc("age").orderByAsc("id");
    List<User> users = userMapper.selectList(queryWrapper);
    System.out.println(users);
}

在这里插入图片描述

c>组装删除条件
@Test
public void testDelete(){
    // 删除id在3、5、9的用户,并且email为null的用户
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.in("id", 3, 5, 9).isNull("email");
    int i = userMapper.delete(queryWrapper);
    System.out.println(i);
}

在这里插入图片描述

此处为逻辑删除,真正执行的是修改

d>组装修改条件
@Test
public void testUpdate(){
    // 将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.ge("age", 20).like("name", "a").or().isNull("email");
    // 这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
    User user = new User();
    user.setAge(25);    // 年龄修改为25
    int i = userMapper.update(user, queryWrapper);
    System.out.println(i);
}

在这里插入图片描述

MySQL中,AND的执行优先级高于OR。也就是说,在没有小括号()的限制下,总是优先执行AND语句,再执行OR语句。

select * from table where 条件1 AND 条件2 OR 条件3

等价于

select * from table where ( 条件1 AND 条件2 ) OR 条件3

与上面等价SQL写法:

@Test
public void testUpdate(){
    // 将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // lambda表达式内的逻辑优先运算
    queryWrapper.and(i -> i.ge("age", 20).like("name", "a")).or().isNull("email");
    // 这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
    User user = new User();
    user.setAge(25);    // 年龄修改为25
    int i = userMapper.update(user, queryWrapper);
    System.out.println(i);
}

在这里插入图片描述

e>条件优先级
@Test
public void testUpdate(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //将(年龄大于20并且用户名中包含有a)或(邮箱为null或年龄小于20)的用户信息修改
    // lambda表达式内的逻辑优先运算
    queryWrapper.and(i -> i.ge("age", 20).like("name", "a"))
        .or(i -> i.isNull("email").or().lt("age", 20));
    // 这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
    User user = new User();
    user.setAge(25);    // 年龄修改为25
    int i = userMapper.update(user, queryWrapper);
    System.out.println(i);
}

在这里插入图片描述

f>组装select子句
①方法一
@Test
public void testSelect(){
    // 查询用户信息的username和age字段
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "age");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

在这里插入图片描述

②方法二
@Test
public void testSelect(){
    // 查询用户信息的username和age字段
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "age");
    // selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值变为null
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    maps.forEach(System.out::println);
}

在这里插入图片描述

g>in子查询
@Test
public void testIn(){
    //查询id小于等于3的用户信息(in子句)
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id", "select id from t_user where id <= 3");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

在这里插入图片描述

对应的还有notInSql()方法,表示not in

一般in子句常用于多表查询,此处只是做单表演示

h>exists子查询
@Test
public void testExists(){
    //查询用户信息(exists子句)
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.exists("select id from t_user");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

在这里插入图片描述

对应的还有notExists()方法,表示not exists

一般exists子查询常用于多表查询,此处只是做单表演示

3、UpdateWrapper

a>组装修改条件
@Test
public void testUpdate(){
    // 采用UpdateWrapper,组装set子句以及修改条件
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.set("age", 25).and(i -> i.ge("age", 20).like("name", "a")).or().isNull("email");
    // 如果没有自动填充,可以设置为null
    int i = userMapper.update(null, updateWrapper);
    System.out.println(i);
}

在这里插入图片描述

虽然QueryWrapper也可以进行修改,但是对于修改语句推荐使用UpdateWrapper

4、condition

在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因此在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响SQL执行的结果

思路一
@Test
public void testCondition1(){
    //定义查询条件,有可能为null(用户未输入或未选择)
    String name = null;
    Integer ageBegin = 10;
    Integer ageEnd = 24;
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // isNotBlank判断某字符串是否不为空且长度不为0且不由空白符(whitespace)构成
    if(StringUtils.isNotBlank(name)){
    	queryWrapper.like("name", name);
    }
    if(ageBegin != null){
    	queryWrapper.ge("age", ageBegin);
    }
    if(ageEnd != null){
    	queryWrapper.le("age", ageEnd);
    }
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

在这里插入图片描述

思路二

上面的实现方案没有问题,但是代码比较复杂,可以使用带condition参数的重载方法构建查询条件,简化代码的编写

@Test
public void testCondition2(){
    //定义查询条件,有可能为null(用户未输入或未选择)
    String name = null;
    Integer ageBegin = 10;
    Integer ageEnd = 24;
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like(StringUtils.isNotBlank(name), "name", name)
        .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 testLambdaQueryWrapper(){
    //定义查询条件,有可能为null(用户未输入或未选择)
    String name = null;
    Integer ageBegin = 10;
    Integer ageEnd = 24;
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //避免使用字符串表示字段,防止运行时错误,使用LambdaXxxWrapper后,字段不能再写字符串,只能用函数式接口指定
    lambdaQueryWrapper.like(StringUtils.isNotBlank(name), User::getName, name)
        .ge(ageBegin != null, User::getAge, ageBegin)
        .le(ageEnd != null, User::getAge, ageEnd);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    users.forEach(System.out::println);
}

在这里插入图片描述

6、LambdaUpdateWrapper

@Test
public void testLambdaUpdateWrapper(){
    // 采用LambdaUpdateWrapper,组装set子句以及修改条件
    LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper.set(User::getAge, 25)
        .and(i -> i.ge(User::getAge, 20).like(User::getName, "a"))
        .or()
        .isNull(User::getEmail);
    // 如果没有自动填充,可以设置为null
    int i = userMapper.update(null, lambdaUpdateWrapper);
    System.out.println(i);
}

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MyBatis是一个半自动的持久层框架,而MyBatis Plus是一个MyBatis的增强型框架,它提供了一些额外的功能,如代码生成器、全局性的分页拦截器、支持CRUD等。它还有一些其他的特性,如动态表名支持、注解支持、逻辑删除等。 ### 回答2: MyBatisMyBatis Plus是两个 Java 持久层框架,其中 MyBatis Plus是在 MyBatis 的基础上进行了增强和扩展。 第一个区别是功能扩展。MyBatis Plus相比于MyBatis提供了更多的功能,包括代码自动生成、分页插件、性能分析插件、乐观锁插件等。这些插件和功能减少了开发人员的工作量,提高了代码质量和开发效率。 第二个区别是API的简化。MyBatis Plus简化了MyBatis的API。在MyBatis中,我们需要编写大量的XML映射文件来配置SQL语句和结果集的映射关系,而MyBatis Plus使用了代码生成器,可以根据数据库表生成对应的实体类、Mapper接口和XML映射文件。这样一来,开发人员只需要关注业务逻辑的实现,而无需手动编写大量的重复代码。 第三个区别是内置的CRUD操作。MyBatis Plus内置了很多常用的CRUD操作(增删改查),并且提供了更为灵活和强大的查询条件封装方式,如Wrapper和LambdaQuery等。这些封装可以减少手动编写SQL语句的工作量,提高查询的效率和灵活性。 第四个区别是社区支持和活跃度。MyBatis Plus拥有庞大的开源社区,提供了丰富的文档和示例代码,能够解决开发过程中遇到的各种问题。而MyBatis的社区相对较小,相关资源相对有限。 综上所述,MyBatis Plus在MyBatis的基础上进行了扩展和增强,提供了更多的功能和便利性。相比之下,MyBatis Plus更适合开发大型项目和提高开发效率。 ### 回答3: MyBatisMyBatis Plus是两种相似但有一些显著差异的Java持久化框架。 首先,MyBatis是一种流行的轻量级持久化框架,它使用简单的XML或注释方式来映射数据库查询结果到Java对象。它提供了强大的灵活性,可以自定义SQL语句和映射规则,适合于复杂的数据库操作。但是,使用MyBatis需要手动编写大量的SQL语句和映射文件,这会增加开发的工作量。 相比之下,MyBatis Plus是在MyBatis的基础上进行了增强和扩展。它是对MyBatis的封装,提供了更加便捷和高效的开发方式。MyBatis Plus使用了代码生成器来自动生成基本的CRUD操作,减少了重复劳动,提高了开发效率。同时,MyBatis Plus还提供了许多实用的功能和扩展,比如分页查询、逻辑删除、动态SQL等,简化了开发过程。 此外,MyBatis Plus还对MyBatis的一些功能进行了优化和改进。例如,MyBatis Plus提供了更加方便的条件构造器,可以通过链式调用来构建复杂的查询条件。另外,MyBatis Plus还支持了lambda表达式,可以在查询时使用更加直观和简洁的语法。 总而言之,MyBatisMyBatis Plus都是优秀的持久化框架,但MyBatis Plus作为对MyBatis的增强和扩展,提供了更加便捷和高效的开发方式,并且提供了一些实用的功能和扩展。选择使用哪个框架取决于个人的开发需求和喜好。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杼蛘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值