RuoYi Vue Pro 对 MyBatis Plus的二次封装

一、RuoYi Vue Pro对MyBatis Plus进行了五个方面的封装

  1. BaseMapper的封装

    RuoYi Vue Pro对BaseMapper进行了封装,在BaseMapper中添加了一些常用的方法,比如根据条件查询单个实体、根据条件查询实体列表、根据条件统计实体数量等。这些方法可以在具体的Mapper接口中直接调用,避免了编写重复的SQL语句的问题。

  2. IService的封装

    RuoYi Vue Pro对IService进行了封装,在IService中添加了一些常用的方法,比如根据实体插入数据、根据ID更新数据、根据ID删除数据等。这些方法可以在具体的Service实现类中直接调用,避免了编写重复的SQL语句的问题。

  3. LambdaQueryWrapper的封装

    RuoYi Vue Pro对LambdaQueryWrapper进行了封装,在LambdaQueryWrapper中添加了一些常用的方法,比如根据条件查询单个实体、根据条件查询实体列表、根据条件统计实体数量等。这些方法可以在具体的Mapper接口中直接调用,避免了编写重复的SQL语句的问题。

  4. 自定义注解的封装

    RuoYi Vue Pro对MyBatis Plus自带的注解进行了封装,添加了一些自定义注解,比如@QueryCriteria、@Query、@Criteria等。这些注解可以用于指定查询条件,避免了手动编写SQL语句的问题。

  5. 分页插件的封装

    RuoYi Vue Pro对MyBatis Plus自带的分页插件进行了封装,添加了一些常用的分页方法,比如根据条件查询实体列表并进行分页、根据条件统计实体数量并进行分页等。这些方法可以在具体的Mapper接口中直接调用,避免了编写重复的SQL语句的问题。


二、首先理解一下LambdaQueryWrapper

原本QueryWrapper的使用

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "张三") // 等于
    .ne("age", 18) // 不等于
    .gt("age", 20) // 大于
    .lt("age", 30) // 小于
    .like("email", "@qq.com") // 模糊查询
    .in("id", Arrays.asList(1L, 2L, 3L)) // IN查询
    .between("birthday", LocalDate.of(1990, 1, 1), LocalDate.of(2000, 12, 31)) // 范围查询
    .isNull("address") // NULL查询
    .orderByAsc("age"); // 排序

List<User> userList = userService.list(wrapper);

使用LambdaQueryWrapper

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "张三") // 等于
    .ne(User::getAge, 18) // 不等于
    .gt(User::getAge, 20) // 大于
    .lt(User::getAge, 30) // 小于
    .like(User::getEmail, "@qq.com") // 模糊查询
    .in(User::getId, Arrays.asList(1L, 2L, 3L)) // IN查询
    .between(User::getBirthday, LocalDate.of(1990, 1, 1), LocalDate.of(2000, 12, 31)) // 范围查询
    .isNull(User::getAddress) // NULL查询
    .orderByAsc(User::getAge); // 排序

List<User> userList = userService.list(wrapper);

相比之下,LambdaQueryWrapper使用Lambda表达式进行查询条件的构建,代码可读性更高,使用Lambda表达式可以使代码更加简洁、易读,同时避免了链式调用可能出现的方法调用顺序错误的问题。


三、LambdaQueryWrapperX

LambdaQueryWrapperX继承了LambdaQueryWrapper,主要是增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。例如说:

在这里插入图片描述

具体使用示例:
在这里插入图片描述


四、BaseMapperX

BaseMapperX 接口,继承 MyBatis Plus 的 BaseMapper 接口,提供更强的 CRUD 操作能力。

例如 selectList 方法

原本BaseMapper 中

public interface BaseMapper<T> extends Mapper<T> {

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

}

在service中调用selectList时需要传入条件构造器:

    @Override
    public List<RecruitmentDO> getAllRecruitments() {
        LambdaQueryWrapperX<RecruitmentDO> wrapper = new LambdaQueryWrapperX<>();
        //查询所有开启状态的数据
        wrapper.eq(RecruitmentDO::getStatus, 0);
        return recruitmentMapper.selectList(wrapper);
    }

在BaseMapperX中

public interface BaseMapperX<T> extends BaseMapper<T> {

    default List<T> selectList() {
        return selectList(new QueryWrapper<>());
    }

    default List<T> selectList(String field, Object value) {
        return selectList(new QueryWrapper<T>().eq(field, value));
    }

    default List<T> selectList(SFunction<T, ?> field, Object value) {
        return selectList(new LambdaQueryWrapper<T>().eq(field, value));
    }

    default List<T> selectList(String field, Collection<?> values) {
        return selectList(new QueryWrapper<T>().in(field, values));
    }

    default List<T> selectList(SFunction<T, ?> field, Collection<?> values) {
        return selectList(new LambdaQueryWrapper<T>().in(field, values));
    }

    default List<T> selectList(SFunction<T, ?> leField, SFunction<T, ?> geField, Object value) {
        return selectList(new LambdaQueryWrapper<T>().le(leField, value).ge(geField, value));
    }

}

经过BaseMapperX封装后,我们并不需要在service中创建条件构造器:

    @Override
    public List<RecruitmentDO> getAllRecruitments() {
//        LambdaQueryWrapperX<RecruitmentDO> wrapper = new LambdaQueryWrapperX<>();
//        //查询所有开启状态的数据
//        wrapper.eq(RecruitmentDO::getStatus, 0);
//        return recruitmentMapper.selectList(wrapper);

        //BaseMapperX进一步封装
        return recruitmentMapper.selectList(RecruitmentDO::getStatus,0);
    }
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值