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

Spring?JPA的實(shí)體屬性類型轉(zhuǎn)換器并反序列化工具類詳解

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

一、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的屬性轉(zhuǎn)換

創(chuàng)建一個(gè)轉(zhuǎn)換類

實(shí)現(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;
// 第一個(gè)泛型類型就是  entity字段的類型 
// json沒有類型,對(duì)應(yīng)在JAVA中就是String類型
// 第二個(gè)泛型類型就是  數(shù)據(jù)庫字段的類型
@Converter
public class MapAndJson implements AttributeConverter<Map<String, Object>, String> {
    /*
    ObjectMapper類是Jackson庫的主要類,它提供一些功能將數(shù)據(jù)集或?qū)ο筠D(zhuǎn)換的實(shí)現(xiàn)。
    它將使用JsonParser和JsonGenerator實(shí)例來實(shí)現(xiàn)JSON的實(shí)際讀/寫。
    */
    @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);
        }
    }
}

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

具體轉(zhuǎn)換需要自己實(shí)現(xiàn),調(diào)用SpringBoot提供的Jackson的內(nèi)置庫。

ObjectMapper類是Jackson庫的主要類,它提供一些功能將數(shù)據(jù)集或?qū)ο筠D(zhuǎn)換的實(shí)現(xiàn)。

在類上打上注解@Converter,做為轉(zhuǎn)換類的標(biāo)識(shí)。

只需在模型類上加個(gè)注解就能完成自動(dòng)轉(zhuǎn)換

指明轉(zhuǎn)換類

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

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

二、封裝反序列化工具類

數(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實(shí)體類 

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

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

模仿JPA的AttributeConverter接口封裝兩個(gè)方法。

希望轉(zhuǎn)換為實(shí)體類的本類型,因?yàn)槟J(rèn)將json數(shù)據(jù)轉(zhuǎn)換為LinkHashMap類型。

通用的轉(zhuǎn)換類,轉(zhuǎn)換為本類。

//反序列化工具類
@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);
        }
    }
}

如何調(diào)用自定義的轉(zhuǎn)換器

在實(shí)體類中,可以通過重寫getter、setter方法,自己實(shí)現(xiàn)想要轉(zhuǎn)換的數(shù)據(jù)結(jié)構(gòu)(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);
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入解析Java中反射中的invoke()方法

    深入解析Java中反射中的invoke()方法

    最近復(fù)習(xí)了一下Java反射的使用,正好了解一下Java中反射中的invoke()方法,稍微整理精簡一下做下分享,感興趣的可以了解一下
    2021-06-06
  • Java如何實(shí)現(xiàn)通過鍵盤輸入一個(gè)數(shù)組

    Java如何實(shí)現(xiàn)通過鍵盤輸入一個(gè)數(shù)組

    這篇文章主要介紹了Java實(shí)現(xiàn)通過鍵盤輸入一個(gè)數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java?Spring的使用注解開發(fā)詳解

    Java?Spring的使用注解開發(fā)詳解

    這篇文章主要為大家介紹了Java?Spring注解開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • SpringBoot中的YAML配置文件和日志詳解

    SpringBoot中的YAML配置文件和日志詳解

    這篇文章主要介紹了SpringBoot中的YAML配置文件和日志的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • Java劍指offer之刪除鏈表的節(jié)點(diǎn)

    Java劍指offer之刪除鏈表的節(jié)點(diǎn)

    這篇文章主要介紹了Java劍指offer之刪除鏈表的節(jié)點(diǎn),給定單向鏈表的頭指針和一個(gè)要?jiǎng)h除的節(jié)點(diǎn)的值,定義一個(gè)函數(shù)刪除該節(jié)點(diǎn)。返回刪除后的鏈表的頭節(jié)點(diǎn),下文更多相關(guān)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-04-04
  • StringUtils中的isEmpty、isNotEmpty、isBlank和isNotBlank的區(qū)別詳解

    StringUtils中的isEmpty、isNotEmpty、isBlank和isNotBlank的區(qū)別詳解

    這篇文章主要介紹了StringUtils中的isEmpty、isNotEmpty、isBlank和isNotBlank的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java &與&&的區(qū)別及實(shí)例

    java &與&&的區(qū)別及實(shí)例

    這篇文章主要介紹了java &與&&的區(qū)別的相關(guān)資料,并附簡單實(shí)例,幫助大家學(xué)習(xí)理解這部分知識(shí),需要的朋友可以參考下
    2016-10-10
  • java刪除文件和文件夾具體實(shí)現(xiàn)

    java刪除文件和文件夾具體實(shí)現(xiàn)

    這篇文章介紹了java刪除文件和文件夾具體實(shí)現(xiàn),有需要的朋友可以參考一下
    2013-10-10
  • Java后端Cookie實(shí)現(xiàn)(時(shí)間戳)代碼實(shí)例

    Java后端Cookie實(shí)現(xiàn)(時(shí)間戳)代碼實(shí)例

    這篇文章主要介紹了Java后端Cookie實(shí)現(xiàn)(時(shí)間戳)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • springboot 使用logback啟動(dòng)報(bào)警報(bào)錯(cuò)的解決

    springboot 使用logback啟動(dòng)報(bào)警報(bào)錯(cuò)的解決

    這篇文章主要介紹了springboot 使用logback啟動(dòng)報(bào)警報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論

从江县| 宁陵县| 宁晋县| 五大连池市| 西乡县| 临泽县| 唐海县| 唐海县| 西畴县| 自治县| 苏尼特左旗| 沧源| 宜兴市| 赤峰市| 乐陵市| 始兴县| 厦门市| 牡丹江市| 阳春市| 柞水县| 罗甸县| 华宁县| 晴隆县| 乡宁县| 岢岚县| 盐津县| 韶山市| 淳化县| 孝义市| 肥乡县| 天柱县| 德阳市| 吉林省| 吴堡县| 会泽县| 满洲里市| 壤塘县| 万年县| 疏勒县| 色达县| 广水市|