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,"冻结"),;@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<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实现类

    @Overridepublic 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;}//拷贝userVOList<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;}//拷贝userVOList<VO> userVOS = BeanUtil.copyToList(records,clazz);pageDTO.setList(userVOS);//返回return pageDTO;}
}

 


总结

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

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

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

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

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

相关文章

游戏引擎学习第69天

回顾碰撞响应时我们停留的位置 从昨天的讨论开始&#xff0c;我们正准备处理碰撞响应的复杂性。具体来说&#xff0c;我们讨论的是&#xff0c;当两个实体在屏幕上发生碰撞时&#xff0c;如何回应这种情况。碰撞本身并不复杂&#xff0c;但要处理其后的反应和规则则更具挑战性…

MAC环境安装(卸载)软件

MAC环境安装&#xff08;卸载&#xff09;软件 jdknode安装node&#xff0c;并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净&#xff0c;可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…

本地LLM部署--llama.cpp

–图源GitHub项目主页 概述 llama.cpp是以一个开源项目&#xff08;GitHub主页&#xff1a;llamma.cpp&#xff09;&#xff0c;也是本地化部署LLM模型的方式之一&#xff0c;除了自身能够作为工具直接运行模型文件&#xff0c;也能够被其他软件或框架进行调用进行集成。 其…

uniapp中使用ruoyiPlus中的加密使用(crypto-js)

package.json中添加 "crypto-js": "^4.2.0", "jsencrypt": "^3.3.2",但是vue2中使用 import CryptoJS from cryptojs; 这一步就会报错 参照 参照这里&#xff1a;vue2使用CryptoJS实现信息加解密 根目录下的js文档中新增一个AESwork.…

go项目使用gentool生成model的gen.go问题

Gen Tool 是一个没有依赖关系的二进制文件&#xff0c;可以用来从数据库生成结构。 使用方法&#xff1a; go install gorm.io/gen/tools/gentoollatest在项目根目录,执行连接的数据库中指定某几张表结构生成数据库model层 gentool -dsn "root:123456tcp(localhost:330…

路由基本配置实验

路由器用于实现不同类型网络之间的互联。 路由器转发ip分组的基础是路由表。 路由表中的路由项分为直连路由项、静态路由项和动态路由项。 通过配置路由器接口的ip地址和子网掩码自动生成直连路由项。 通过手工配置创建静态路由项。 热备份路由器协议允许将由多个路由器组…

产品原型设计

&#x1f923;&#x1f923;目录&#x1f923;&#x1f923; 一、Axure原型设计&#xff08;Axure RP 9 &#xff09;1.1 软件下载安装1.2 产品原型展示1.3 产品原型下载1.4 视频课程推荐 二、磨刀原型设计2.1 软件下载安装2.2 产品原型展示2.3 产品原型下载2.4 视频课程推荐 什…

Android反编译

安卓反编译要用到三个工具&#xff0c; 工具1&#xff1a;apktool反编译出来资源文件和源码 工具2&#xff1a;d2j-dex2jar生成classes_dex2jar.jar文件工具3&#xff1a;jd-gui.exe 打开classes_dex2jar.jar文件查看java代码一、 反编译得到资源文件&#xff08;工具1&#xf…

计算机网络 (17)点对点协议PPP

一、PPP协议的基本概念 PPP协议最初设计是为两个对等节点之间的IP流量传输提供一种封装协议&#xff0c;它替代了原来非标准的第二层协议&#xff08;如SLIP&#xff09;。在TCP/IP协议集中&#xff0c;PPP是一种用来同步调制连接的数据链路层协议&#xff08;OSI模式中的第二层…

信息系统项目管理师——第8章章 项目整合管理 笔记

8 项目整合管理&#xff08;最后反过来看&#xff09; 项目整合过程&#xff1a;①制定项目章程&#xff08;启动过程&#xff09;、②制订项目管理计划&#xff08;规划过程&#xff09;、③指导和管理项目工作、管理项目知识&#xff08;执行过程&#xff09;、④监控项目工…

WebRTC线程的启动与运行

WebRTC线程运行的基本逻辑&#xff1a; while(true) {…Get(&msg, …);…Dispatch(&msg);… }Dispatch(Message *pmsg) {…pmsg->handler->OnMessage(pmsg);… }在执行函数内部&#xff0c;就是一个while死循环&#xff0c;只做两件事&#xff0c;从队列里Get取…

CSS 学习之 padding 与图形绘制

padding 属性和 background-clip 属性配合&#xff0c;可以在有限的标签下实现一些 CSS 图形绘制效果&#xff0c;我这里举两个小例子&#xff0c;重在展示可行性。 例 1:不使用伪元素&#xff0c;仅一层标签实现大队长的“三道杠”分类图标效果。此效果在移动端比较常见&…

yolov5核查数据标注漏报和误报

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、误报二、漏报三、源码总结 前言 本文主要用于记录数据标注和模型预测之间的漏报和误报思想及其源码 提示&#xff1a;以下是本篇文章正文内容&#xff0c;…

UnityRenderStreaming使用记录(四)

测试把UnityRenderStreaming部署在docker&#xff0c;剧透一下&#xff0c;嘎了…… 当然webserver运行的妥妥的 那么打包出的程序运行log Mono path[0] /home/unity/Broadcast/Broadcast_Data/Managed Mono config path /home/unity/Broadcast/Broadcast_Data/MonoBleedingE…

富芮坤FR800X系列之软件开发工具链(如IDE、编译器、调试器等)

文章目录 一、IDE&#xff08;集成开发环境&#xff09;二、编译器三、调试器四、其他辅助工具五、小结 FR800x系列作为一款低功耗蓝牙芯片&#xff0c;其软件开发工具链对于开发者来说至关重要。以下是对FR800x软件开发工具链的详细介绍&#xff0c;包括IDE&#xff08;集成开…

数据赋能电商:API如何助力品牌成长

在数字时代&#xff0c;数据已成为电商品牌发展的核心驱动力。API&#xff08;应用程序编程接口&#xff09;作为数据交互的桥梁&#xff0c;不仅促进了数据的高效流通&#xff0c;更为电商品牌带来了前所未有的增长机遇。本文将深入探讨API如何助力电商品牌实现数据赋能&#…

「Java 数据结构全面解读」:从基础到进阶的实战指南

「Java 数据结构全面解读」&#xff1a;从基础到进阶的实战指南 数据结构是程序设计中的核心部分&#xff0c;用于组织和管理数据。Java 提供了丰富的集合框架和工具类&#xff0c;涵盖了常见的数据结构如数组、链表、栈、队列和树等。本文将系统性地介绍这些数据结构的概念、…

LeetCode - 初级算法 数组(旋转数组)

旋转数组 这篇文章讨论如何通过编程实现数组元素的旋转操作。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例: 输入: nums = [1,2,3,

记一次网闸部署经历

1.在成功获取某大厂伟思网闸设备&#xff0c;并与客户就现有网络架构&#xff08;包括防火墙与交换机&#xff09;进行了详尽的沟通与评估后&#xff0c;我们团队精心构思并提出了一个创新的实施方案——采用透明网桥模式。这一模式以其独特的优势&#xff0c;即无需对客户现有…

SpringCloud(一)--SpringCloud简介

一. 引言 ​ 在微服务架构日益盛行的今天&#xff0c;Spring Cloud凭借其简单易用、功能强大的特性&#xff0c;成为了众多开发者的首选。本文仅为学习所用&#xff0c;联系侵删。 二. SpringCloud概述 2.1 定义 ​ Spring Cloud是一系列框架的有序集合&#xff0c;它巧妙地…