在現代 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 和分頁等功能提供一些實用的思路與技術方案。如果你有任何問題或建議,歡迎留言討論,我們一起探索更好的開發方式。