欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?JPA的實體屬性類型轉換器并反序列化工具類詳解

 更新時間:2022年02月23日 08:44:04   作者:Y7000也拯救不了我  
這篇文章主要介紹了Spring?JPA的實體屬性類型轉換器并反序列化工具類詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、JPA 單體JSON與Map的映射

數(shù)據(jù)庫中test字段為json類型

{"key": "顏色", "value": "深白色", "key_id": 1, "value_id": 3}

模型中test字段為Map類型

private Map<String,Object> test;

問題:如何將數(shù)據(jù)庫字段的值映射到模型中,要用到JPA的屬性轉換

創(chuàng)建一個轉換類

實現(xiàn)AttributeConverter接口

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lin.missyou.exception.http.ServerErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import javax.persistence.AttributeConverter;
import javax.persistence.Convert;
import javax.persistence.Converter;
import java.util.HashMap;
import java.util.Map;
// 第一個泛型類型就是  entity字段的類型 
// json沒有類型,對應在JAVA中就是String類型
// 第二個泛型類型就是  數(shù)據(jù)庫字段的類型
@Converter
public class MapAndJson implements AttributeConverter<Map<String, Object>, String> {
    /*
    ObjectMapper類是Jackson庫的主要類,它提供一些功能將數(shù)據(jù)集或對象轉換的實現(xiàn)。
    它將使用JsonParser和JsonGenerator實例來實現(xiàn)JSON的實際讀/寫。
    */
    @Autowired
    private ObjectMapper mapper;
    @Override
    public String convertToDatabaseColumn(Map<String, Object> map) {
        try {
            return mapper.writeValueAsString(map);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ServerErrorException(99999);
        }
    }
    @Override
    @SuppressWarnings("unchecked")
    public Map<String, Object> convertToEntityAttribute(String s) {
        try {
        	if (s == null) return null;
            return mapper.readValue(s, HashMap.class);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ServerErrorException(9999);
        }
    }
}

看到接口的方法名,就知道能做什么了。

具體轉換需要自己實現(xiàn),調用SpringBoot提供的Jackson的內置庫。

ObjectMapper類是Jackson庫的主要類,它提供一些功能將數(shù)據(jù)集或對象轉換的實現(xiàn)。

在類上打上注解@Converter,做為轉換類的標識。

只需在模型類上加個注解就能完成自動轉換

指明轉換類

@Convert(converter = MapAndJson.class)
private Map<String,Object> test;

其他類型轉換的操作基本一致,只需要修改類型等局部代碼。

二、封裝反序列化工具類

數(shù)據(jù)庫中specs字段為json類型

[{"key": "顏色", "value": "深白色", "key_id": 1, "value_id": 3}, {"key": "尺寸", "value": "4.3英寸", "key_id": 2, "value_id": 7}]

模型中specs字段為String類型

建立Spec實體類 

@Getter
@Setter
public class Spec {
    private Long keyId;
    private String key;
    private Long valueId;
    private String value;
}

利用JPA的AttributeConverter接口實現(xiàn)屬性轉換過于局限

模仿JPA的AttributeConverter接口封裝兩個方法。

希望轉換為實體類的本類型,因為默認將json數(shù)據(jù)轉換為LinkHashMap類型。

通用的轉換類,轉換為本類。

//反序列化工具類
@Component
public class GenericAndJson {
    private static ObjectMapper mapper;
//將ObjectMapper注入到方法里,再通過方法賦值到成員變量上
    @Autowired
    public void setMapper(ObjectMapper mapper) {
        GenericAndJson.mapper = mapper;
    }
    public static <T> String objectToJson(T o) {
        try {
            return GenericAndJson.mapper.writeValueAsString(o);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ServerErrorException(99999);
        }
    }
    public static <T> T jsonToObject(String s, TypeReference<T> typeReference) {
        if (s == null) return null;
        try {
            return GenericAndJson.mapper.readValue(s, typeReference);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ServerErrorException(9999);
        }
    }
}

如何調用自定義的轉換器

在實體類中,可以通過重寫getter、setter方法,自己實現(xiàn)想要轉換的數(shù)據(jù)結構(List),本且能夠得到本類(Spec)。 

private String specs;
public List<Spec> getSpecs() {
? ? if (specs == null) return Collections.emptyList();
? ? return GenericAndJson.jsonToObject(this.specs, new TypeReference<List<Spec>>() {});
}
public void setSpecs(List<Spec> specs) {
? ? if (specs.isEmpty()) return;
? ? this.specs = GenericAndJson.objectToJson(specs);
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 基于Mybatis實現(xiàn)CRUD操作過程解析(xml方式)

    基于Mybatis實現(xiàn)CRUD操作過程解析(xml方式)

    這篇文章主要介紹了基于Mybatis實現(xiàn)CRUD操作過程解析(xml方式),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • MybatisPlus多數(shù)據(jù)源及事務解決思路

    MybatisPlus多數(shù)據(jù)源及事務解決思路

    這篇文章主要介紹了MybatisPlus多數(shù)據(jù)源及事務解決思路,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot中使用Thymeleaf模板詳情

    SpringBoot中使用Thymeleaf模板詳情

    這篇文章主要介紹了SpringBoot中使用Thymeleaf模板詳情,hymeleaf是適用于Web和獨立環(huán)境的現(xiàn)代服務器端Java模板引擎,能夠處理HTML,XML,JavaScript,CSS甚至純文本,下文更多相關資料介紹需要的小伙伴可以參考一下
    2022-04-04
  • 一個簡易的Java多頁面隊列爬蟲程序

    一個簡易的Java多頁面隊列爬蟲程序

    這篇文章主要為大家詳細介紹了一個多頁面的java爬蟲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 解決定時任務@Scheduled沒有準時執(zhí)行的原因及分析

    解決定時任務@Scheduled沒有準時執(zhí)行的原因及分析

    這篇文章主要介紹了解決定時任務@Scheduled沒有準時執(zhí)行的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 解讀httpclient的validateAfterInactivity連接池狀態(tài)檢測

    解讀httpclient的validateAfterInactivity連接池狀態(tài)檢測

    這篇文章主要為大家介紹了httpclient的validateAfterInactivity連接池狀態(tài)檢測解讀*,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • java動態(tài)代理和cglib動態(tài)代理示例分享

    java動態(tài)代理和cglib動態(tài)代理示例分享

    這篇文章主要介紹了java動態(tài)代理和cglib動態(tài)代理示例,JDK1.3之后,Java提供了動態(tài)代理的技術,允許開發(fā)者在運行期間創(chuàng)建接口的代理實例,下面我們使用示例學習一下
    2014-03-03
  • java之Thread不捕獲異常默認處理邏輯

    java之Thread不捕獲異常默認處理邏輯

    這篇文章主要介紹了java之Thread不捕獲異常默認處理邏輯,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步

    Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步

    這篇文章主要為大家介紹了Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Java收集的雪花算法代碼詳解

    Java收集的雪花算法代碼詳解

    這篇文章主要介紹了Java實現(xiàn)雪花算法的詳細代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-10-10

最新評論