SpringMVC結(jié)合模板模式實現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù)
引出
我們經(jīng)常會遇到需要傳遞對象的場景。有時候,我們需要將一個對象的數(shù)據(jù)傳遞給另一個對象進行處理,但是又不希望直接暴露對象的內(nèi)部結(jié)構(gòu)和實現(xiàn)細節(jié)。這時,我們可以使用模板模式來實現(xiàn)優(yōu)雅的對象傳遞。
為了實現(xiàn)這個場景,我們可以使用模板模式。
模板模式是一種行為設(shè)計模式,它定義了一個抽象類或接口作為模板,其中包含了一個或多個抽象方法,用于定義算法的骨架。具體的子類可以根據(jù)需要實現(xiàn)這些抽象方法,從而完成算法的定制化。
說說我這邊的起因
大概是這樣的 要做一個問卷系統(tǒng) 這個問卷里面包含各種各樣的標簽和因子 就使得 屬性里面又包含屬性 對象里面又嵌套數(shù)組 數(shù)組里面又有對象 遇到這種情況相信大家都會很頭疼吧 那這種時候很多人就要開始寫Mapper了 這里我提出一個大大節(jié)約時間的方法 類型構(gòu)造器
設(shè)計模式的引入
我們知道 每一個屬性需要引入一個新的類型構(gòu)造器 那就要根據(jù)他的具體情況重寫一個 那豈不是代碼量指數(shù)級上漲?
還有很多...各種嵌套 于是我想 有沒有一種辦法能規(guī)定好所有的嵌套方法的邏輯 然后他們只需要說明自己是什么類型 就能套進去?
有,就是今天要說的模板方法
先定義一個通用的模板
public class JsonArrayHandler<T> extends BaseTypeHandler<List<T>> { private Class<T> type; public JsonArrayHandler() { // 添加無參構(gòu)造函數(shù) } 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 數(shù)組字段。通過使用泛型,可以在運行時指定具體的類型,使得處理不同類型的 JSON 數(shù)組變得更加靈活和通用。構(gòu)造函數(shù)重載:
public JsonArrayHandler()
是一個無參構(gòu)造函數(shù),而public JsonArrayHandler(Class<T> type)
是一個有參構(gòu)造函數(shù)。通過提供兩個構(gòu)造函數(shù),可以靈活地創(chuàng)建JsonArrayHandler
的實例。無參構(gòu)造函數(shù)用于在不知道具體類型時創(chuàng)建實例,而有參構(gòu)造函數(shù)用于在已知類型時創(chuàng)建實例。參數(shù)設(shè)置:
setNonNullParameter
方法用于將 Java 對象轉(zhuǎn)換為存儲在數(shù)據(jù)庫中的 JSON 字符串。在這里,使用了阿里巴巴的 FastJSON 庫將 List<T> 對象轉(zhuǎn)換為 JSON 字符串,并將其設(shè)置到 PreparedStatement 對象中。結(jié)果獲?。?code>getNullableResult 方法用于從數(shù)據(jù)庫中獲取 JSON 字符串,并將其轉(zhuǎn)換回 List<T> 對象。在這里,使用了 FastJSON 庫將 JSON 字符串解析為 JSONArray,然后將其轉(zhuǎn)換為 List<T> 對象。
有了這一個模板 那么剩下來的就是 直接使用他!
這里淺淺給出我業(yè)務(wù)中的6個例子
- 商品分類:數(shù)據(jù)庫中的
category_ids
字段存儲了商品所屬的分類列表。使用自定義 TypeHandler,可以將 Java 對象的 List<Category> 直接映射到數(shù)據(jù)庫的 JSON 字符串,并在讀取時將 JSON 字符串轉(zhuǎn)換回 List<Category>。
public class CategoryHandler extends JsonArrayHandler<Category> { public CategoryHandler() { super(Category.class); } }
- 用戶角色:數(shù)據(jù)庫中的
role_ids
字段存儲了用戶所擁有的角色列表。使用自定義 TypeHandler,可以將 Java 對象的 List<Role> 直接映射到數(shù)據(jù)庫的 JSON 字符串,并在讀取時將 JSON 字符串轉(zhuǎn)換回 List<Role>。
public class RoleHandler extends JsonArrayHandler<Role> { public RoleHandler() { super(Role.class); } }
- 訂單商品列表:數(shù)據(jù)庫中的
order_items
字段存儲了訂單中的商品列表。使用自定義 TypeHandler,可以將 Java 對象的 List<OrderItem> 直接映射到數(shù)據(jù)庫的 JSON 字符串,并在讀取時將 JSON 字符串轉(zhuǎn)換回 List<OrderItem>。
public class OrderItemHandler extends JsonArrayHandler<OrderItem> { public OrderItemHandler() { super(OrderItem.class); } }
- 圖片列表:數(shù)據(jù)庫中的
image_urls
字段存儲了一組圖片的 URL 列表。使用自定義 TypeHandler,可以將 Java 對象的 List<String> 直接映射到數(shù)據(jù)庫的 JSON 字符串,并在讀取時將 JSON 字符串轉(zhuǎn)換回 List<String>。
public class ImageHandler extends JsonArrayHandler<String> { public ImageHandler() { super(String.class); } }
- 標簽列表:數(shù)據(jù)庫中的
tags
字段存儲了一組標簽。使用自定義 TypeHandler,可以將 Java 對象的 List<Tag> 直接映射到數(shù)據(jù)庫的 JSON 字符串,并在讀取時將 JSON 字符串轉(zhuǎn)換回 List<Tag>。
public class TagHandler extends JsonArrayHandler<Tag> { public TagHandler() { super(Tag.class); } }
Answer
類是一個答案類,包含了答案內(nèi)容answer
和分數(shù)score
兩個字段。Questionnaire
類是一個問卷調(diào)查類,其中包含了一些字段,包括主鍵id
、問題編號qid
、答案answer
、問題名稱qname
、問題描述question
、標簽tab
、ans
。在ans
字段上,使用了@TableField
注解,并設(shè)置了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; } }
查詢
這樣就不用寫復(fù)雜的Mapper 和sql語句 也能輕松查詢嵌套的復(fù)雜的JSON數(shù)據(jù)啦
實現(xiàn)效果
這樣就形成了復(fù)雜的嵌套的數(shù)據(jù)的自動構(gòu)造
以上就是SpringMVC結(jié)合模板模式實現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù)的詳細內(nèi)容,更多關(guān)于SpringMVC傳遞嵌套JSON數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
eclipse/IDEA配置javafx項目步驟(圖文教程)
這篇文章主要介紹了eclipse/IDEA配置javafx項目步驟(圖文教程),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03java web在高并發(fā)和分布式下實現(xiàn)訂單號生成唯一的解決方案
這篇文章主要介紹了java web在高并發(fā)和分布式下實現(xiàn)訂單號生成唯一的解決方案,需要的朋友可以參考下2017-11-11Mybatis多數(shù)據(jù)源切換實現(xiàn)代碼
這篇文章主要介紹了Mybatis多數(shù)據(jù)源切換實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10SpringBoot接口或方法進行失敗重試的實現(xiàn)方式
為了防止網(wǎng)絡(luò)抖動,影響我們核心接口或方法的成功率,通常我們會對核心方法進行失敗重試,如果我們自己通過for循環(huán)實現(xiàn),會使代碼顯得比較臃腫,所以本文給大家介紹了SpringBoot接口或方法進行失敗重試的實現(xiàn)方式,需要的朋友可以參考下2024-07-07SpringMVC 上傳文件 MultipartFile 轉(zhuǎn)為 File的方法
這篇文章主要介紹了SpringMVC 上傳文件 MultipartFile 轉(zhuǎn)為 File的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02