MyBatis-Plus速成指南:条件构造器和常用接口


Wrapper 介绍

  1. Wrapper:条件构造抽象类,最顶端父类
    1. AbstractWrapper:用于查询条件封装,生成 SQL 的 where 条件
    2. QueryWrapper:查询条件封装
    3. UpdateWrapper:Update 条件封装
    4. AbstractLambdaWrapper:使用 Lambda 语法
      1. LambdaQueryWrapper:使用 Lambda 语法
      2. LambdaUpdateWrapper:Lambda 更新封装 Wrapper

QueryWrapper:

  1. 组装条件查询:
    //组装查询条件
    @Test
    public void test(){
        //查询用户包含 a,年龄在20到30之间,并且邮箱不为 null 的用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name","a")
                .between("age",20,30)
                .isNotNull("email");
        userMapper.selectList(queryWrapper).forEach(System.out::println);
    }
  2. 组装排序条件:
    //组装排序条件
    @Test
    public void test02(){
        //按年龄降序查询用户,如果年龄相同则按 id 升序排序
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("age")
                .orderByAsc("id");
        userMapper.selectList(queryWrapper).forEach(System.out::println);
    }
  3. 组装条件删除:
    //组装删除条件
    @Test
    public void void03(){
        //删除 email 为空的数据
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNull("email");
        int result = userMapper.delete(queryWrapper);
        System.out.println(result);
    }
  4. 条件的优先级:
    //条件的优先级
    @Test
    public void test04(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //将 (年龄大于 20并且用户名中包含 a) 或邮箱为 null的用户信息修改
        queryWrapper.like("name","a")
                .gt("age",20)
                .or()
                .isNull("email");
        User user = new User();
        user.setAge(18);
        user.setEmail("1@163.com");
        int result = userMapper.update(user,queryWrapper);
        System.out.println(result);
    }
  5. 组装 select 语句:
    //组装 select 子句
    @Test
    public void test05(){
        //查询用户信息的 name 和 age 字段
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("name","age");
        //selectMaps() 返回 Map 集合列表,通常配合 select() 使用,避免 User 对象中
        //没有被查询到的列值为 null
        userMapper.selectMaps(queryWrapper).forEach(System.out::println);
    }
  6. 实现子查询:
    @Test
    public void test06(){
        //查询 id 小于等于 3 的用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.inSql("id","select id from t_user where id <= 3");
        userMapper.selectList(queryWrapper).forEach(System.out::println);
    }

UpdateWrapper:

//UpdateWrapper
@Test
public void test07(){
    //将(年龄大于 20 或邮箱为 null) 并且用户名中包含有 a 的用户信息修改
    //组装 set 子句以及修改条件
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    //lambda 表达式内的逻辑优先运算
    updateWrapper.set("age",18)
            .set("email","user@163.com")
            .like("name","a")
            .and(i -> i.gt("age", 20).or().isNull("email"));
    //注意:
        //这里必须创建 User 对象,否则无法应用自动填充. 如果没有自动填充,可以设置为null,
        //User user = new User();
        //user.setName("张三");

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

Condition:

  1. 概述:
    1. 在真正开发过程中,组装条件是常见的功能,而这些条件来源于用户输入,是可选的
    2. 因此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装这些条件,若没有选择一定不能组装,以免影响 SQL 执行的结果
  2. 思路一:
    //condition
    @Test
    public void test08(){
        //定义查询条件,可能为 null(用户未输入或未选择)
        String name = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //StringUtils.isNotBlank() 判断某字符串是否不为空且长度不为 0 且不由空白符构成
        if(StringUtils.isNotBlank(name)){
            queryWrapper.like("name","a");
        }
        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);
    }
  3. 思路二:
    1. 上面的实现方案没有问题,但是代码比较复杂,我们可以使用带 comdtion 参数的重载方法构建查询条件,简化代码编写
      @Test
      public void test09(){
          //定义查询条件,有可能为 null(用户未输入或未选择)
          String username = null;
          Integer ageBegin = 10;
          Integer ageEnd = 20;
          QueryWrapper<User> queryWrapper = new QueryWrapper<>();
          queryWrapper.like(StringUtils.isNotBlank(username),"user","a")
                  .ge(ageBegin != null,"age",ageBegin)
                  .le(ageEnd != null,"age",ageEnd);
          List<User> users = userMapper.selectList(queryWrapper);
          users.forEach(System.out::println);
      
      }

LambdaUpdateWrapper:

@Test
public void test10(){
    //组装 set 句子
    LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper.set(User::getAge,18)
            .set(User::getEmail,"user@qq.com")
            .like(User::getName,"a")    //Lambda 表达式的逻辑优先运算
            .and(i -> i.lt(User::getAge,24).or().isNull(User::getEmail));

    User user = new User();
    int result = userMapper.update(user,updateWrapper);
    System.out.println(result);
}

插件:

  1. 分页插件:
    1. MyBatis-Plus 自带分页插件,只要简单的配置即可实现分页功能
    2. 添加配置类:
      @Configuration
      @MapperScan("com.springboot.mybatisplus.mapper")
      public class MybatisPlusConfig {
          @Bean
          public MybatisPlusInterceptor mybatisPlusInterceptor(){
              MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
              interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
              return interceptor;
          }
      }
    3. 测试:
      @Test
      public void test11() {
          //设置分页参数
          Page<User> page = new Page<>(1,5);
          userMapper.selectPage(page,null);
          List<User> list = page.getRecords();
          list.forEach(System.out::println);
          System.out.println("当前页:"+page.getCurrent());
          System.out.println("每页显示的条数:"+page.getSize());
          System.out.println("总记录数:"+page.getTotal());
          System.out.println("总页数:"+page.getPages());
          System.out.println("是否有上一页:"+page.hasPrevious());
          System.out.println("是否有下一页:"+page.hasNext());
      }
    4. 测试结果:
  2. xml 自定义分页:
    1. UserMapper 中定义接口方法:
      public interface UserMapper extends BaseMapper<User> {
          /**
           * 根据年龄查询用户列表,分页显示
           * @param page 分页对象,xml 中可以从这里面进行取值,传递参数 Page 即自动分页,必须放在第一位
           * @param age 年龄
           * @return
           */
          Page<User> selectPagecVo(@Param("page")Page<User> page,@Param("age")Integer age);
      }
    2. UserMapper.xml 中编写 SQL:
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE mapper
              PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.springboot.mybatisplus.mapper.UserMapper">
      
          <!--SQL 片段,记录基础字段-->
          <sql id="BaseColums">id,username,age,email</sql>
          
          <!--IPage<User> selectPageVo(Page<User> Page,Integer age)-->
          <select id="selectPageVo" resultType="User">
              select <include refid="BaseColums"></include> from t_user where age > #{age}
          </select>
      
      </mapper>
    3. 测试:
      结果:
      User(id=3, name=Tom, age=28, email=test3@baomidou.com, isDeleted=null)
      User(id=4,name=Sandy, age=21, email=test4@baomidou.com, isDeleted=null) 
      User(id=5, name=Billie,age=24, email=test5@baomidou.com, isDeleted=null) 
      User(id=8, name=ybc1, age=21,email=null, isDeleted=null)
      User(id=9, name=ybc2, age=22, email=null, isDeleted=null) 
      当前 页: 1
      每页显示的条数:  5 
      总记录数:   12
      总页数:  3
      是否有上一页: false
      是否有下一页: true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值