MybatisPlus实现分页查询、动态SQL查询

前言

提示:这里可以添加本文要记录的大概内容:



一、常用方法

// LambdaQueryWrapper 构造不同类型的查询条件,
// orderByDesc 方法用于降序排序。

//需要注意:使用 LambdaQueryWrapper 时,需要先确定对应的实体类和数据库表之间的映射关系,并且该实体类必须使用 @TableName 注解指定了表名。同时,MyBatis-Plus 提供的查询方法名通常都是通过反射机制来完成的,因此在使用 Lambda 表达式时,要注意避免出现属性名和方法名不一致的情况。
    
// 1、根据指定条件进行查询一条记录。
LambdaQueryWrapper<SaveDevice> queryWrapper =  new LambdaQueryWrapper<>();
        queryWrapper.eq(SaveDevice::getDeviceUid, registerDTO.getDeviceUid());
        SaveDevice saveDevice = saveDeviceMapper.selectOne(queryWrapper);

///1.1 查询指定名称的用户列表
List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>()
    .eq(User::getName, "John")
    .orderByDesc(User::getAge));

// 2、新增一条用户记录
User newUser = new User();
newUser.setName("Jack");
newUser.setEmail("jack@example.com");
newUser.setAge(25);
int rows = userMapper.insert(newUser);

// 3、更新所有名字为 John 的用户记录,设置年龄为 30
int rows = userMapper.update(new User(), new LambdaQueryWrapper<User>()
    .eq(User::getName, "John")
    .set(User::getAge, 30));

///3.1、根据指定条件进行修改。
UpdateWrapper<SaveDevice> wrapper = new UpdateWrapper<>();
                wrapper.eq("device_uid", registerDTO.getDeviceUid());
                wrapper.set("psk", psk);
                saveDeviceMapper.update(null, wrapper);

// 4、删除所有名字为 Jack 的用户记录
int rows = userMapper.delete(new LambdaQueryWrapper<User>()
    .eq(User::getName, "Jack"));

// 5.批量查询
  LambdaQueryWrapper<PlantLabelConfigPo> queryWrapper =
                Wrappers.lambdaQuery(PlantLabelConfigPo.class)
                        .in(PlantLabelConfigPo::getId, listLabelId);
// 6.批量删除
LambdaQueryWrapper<PlantLabelInfoPo> wrapper = new QueryWrapper<PlantLabelInfoPo>().lambda();
        wrapper.in(PlantLabelInfoPo::getPlantLabelId, idList);
        plantLabelInfoDao.delete(wrapper);

// 7.构造器拼接SQL语句
LambdaQueryWrapper<ThingInfoPO> wrapper =
    buildThingInfoQuery(tenantId).eq(ThingInfoPO::getCode, thing.getCode());
// 拼接构造条件
private LambdaQueryWrapper<ThingInfoPO> buildThingInfoQuery(@Nullable Long tenantId) {
        LambdaQueryWrapper<ThingInfoPO> wrapper = new QueryWrapper<ThingInfoPO>().lambda();
        if (tenantId != null) {
            wrapper.eq(ThingInfoPO::getTenantId, tenantId);
        }
        return wrapper;
    }

一、Bean

/**
 * 新的分页插件
 */
  @Bean
  public MybatisPlusInterceptor mybatisPlusInterceptor() {
      MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
      mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
      return mybatisPlusInterceptor;
  }

@Configuration
public class MyBatisPlusConfig {
    /**
     * 配置mybatis-plus 分页查件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}
// 原文链接:https://blog.csdn.net/m0_48805880/article/details/122070016

二、使用步骤

public Page<User> selectPageLike(User user, PageDTO pageDTO){
        Page<User> page= new Page(pageDTO.getPage(), pageDTO.getSize());
        // new LambdaQueryChainWrapper<>();
        LambdaQueryWrapper<User> queryWrapper =  new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getEnabled, 1);
        // 用户名
        if (StringUtil.isNotEmpty(user.getUsername())) {
            queryWrapper.like(User::getUsername, user.getUsername());
        }
        // 新建时间
        if (StringUtil.isNotEmpty(user.getCreateTime().toString())) {
            queryWrapper.eq(User::getCreateTime,user.getCreateTime());
        }
        return userMapper.selectPage(page, queryWrapper);
    }

三、构造器

1、LambdaQueryWrapper

// LambdaQueryWrapper使用的是Lambda语法

    @Test
    public void mySelect() {
        LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
        query.likeRight(User::getName, "王")
            .and(q -> q.lt(User::getAge, 40).or().isNotNull(User::getEmail));
        List<User> list = userMapper.selectAll(query);
        list.forEach(System.out::println);
    }

2、LambdaQueryChainWrapper 链式查询

   /**
    * 链式lambda条件构造器:更优雅的书写方式
    */
   @Test
   public void lambdaQueryChainWrapper() {
       List<User> list = new LambdaQueryChainWrapper<User>(userMapper)
           .likeRight(User::getName, "王")
           .and(
               q -> q
                   .lt(User::getAge, 40)
                   .or()
                   .isNotNull(User::getEmail)
           )
           .list();
       list.forEach(System.out::println);
   }
  // 原文链接:https://blog.csdn.net/jiahao1186/article/details/122154137

3、三者区别

1、QueryWrapper 直接使用写死“列名”方式,容易因拼写错误导致异常,当字段名称发生改变,导致额外更多检查和修改工作。如有错误,运行时报错。或者需要封装查询类的对象,增加代码量。
2、LambdaQueryWrapper 使用lambda表达式,如有错误,编译期就会报错;灵活。【推荐】
3、LambdaQueryChainWrapper,写法偏向于炫技,可读性没有上面的代码强。

4、构造器拼接SQL

// 构造器拼接SQL语句
LambdaQueryWrapper<ThingInfoPO> wrapper =
    buildThingInfoQuery(tenantId).eq(ThingInfoPO::getCode, thing.getCode());

private LambdaQueryWrapper<ThingInfoPO> buildThingInfoQuery(@Nullable Long tenantId) {
        LambdaQueryWrapper<ThingInfoPO> wrapper = new QueryWrapper<ThingInfoPO>().lambda();
        if (tenantId != null) {
            wrapper.eq(ThingInfoPO::getTenantId, tenantId);
        }
        return wrapper;
    }

原文链接1
原文链接2

总结

========================努力干吧!菜鸟。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值