最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC結(jié)合模板模式實現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù)

 更新時間:2024年03月20日 08:41:30   作者:圖靈重生我名蘇澤  
我們經(jīng)常會遇到需要傳遞對象的場景,有時候,我們需要將一個對象的數(shù)據(jù)傳遞給另一個對象進行處理,但是又不希望直接暴露對象的內(nèi)部結(jié)構(gòu)和實現(xiàn)細節(jié),所以本文給大家介紹了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) 這個問卷里面包含各種各樣的標(biāo)簽和因子  就使得 屬性里面又包含屬性 對象里面又嵌套數(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é)果獲取: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);
    }
}
  • 標(biāo)簽列表:數(shù)據(jù)庫中的 tags 字段存儲了一組標(biāo)簽。使用自定義 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 和分?jǐn)?shù) score 兩個字段。Questionnaire 類是一個問卷調(diào)查類,其中包含了一些字段,包括主鍵 id、問題編號 qid、答案 answer、問題名稱 qname、問題描述 question、標(biāo)簽 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)文章

  • 基于Lucene的Java搜索服務(wù)器Elasticsearch安裝使用教程

    基于Lucene的Java搜索服務(wù)器Elasticsearch安裝使用教程

    Elasticsearch也是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,能夠做到實時搜索,且穩(wěn)定、可靠、快速,安裝使用方便,這里我們就來看一下基于Lucene的Java搜索服務(wù)器Elasticsearch安裝使用教程:
    2016-06-06
  • 基于SpringBoot實現(xiàn)自定義插件的流程詳解

    基于SpringBoot實現(xiàn)自定義插件的流程詳解

    在SpringBoot中,插件是一種擴展機制,它可以幫助我們在應(yīng)用程序中快速地添加一些額外的功能,在本文中,我們將介紹如何使用 SpringBoot實現(xiàn)自定義插件,需要的朋友可以參考下
    2023-06-06
  • 一文帶你了解gson如何序列化子類

    一文帶你了解gson如何序列化子類

    這篇文章主要為大家詳細介紹了gson如何序列化子類的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)和借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • SpringBoot多環(huán)境開發(fā)該如何配置

    SpringBoot多環(huán)境開發(fā)該如何配置

    這篇文章主要介紹了 SpringBoot多環(huán)境的開發(fā)配置詳情,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • Java流操作之?dāng)?shù)據(jù)流實例代碼

    Java流操作之?dāng)?shù)據(jù)流實例代碼

    這篇文章主要介紹了Java流操作之?dāng)?shù)據(jù)流實例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 基于Spring Web Jackson對RequestBody反序列化失敗的解決

    基于Spring Web Jackson對RequestBody反序列化失敗的解決

    這篇文章主要介紹了基于Spring Web Jackson對RequestBody反序列化失敗的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java簡單模仿win10計算器

    java簡單模仿win10計算器

    這篇文章主要為大家詳細介紹了java簡單模仿win10計算器de,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Java使用lombok消除冗余代碼的方法步驟

    Java使用lombok消除冗余代碼的方法步驟

    這篇文章主要介紹了Java使用lombok消除冗余代碼的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java實現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實例代碼

    Java實現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實例代碼

    本文主要介紹了Java實現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Maven dependencyManagement元素標(biāo)簽的具體使用

    Maven dependencyManagement元素標(biāo)簽的具體使用

    在Maven中dependencyManagement的作用其實相當(dāng)于一個對所依賴jar包進行版本管理的管理器,本文主要介紹了Maven dependencyManagement元素標(biāo)簽的具體使用,感興趣的可以了解一下
    2024-03-03

最新評論

寿光市| 池州市| 朔州市| 元江| 汽车| 额尔古纳市| 莆田市| 无棣县| 莆田市| 永胜县| 宽城| 西乡县| 扶风县| 确山县| 共和县| 双鸭山市| 海盐县| 皮山县| 遵化市| 环江| 大名县| 信阳市| 扶余县| 盐亭县| 遂宁市| 大埔区| 宁波市| 封丘县| 特克斯县| 南华县| 华蓥市| 南阳市| 高平市| 浮山县| 华坪县| 安多县| 栾城县| 峨眉山市| 新平| 仁寿县| 天水市|