前言
@Convert屬性轉換器用於數據庫屬性類型與java存儲的類型做轉換,其方便之處在於存儲與讀取的時候能自動轉換,如下業務場景:
業務對象存在一個Map或List屬性,存入數據庫時需保存為json字符串,返回前端時以對象來返回。
@Convert屬性轉換器需實現AttributeConverter<X, Y>接口,第一個泛型類型為Entity字段類型,第二個泛型類型為數據庫字段類型。
具體實現
Map與JSON的屬性轉換器
- MapAndJson.java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import javax.persistence.AttributeConverter;
import java.util.HashMap;
import java.util.Map;
/**
* @Description Map與JSON映射轉換器
* @author coisini
* @date Aug 16, 2021
* @Version 1.0
*/
public class MapAndJson implements AttributeConverter<Map<String, Object>, String> {
@Autowired
private ObjectMapper mapper;
/**
* 轉換成數據庫字段
* @param stringObjectMap
* @return
*/
@Override
public String convertToDatabaseColumn(Map<String, Object> stringObjectMap) {
try {
return mapper.writeValueAsString(stringObjectMap);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
/**
* 轉換成實體字段
* @param s
* @return
*/
@Override
@SuppressWarnings("unchecked")
public Map<String, Object> convertToEntityAttribute(String s) {
try {
return mapper.readValue(s, HashMap.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
List與JSON屬性轉換器
- ListAndJson.java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import javax.persistence.AttributeConverter;
import java.util.List;
/**
* @Description List與JSON 映射轉換器
* @author coisini
* @date Aug 16, 2021
* @Version 1.0
*/
public class ListAndJson implements AttributeConverter<List<Object>, String> {
@Autowired
private ObjectMapper mapper;
@Override
public String convertToDatabaseColumn(List<Object> objects) {
try {
return mapper.writeValueAsString(objects);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
@Override
@SuppressWarnings("unchecked")
public List<Object> convertToEntityAttribute(String s) {
try {
return mapper.readValue(s, List.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
實體應用
@Convert(converter = MapAndJson.class)
private Map<String, Object> test;
@Convert(converter = ListAndJson.class)
private List<Object> specs;
效果圖
- 數據庫
- 前端返回數據
