自学内容网 自学内容网

SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现

在现代 Java 开发中,我们常常需要处理各种通用的功能和需求,诸如枚举的处理、JSON 数据处理,以及分页查询等。这些功能虽然看似简单,但在实际开发中往往涉及到许多细节和优化。为了提高开发效率、减少重复代码的编写,我们通常会通过封装和抽象这些功能,形成易于复用和维护的工具类或组件。

目录

前言

枚举处理器

JSON处理器

插件功能

 分页插件

 通用分页实体

总结


前言

在现代 Java 开发中,我们常常需要处理各种通用的功能和需求,诸如枚举的处理、JSON 数据处理,以及分页查询等。这些功能虽然看似简单,但在实际开发中往往涉及到许多细节和优化。为了提高开发效率、减少重复代码的编写,我们通常会通过封装和抽象这些功能,形成易于复用和维护的工具类或组件。


枚举处理器

User类中有一个用户状态字段:

    /**
     * 详细信息
     */
    private String info;

    /**
     * 使用状态(1正常 2冻结)
     */
    private Integer status;

第一种方式可读性太差,需自己知道哪一个数字对应的是什么状态,既然有对应的枚举类UserStatus,直接使用UserStatus类来代替Integer即可。

 此时,数据库中的status还是int整型。此时,就存在一个java中的枚举类型和数据库中的整型的转换问题。

 

Mybatis的底层帮我们解决这个问题。

在application.yml中配置全局枚举处理器:

mybatis-plus:
 configuration:
   default-enum-type-handler:   com,baomidou,mybatisplus.core.handlers.MybatisEnumTypeHandler

详情也可点击该链接(https://baomidou.com/guides/auto-convert-enum/

 UserStatus枚举类

package com.itheima.mp.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;

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

}

 

当我们测试时,返回的status是NORMAL。

如果我们想指定返回的数据,那么就需要使用到@JsonValue注解

 

 

JSON处理器

数据库中user表中有一个json类型的字段:

 

Java中一般通过String字符串进行接收

如果想要信息中的一个信息比如年龄,我们可以通过一个类,将各种信息封装到里面。 

 但是我们的mybatis没有能力自己进行将json类型和对象做转换,此时我们就可以用自定义的类型处理器,Mybatis-Plus提供了这样的自定义类型处理器。

 

@TableField(typeHandler = JacksonTypeHandler.class)只是让自定义适配器生效;同时@TableName(value = "user",autoResultMap = true)开启自动结果集映射。

UserInfo类

package com.itheima.mp.domain.po;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
//静态方法
@AllArgsConstructor(staticName = "of")
public class UserInfo {
    private Integer age;

    private String intro;

    private String gender;

}

 User类

@TableName(value = "user",autoResultMap = true)
public class User  {

