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

news/2026/1/18 8:11:48/文章来源:https://www.cnblogs.com/tlnshuju/p/19497739

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

2026-01-18 08:09  tlnshuju  阅读(0)  评论(0)    收藏  举报

在现代 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,"冻结"),;@EnumValueprivate 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 {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//1.创建分页插件PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);//设置最大查询记录paginationInnerInterceptor.setMaxLimit(1000L);//2.添加分页插件interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}
}

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

测试

    @Testvoid testPageQuery(){int pageNo = 1;int pageSize = 2;//准备分页条件Page page = Page.of(pageNo, pageSize);//排序条件page.addOrder(new OrderItem("balance",true));page.addOrder(new OrderItem("id",true));//分页查询Page p = userService.page(page);//总条数long total = p.getTotal();System.out.println("total = "+total);//总页数long pages = p.getPages();System.out.println("pages = "+pages);//分页的总数居List 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实现类

    @Overridepublic PageDTO queryUsersPage(UserQuery query) {String name = query.getName();Integer status = query.getStatus();//构建查询条件Page 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 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 records = p.getRecords();if(CollUtil.isEmpty(records)){pageDTO.setList(Collections.emptyList());return pageDTO;}//拷贝userVOList 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  Page ToMpPage(OrderItem ... ithems) {Page page = Page.of(pageNo, pageSize);//排序条件if(sortBy != null){page.addOrder(new OrderItem(sortBy,isAsc));}else if(ithems != null){//为空,默认排序page.addOrder(ithems);}return page;}public  Page ToMpPageDefaultSortByCreateTime() {return ToMpPage(new OrderItem("create_time",false));}public  Page ToMpPageDefaultSortByUpdateTime() {return ToMpPage(new OrderItem("update_time",false));}public  Page 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   PageDTO of(Page p,Class clazz) {//封装VO结果PageDTO pageDTO = new PageDTO();//总条数pageDTO.setTotal(p.getTotal());//总页数pageDTO.setPages(p.getPages());//当前页数据List records = p.getRecords();if(CollUtil.isEmpty(records)){pageDTO.setList(Collections.emptyList());return pageDTO;}//拷贝userVOList userVOS = BeanUtil.copyToList(records,clazz);pageDTO.setList(userVOS);//返回return pageDTO;}
}

总结

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1177351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三步解锁全网盘高速下载:终极直链解析指南

三步解锁全网盘高速下载:终极直链解析指南 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用,去推广,无需…

GESP认证C++编程真题解析 | GESP202412 四级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

PaddleOCR-VL-WEB核心优势解析|附营业执照识别同款实践案例

PaddleOCR-VL-WEB核心优势解析|附营业执照识别同款实践案例 1. 引言:文档智能进入大模型时代 在金融、政务、电商等高频业务场景中,营业执照的自动化识别与核验已成为企业数字化转型的关键环节。传统OCR技术虽能提取文本内容,但…

GESP认证C++编程真题解析 | 202412 四级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

通义千问2.5-7B-Instruct保姆级教程:从零开始GPU部署实操

通义千问2.5-7B-Instruct保姆级教程:从零开始GPU部署实操 通义千问 2.5-7B-Instruct 是阿里 2024 年 9 月随 Qwen2.5 系列一同发布的 70 亿参数指令微调模型,定位“中等体量、全能型、可商用”。该模型在性能、效率和易用性之间实现了良好平衡&#xff…

网盘下载新革命:8大平台直链解析工具深度体验

网盘下载新革命:8大平台直链解析工具深度体验 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用,去推广,无…

GESP认证C++编程真题解析 | 202412 三级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

MinerU 2.5代码实例:批量处理PDF文档的自动化脚本

MinerU 2.5代码实例:批量处理PDF文档的自动化脚本 1. 引言 1.1 业务场景描述 在科研、工程和内容管理领域,大量非结构化 PDF 文档需要被高效转化为可编辑、可检索的结构化格式。传统手动提取方式效率低下,尤其面对多栏排版、复杂表格、数学…

UDS 31服务ECU实现过程中的常见问题解析

UDS 31服务在ECU实现中的“坑”与实战避险指南你有没有遇到过这样的场景?产线刷写卡在预检环节,诊断仪发了31 01 XX XX后石沉大海;或者OTA升级前的环境检查刚启动,ECU直接复位重启;更严重的是,非授权设备误…

如何提升模糊图像清晰度?Super Resolution WebUI使用实操手册

如何提升模糊图像清晰度?Super Resolution WebUI使用实操手册 1. 引言 1.1 业务场景描述 在数字内容爆炸式增长的今天,大量历史图片、网络截图和用户上传图像存在分辨率低、细节模糊的问题。尤其在图像归档、内容再利用和视觉展示等场景中&#xff0c…

网盘直链下载助手:八大平台真实下载地址一键获取终极指南

网盘直链下载助手:八大平台真实下载地址一键获取终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用,去推广&a…

体验最新AI模型入门必看:云端GPU按需付费成主流

体验最新AI模型入门必看:云端GPU按需付费成主流 应届毕业生在求职时,常常会看到招聘要求上写着“熟悉YOLO等CV技术”。这确实是一个提升竞争力的好方向。但一想到要学习这些技术,很多人就犯了难:教程里动不动就说“需要配置GPU服…

虚拟手柄终极指南:如何用vJoy将键盘变成专业游戏控制器

虚拟手柄终极指南:如何用vJoy将键盘变成专业游戏控制器 【免费下载链接】vJoy Virtual Joystick 项目地址: https://gitcode.com/gh_mirrors/vj/vJoy 想要让普通键盘鼠标变身为专业游戏手柄吗?vJoy虚拟手柄项目正是你需要的完美解决方案。这个开源…

AI手势识别与追踪多语言支持:国际化部署方案

AI手势识别与追踪多语言支持:国际化部署方案 1. 技术背景与需求演进 随着人机交互技术的不断演进,AI驱动的手势识别正逐步从实验室走向消费级应用。在智能设备、虚拟现实、远程控制等场景中,用户期望通过自然的手势完成操作,而无…

从零实现干净系统状态:Vivado完整卸载方案

从零开始构建纯净开发环境:彻底卸载 Vivado 的实战指南 你有没有遇到过这样的情况? 刚下载好最新版 Vivado,满怀期待地点击安装,结果弹出一条令人窒息的提示:“检测到旧版本存在,无法继续安装。” 或者更…

IQuest-Coder-V1推理卡顿?显存优化部署实战案例解析

IQuest-Coder-V1推理卡顿?显存优化部署实战案例解析 1. 引言:大模型落地中的显存挑战 在当前代码大语言模型(LLM)快速演进的背景下,IQuest-Coder-V1-40B-Instruct 作为面向软件工程和竞技编程的新一代模型&#xff0…

BGE-Reranker-v2-m3优化方案:降低企业检索系统成本

BGE-Reranker-v2-m3优化方案:降低企业检索系统成本 1. 技术背景与行业痛点 在当前的检索增强生成(RAG)系统中,向量数据库通过语义相似度进行初步文档召回已成为标准流程。然而,仅依赖嵌入模型(Embedding …

5分钟掌握网盘全速下载秘籍:免费工具助你告别龟速下载

5分钟掌握网盘全速下载秘籍:免费工具助你告别龟速下载 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用,去推广&…

深度学习实战:SpliceAI基因剪接变异预测完整解析

深度学习实战:SpliceAI基因剪接变异预测完整解析 【免费下载链接】SpliceAI 项目地址: https://gitcode.com/gh_mirrors/sp/SpliceAI 基因剪接是生物信息学中的重要研究领域,SpliceAI作为基于深度学习的剪接变异预测工具,为遗传变异功…