SpringMVC結合模板模式實現MyBatisPlus傳遞嵌套JSON數據
引出
我們經常會遇到需要傳遞對象的場景。有時候,我們需要將一個對象的數據傳遞給另一個對象進行處理,但是又不希望直接暴露對象的內部結構和實現細節(jié)。這時,我們可以使用模板模式來實現優(yōu)雅的對象傳遞。
為了實現這個場景,我們可以使用模板模式。
模板模式是一種行為設計模式,它定義了一個抽象類或接口作為模板,其中包含了一個或多個抽象方法,用于定義算法的骨架。具體的子類可以根據需要實現這些抽象方法,從而完成算法的定制化。
說說我這邊的起因
大概是這樣的 要做一個問卷系統(tǒng) 這個問卷里面包含各種各樣的標簽和因子 就使得 屬性里面又包含屬性 對象里面又嵌套數組 數組里面又有對象 遇到這種情況相信大家都會很頭疼吧 那這種時候很多人就要開始寫Mapper了 這里我提出一個大大節(jié)約時間的方法 類型構造器
設計模式的引入
我們知道 每一個屬性需要引入一個新的類型構造器 那就要根據他的具體情況重寫一個 那豈不是代碼量指數級上漲?


還有很多...各種嵌套 于是我想 有沒有一種辦法能規(guī)定好所有的嵌套方法的邏輯 然后他們只需要說明自己是什么類型 就能套進去?
有,就是今天要說的模板方法
先定義一個通用的模板
public class JsonArrayHandler<T> extends BaseTypeHandler<List<T>> {
private Class<T> type;
public JsonArrayHandler() {
// 添加無參構造函數
}
public JsonArrayHandler(Class<T> type) {
if (type == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
this.type = type;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, JSONArray.toJSONString(parameter));
}
@Override
public List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String json = rs.getString(columnName);
return parseJsonArray(json);
}
@Override
public List<T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String json = rs.getString(columnIndex);
return parseJsonArray(json);
}
@Override
public List<T> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String json = cs.getString(columnIndex);
return parseJsonArray(json);
}
private List<T> parseJsonArray(String json) {
JSONArray jsonArray = JSONArray.parseArray(json);
return jsonArray.toJavaList(type);
}
}讓我逐點解釋其妙處:
泛型支持:
public class JsonArrayHandler<T> extends BaseTypeHandler<List<T>>中的<T>表示這是一個泛型類,可以適用于不同類型的 JSON 數組字段。通過使用泛型,可以在運行時指定具體的類型,使得處理不同類型的 JSON 數組變得更加靈活和通用。構造函數重載:
public JsonArrayHandler()是一個無參構造函數,而public JsonArrayHandler(Class<T> type)是一個有參構造函數。通過提供兩個構造函數,可以靈活地創(chuàng)建JsonArrayHandler的實例。無參構造函數用于在不知道具體類型時創(chuàng)建實例,而有參構造函數用于在已知類型時創(chuàng)建實例。參數設置:
setNonNullParameter方法用于將 Java 對象轉換為存儲在數據庫中的 JSON 字符串。在這里,使用了阿里巴巴的 FastJSON 庫將 List<T> 對象轉換為 JSON 字符串,并將其設置到 PreparedStatement 對象中。結果獲?。?code>getNullableResult 方法用于從數據庫中獲取 JSON 字符串,并將其轉換回 List<T> 對象。在這里,使用了 FastJSON 庫將 JSON 字符串解析為 JSONArray,然后將其轉換為 List<T> 對象。
有了這一個模板 那么剩下來的就是 直接使用他!
這里淺淺給出我業(yè)務中的6個例子
- 商品分類:數據庫中的
category_ids字段存儲了商品所屬的分類列表。使用自定義 TypeHandler,可以將 Java 對象的 List<Category> 直接映射到數據庫的 JSON 字符串,并在讀取時將 JSON 字符串轉換回 List<Category>。
public class CategoryHandler extends JsonArrayHandler<Category> {
public CategoryHandler() {
super(Category.class);
}
}- 用戶角色:數據庫中的
role_ids字段存儲了用戶所擁有的角色列表。使用自定義 TypeHandler,可以將 Java 對象的 List<Role> 直接映射到數據庫的 JSON 字符串,并在讀取時將 JSON 字符串轉換回 List<Role>。
public class RoleHandler extends JsonArrayHandler<Role> {
public RoleHandler() {
super(Role.class);
}
}- 訂單商品列表:數據庫中的
order_items字段存儲了訂單中的商品列表。使用自定義 TypeHandler,可以將 Java 對象的 List<OrderItem> 直接映射到數據庫的 JSON 字符串,并在讀取時將 JSON 字符串轉換回 List<OrderItem>。
public class OrderItemHandler extends JsonArrayHandler<OrderItem> {
public OrderItemHandler() {
super(OrderItem.class);
}
}- 圖片列表:數據庫中的
image_urls字段存儲了一組圖片的 URL 列表。使用自定義 TypeHandler,可以將 Java 對象的 List<String> 直接映射到數據庫的 JSON 字符串,并在讀取時將 JSON 字符串轉換回 List<String>。
public class ImageHandler extends JsonArrayHandler<String> {
public ImageHandler() {
super(String.class);
}
}- 標簽列表:數據庫中的
tags字段存儲了一組標簽。使用自定義 TypeHandler,可以將 Java 對象的 List<Tag> 直接映射到數據庫的 JSON 字符串,并在讀取時將 JSON 字符串轉換回 List<Tag>。
public class TagHandler extends JsonArrayHandler<Tag> {
public TagHandler() {
super(Tag.class);
}
}Answer類是一個答案類,包含了答案內容answer和分數score兩個字段。Questionnaire類是一個問卷調查類,其中包含了一些字段,包括主鍵id、問題編號qid、答案answer、問題名稱qname、問題描述question、標簽tab、ans。在ans字段上,使用了@TableField注解,并設置了typeHandler = AnswerHandler.class,指定了使用AnswerHandler這個自定義的 TypeHandler 來處理該字段。
public AnswerHandler(Class<Answer> type) {
super(Answer.class);
}@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("tb_questionnaire")
public class Questionnaire {
/**
* 主鍵
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private int qid;
private String answer;
private String qname;
private String question;
private String tab;
@TableField(exist = false,typeHandler = AnswerHandler.class)
private List<Answer> ans;
public void setAnswer() {
this.answer = JSONUtil.toJsonStr(ans);
}
public void setAnswerList() {
this.ans = JSONUtil.toList(answer,Answer.class);
answer=null;
}
}查詢
這樣就不用寫復雜的Mapper 和sql語句 也能輕松查詢嵌套的復雜的JSON數據啦

實現效果

這樣就形成了復雜的嵌套的數據的自動構造
以上就是SpringMVC結合模板模式實現MyBatisPlus傳遞嵌套JSON數據的詳細內容,更多關于SpringMVC傳遞嵌套JSON數據的資料請關注腳本之家其它相關文章!
相關文章
eclipse/IDEA配置javafx項目步驟(圖文教程)
這篇文章主要介紹了eclipse/IDEA配置javafx項目步驟(圖文教程),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
java web在高并發(fā)和分布式下實現訂單號生成唯一的解決方案
這篇文章主要介紹了java web在高并發(fā)和分布式下實現訂單號生成唯一的解決方案,需要的朋友可以參考下2017-11-11
SpringMVC 上傳文件 MultipartFile 轉為 File的方法
這篇文章主要介紹了SpringMVC 上傳文件 MultipartFile 轉為 File的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02