    /**
     * 详细信息
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private UserInfo info;
}

 

插件功能

 MybatisPlus提供的内置拦截器有下面这些:

 分页插件

首先,要在配置类中注册MyBatisPlus的核心插件,同时添加分页插件:

package com.itheima.mp.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@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;
    }
}

接着,就可以使用分页的API:

 测试

    @Test
    void testPageQuery(){
        int pageNo = 1;
        int pageSize = 2;
        //准备分页条件
        Page<User> page = Page.of(pageNo, pageSize);
        //排序条件
        page.addOrder(new OrderItem("balance",true));
        page.addOrder(new OrderItem("id",true));
        //分页查询
        Page<User> p = userService.page(page);
        //总条数
        long total = p.getTotal();
        System.out.println("total = "+total);
        //总页数
        long pages = p.getPages();
        System.out.println("pages = "+pages);
        //分页的总数居
        List<User> users = p.getRecords();
        users.forEach(System.out::println);
    }

 

 通用分页实体

需求:实现User的分页查询

PageQuery类

package com.itheima.mp.query;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

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

UserQuery类

package com.itheima.mp.query;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(description = "用户查询条件实体")
public class UserQuery extends PageQuery {
    @ApiModelProperty("用户名关键字")
    private String name;
    @ApiModelProperty("用户状态:1-正常,2-冻结")
    private Integer status;
    @ApiModelProperty("余额最小值")
    private Integer minBalance;
    @ApiModelProperty("余额最大值")
    private Integer maxBalance;

}

PageDTO类

package com.itheima.mp.domain.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

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

IUserService接口

 PageDTO queryUsersPage(UserQuery query);

UserServiceImpl实现类

    @Override
    public PageDTO queryUsersPage(UserQuery query) {
        String name = query.getName();
        Integer status = query.getStatus();

        //构建查询条件
        Page<User> page = Page.of(query.getPageNo(), query.getPageSize());
        //排序条件
        if(query.getSortBy()!=null){
            page.addOrder(new OrderItem(query.getSortBy(),query.isAsc()));
        }else {
            page.addOrder(new OrderItem("update_time",false));
        }

        //分页查询
        Page<User> p = lambdaQuery()
                .like(name != null, User::getUsername, name)
                .eq(status != null, User::getStatus, status)
                .page(page);
        //封装VO结果
        PageDTO pageDTO = new PageDTO();

        //总条数
        pageDTO.setTotal(p.getTotal());
        //总页数
        pageDTO.setPages(p.getPages());
        //当前页数据
        List<User> records = p.getRecords();
        if(CollUtil.isEmpty(records)){
            pageDTO.setList(Collections.emptyList());
            return pageDTO;
        }
        //拷贝userVO
        List<UserVO> userVOS = BeanUtil.copyToList(records, UserVO.class);
        pageDTO.setList(userVOS);
        //返回
        return pageDTO;
    }

 

 需求:

  • 在PageQuery中定义方法,将PageQuery对象转为MyBatisPlus中的Page对象
  • 在PageDTO中定义方法,将MyBatisPlus中的Page结果转为PageDTO结果

PageQuery类

package com.itheima.mp.domain.query;

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.mp.domain.po.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@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 ... ithems) {
        Page<T> page = Page.of(pageNo, pageSize);
        //排序条件
        if(sortBy != null){
            page.addOrder(new OrderItem(sortBy,isAsc));
        }else if(ithems != null){
            //为空,默认排序
            page.addOrder(ithems);
        }
        return page;
    }

    public <T> Page<T> ToMpPageDefaultSortByCreateTime() {
        return ToMpPage(new OrderItem("create_time",false));
    }
    public <T> Page<T> ToMpPageDefaultSortByUpdateTime() {
        return ToMpPage(new OrderItem("update_time",false));
    }

    public <T> Page<T> ToMpPage(String sortBy,boolean defaultAsc) {
        return ToMpPage(new OrderItem(sortBy,defaultAsc));
    }
}

PageDTO类

package com.itheima.mp.domain.dto;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.vo.UserVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.Collections;
import java.util.List;

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

    public static <PO,VO>  PageDTO of(Page<PO> p,Class<VO> clazz) {
        //封装VO结果
        PageDTO pageDTO = new PageDTO();

        //总条数
        pageDTO.setTotal(p.getTotal());
        //总页数
        pageDTO.setPages(p.getPages());
        //当前页数据
        List<PO> records = p.getRecords();
        if(CollUtil.isEmpty(records)){
            pageDTO.setList(Collections.emptyList());
            return pageDTO;
        }
        //拷贝userVO
        List<VO> userVOS = BeanUtil.copyToList(records,clazz);
        pageDTO.setList(userVOS);
        //返回
        return pageDTO;
    }
}

 


总结

这篇博客中,我们详细介绍了如何实现并优化三个常见的功能处理器:枚举处理器、JSON 处理器和分页插件。

这些技术的合理封装和应用,不仅能让我们的代码更加高效、简洁,还能有效地提升系统的可维护性。在实际开发过程中,遇到类似需求时,我们可以借助这些封装好的工具,避免重复劳动,专注于业务逻辑的实现。

希望通过本篇博客,能为你在开发中处理枚举、JSON 和分页等功能提供一些实用的思路与技术方案。如果你有任何问题或建议,欢迎留言讨论,我们一起探索更好的开发方式。


原文地址:https://blog.csdn.net/m0_63267251/article/details/144802146

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!