开发过程中我们可能会遇到这样的问题。如何将一个Map<String,String>(一个Object)保存到数据库中,很多人的第一想法是这个简单。只要我们持久化的时候将这个Map转换成一个JSON以String的形式保存即可。
今天我们换一个新的方式去实现这个功能:
首先我们要了解一个东西AttributeConverters
属性转换器
第一步:实现一个AttributeConverters<X,Y>
X - 实体属性的类型
Y - 数据库列的类型
重写AttributeConverter
的两个方法
convertToDatabaseColumn(X attribute)
将存储在entity属性中的值转换为要存储在数据库中的数据表示形式的值。
convertToEntityAttribute(Y dbData)
将存储在数据库列中的数据转换为要存储在entity属性中的值。
@Converter
public class MapConverter implements AttributeConverter<Map, String> {
@Override
public String convertToDatabaseColumn(Map map) {
if (map == null) {
return "";
}
return JSONObject.toJSONString(map);
}
@Override
public Map convertToEntityAttribute(String s) {
if (s != null && !s.equals("")) {
return JSONObject.parseObject(s, Map.class);
}
return new HashMap();
}
}
第二部:entity实体
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@Lob
@Convert(converter = MapConverter.class)
private Map<String,String> maps;
}
保存到数据库中数据如下: