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.pswp.cn/web/64865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64865.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲引擎學習第69天

回顧碰撞響應時我們停留的位置 從昨天的討論開始&#xff0c;我們正準備處理碰撞響應的復雜性。具體來說&#xff0c;我們討論的是&#xff0c;當兩個實體在屏幕上發生碰撞時&#xff0c;如何回應這種情況。碰撞本身并不復雜&#xff0c;但要處理其后的反應和規則則更具挑戰性…

【Linux】信號處理

一、Linux系統信號 1、常見的系統信號 常見的Linux系統信號 信號值描述1SIGHUP掛起&#xff08;hang up&#xff09;進程2SIGINT中斷進&#xff08;interrupt&#xff09;程3SIGQUIT停止&#xff08;stop&#xff09;進程9SIGKILL無條件終止&#xff08;terminate&#xff09;…

開源模型應用落地-qwen2-7b-instruct-LoRA微調-Axolotl-單機多卡-RTX 4090雙卡(七)

一、前言 本篇文章將使用Axolotl去高效微調QWen2系列模型,通過閱讀本文,您將能夠更好地掌握這些關鍵技術,理解其中的關鍵技術要點,并應用于自己的項目中。 二、術語介紹 2.1. LoRA微調 LoRA (Low-Rank Adaptation) 用于微調大型語言模型 (LLM)。 是一種有效的自適應策略,…

數據結構與算法學習筆記----快速冪

數據結構與算法學習筆記----快速冪 author: 明月清了個風 first publish time: 2025.1.2 ps??快速冪的兩道模版題&#xff0c;快速冪&#xff0c;乘法逆元&#xff0c;費馬小定理 Acwing 875. 快速冪 [原題鏈接](875. 快速冪 - AcWing題庫) 給定 n n n組 a i , b i , p i…

爬蟲代碼中如何添加異常處理?

在編寫爬蟲代碼時&#xff0c;添加異常處理是非常重要的一步&#xff0c;因為它可以幫助我們處理網絡請求中可能出現的各種問題&#xff0c;比如網絡連接錯誤、超時、解析錯誤等。以下是如何在Python爬蟲代碼中添加異常處理的示例&#xff1a; import requests from bs4 impor…

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模式中的第二層…

Tailwind CSS 實戰:表單設計與驗證實現

在 Web 開發中,表單就像是一位盡職的接待員,負責收集和驗證用戶的輸入信息。記得在一個企業級項目中,我們通過重新設計表單交互流程,將表單的完成率提升了 42%。今天,我想和大家分享如何使用 Tailwind CSS 打造一個既美觀又實用的表單系統。 設計理念 設計表單就像是在設計一…

信息系統項目管理師——第8章章 項目整合管理 筆記

8 項目整合管理&#xff08;最后反過來看&#xff09; 項目整合過程&#xff1a;①制定項目章程&#xff08;啟動過程&#xff09;、②制訂項目管理計劃&#xff08;規劃過程&#xff09;、③指導和管理項目工作、管理項目知識&#xff08;執行過程&#xff09;、④監控項目工…

MLP、CNN、Transformer 的區別解析

親愛的小伙伴們&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你對深度學習的奧秘、Java 與 Python 的奇妙世界&#xff0c;亦或是讀研論文的撰寫攻略有所探尋&#x1f9d0;&#xff0c;那不妨給我一個小小的關注吧&#x1f970;。我會精心籌備&#xff0c;在未來…

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…