MybatisPlus拓展功能(内附全功能代码)

目录

代码生成

静态工具

案例

逻辑删除

枚举处理器

​编辑

Json处理器

分页插件功能

​编辑

案例

封装转换方法



代码生成

静态工具

案例

    @Override
    public UserVO queryUserAndAddressById(long id) {
//        1.查询用户
        User user = getById(id);
        if (user == null || user.getStatus() == 2) {
            throw new RuntimeException("用户状态异常");
        }
//  2.查询地址
//        避免循环依赖
        List<Address> list = Db.lambdaQuery(Address.class).eq(Address::getUserId, id).list();
        UserVO userVO = new UserVO();
        BeanUtil.copyProperties(user, userVO);
        if (CollUtil.isNotEmpty(list)) {
            userVO.setAddresses(BeanUtil.copyToList(list, AddressVO.class));
        }

//        2.查询地址
        return userVO;
    }
    @Override
    public List<UserVO> queryUsersAndAddress(List<Long> ids) {
        List<User> users = listByIds(ids);
        if (CollUtil.isEmpty(users)) {
            return Collections.emptyList();
        }

        // 查询所有相关的地址列表,并按 userId 分组
        Map<Long, List<Address>> addressMap = Db.lambdaQuery(Address.class)
                .in(Address::getUserId, ids)
                .list().stream()
                .collect(Collectors.groupingBy(Address::getUserId));

        // 使用 Stream API 转换 User 列表到 UserVO 列表,并关联地址信息
        return users.stream().map(user -> {
            UserVO userVO = new UserVO();
            BeanUtil.copyProperties(user, userVO); // 复制 User 属性到 UserVO

            // 使用 getOrDefault 避免 NullPointerException,并转换地址列表到 AddressVO 列表
            List<AddressVO> addresses = addressMap.getOrDefault(user.getId(), Collections.emptyList()).stream()
                    .map(address -> {
                        AddressVO addressVO = new AddressVO();
                        BeanUtil.copyProperties(address, addressVO); // 复制 Address 属性到 AddressVO
                        return addressVO;
                    }).collect(Collectors.toList());

            userVO.setAddresses(addresses); // 封装地址信息到 UserVO
            return userVO;
        }).collect(Collectors.toList());
    }

逻辑删除

枚举处理器


@Getter
public enum UserStatus {
    NORMAL(1,"正常"),
    FROZEN(2,"冻结"),
    ;
    @EnumValue
    @JsonValue
    private final int value;
    private final String desc;

    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}

Json处理器

分页插件功能

@Configuration
public class MyBatisConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
//        只有拦截功能
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//        1.创建分页插件
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setMaxLimit(1000L);
//        2.添加分页插件
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

案例

    @Override
    public PageDTO<UserVO> queryUsersPage(UserQuery query) {
        Page<User> page = new Page<>();
        // 创建分页对象
        if (query.getPageNo()!=null|| query.getPageSize()!=null){
         page.setPages(query.getPageNo());
         page.setSize(query.getPageSize());
        }

        // 添加排序,根据 query.getIsAsc() 的值确定升序或降序
        if (query.getIsAsc()) {
            page.addOrder(OrderItem.asc("balance")); // 升序
        } else {
            page.addOrder(OrderItem.desc("balance")); // 降序
        }
        // 创建查询条件
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        if (StrUtil.isNotEmpty(query.getName())) {
            queryWrapper.like(User::getUsername, query.getName());
        }
        queryWrapper.eq(User::getStatus, UserStatus.NORMAL);
        Page<User>  page1= userMapper.selectPage(page, queryWrapper);
        PageDTO<UserVO> pageDTO = new PageDTO<>();
        pageDTO.setList(BeanUtil.copyToList(page1.getRecords(), UserVO.class));
//        总条数
        pageDTO.setTotal(page1.getTotal());
//        总页数
        pageDTO.setPages(page1.getPages());
        // 执行分页查询并返回结果
        return pageDTO;
    }

封装转换方法

@Data
@ApiModel(description = "分页查询实体")
public class PageQuery {
    @ApiModelProperty("页码")
    private Integer pageNo=1;
    @ApiModelProperty("页码")
    private Integer pageSize=5;
    @ApiModelProperty("排序字段")
    private String sortBy;
    @ApiModelProperty("是否升序")
    private Boolean isAsc=true;

    public <T>  Page<T> toMpPage(OrderItem ... orders){
        // 1.分页条件
        Page<T> p = Page.of(pageNo, pageSize);
        // 2.排序条件
        // 2.1.先看前端有没有传排序字段
        if (sortBy != null) {
            p.addOrder(new OrderItem(sortBy, isAsc));
            return p;
        }
        // 2.2.再看有没有手动指定排序字段
        if(orders != null){
//            传递可变参数
            p.addOrder(orders);
        }
        return p;
    }

    public <T> Page<T> toMpPage(String defaultSortBy, boolean isAsc){
        return this.toMpPage(new OrderItem(defaultSortBy, isAsc));
    }

    public <T> Page<T> toMpPageDefaultSortByCreateTimeDesc() {
        return toMpPage("create_time", false);
    }

    public <T> Page<T> toMpPageDefaultSortByUpdateTimeDesc() {
        return toMpPage("update_time", false);
    }
}


@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "分页结果")
public class PageDTO<V> {
    @ApiModelProperty("总条数")
    private Long total;
    @ApiModelProperty("总页数")
    private Long pages;
    @ApiModelProperty("集合")
    private List<V> list;

    /**
     * 返回空分页结果
     * @param p MybatisPlus的分页结果
     * @param <V> 目标VO类型
     * @param <P> 原始PO类型
     * @return VO的分页对象
     */
//   类上的泛型是属于对象的,静态方法不能调用
    public static <V, P> PageDTO<V> empty(Page<P> p){
        return new PageDTO<>(p.getTotal(), p.getPages(), Collections.emptyList());
    }

    /**
     * 将MybatisPlus分页结果转为 VO分页结果
     * @param p MybatisPlus的分页结果
     * @param voClass 目标VO类型的字节码
     * @param <V> 目标VO类型
     * @param <P> 原始PO类型
     * @return VO的分页对象
     */
//    调用者才能知道字节码是什么,泛型不能获取class
    public static <V, P> PageDTO<V> of(Page<P> p, Class<V> voClass) {
        // 1.非空校验
        List<P> records = p.getRecords();
        if (records == null || records.size() <= 0) {
            // 无数据,返回空结果
            return empty(p);
        }
        // 2.数据转换
        List<V> vos = BeanUtil.copyToList(records, voClass);
        // 3.封装返回
        return new PageDTO<>(p.getTotal(), p.getPages(), vos);
    }

    /**
     * 将MybatisPlus分页结果转为 VO分页结果,允许用户自定义PO到VO的转换方式
     * @param p MybatisPlus的分页结果
     * @param convertor PO到VO的转换函数
     * @param <V> 目标VO类型
     * @param <P> 原始PO类型
     * @return VO的分页对象
     */
//    函数式编程
    public static <V, P> PageDTO<V> of(Page<P> p, Function<P, V> convertor) {
        // 1.非空校验
        List<P> records = p.getRecords();
        if (records == null || records.size() <= 0) {
            // 无数据,返回空结果
            return empty(p);
        }
        // 2.数据转换
        List<V> vos = records.stream().map(convertor).collect(Collectors.toList());
        // 3.封装返回
        return new PageDTO<>(p.getTotal(), p.getPages(), vos);
    }
}
  • 39
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值