当前位置:   article > 正文

RuoYi Vue Pro 对 MyBatis Plus的二次封装_basemapperx

basemapperx

一、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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

使用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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

相比之下,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);

}
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

在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));
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

经过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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/49065
推荐阅读
相关标签
  

闽ICP备14008679号