在 PostgreSQL 中使用 JSONB 类型并结合 MyBatis-Plus 实现自动注入,主要有以下几种方案:
1. 创建 JSONB TypeHandler
java
@MappedTypes({Map.class, List.class, Object.class})
@MappedJdbcTypes(JdbcType.OTHER)
public class JsonbTypeHandler extends BaseTypeHandler<Object> {
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
Object parameter, JdbcType jdbcType)
throws SQLException {
try {
String json = objectMapper.writeValueAsString(parameter);
ps.setObject(i, json, Types.OTHER);
} catch (JsonProcessingException e) {
throw new SQLException("JSON转换失败", e);
}
}
@Override
public Object getNullableResult(ResultSet rs, String columnName)
throws SQLException {
String json = rs.getString(columnName);
return parseJson(json);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
String json = rs.getString(columnIndex);
return parseJson(json);
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String json = cs.getString(columnIndex);
return parseJson(json);
}
private Object parseJson(String json) throws SQLException {
if (StringUtils.isBlank(json)) {
return null;
}
try {
return objectMapper.readValue(json, Object.class);
} catch (Exception e) {
throw new SQLException("JSON解析失败: " + json, e);
}
}
}
2. 实体类配置
java
@Data
@TableName(value = "your_table", autoResultMap = true)
public class YourEntity {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
// 方式1:使用泛型
@TableField(typeHandler = JsonbTypeHandler.class)
private Map<String, Object> attributes;
// 方式2:指定具体类型
@TableField(typeHandler = JsonbTypeHandler.class)
private List<String> tags;
// 方式3:自定义对象
@TableField(typeHandler = JsonbTypeHandler.class)
private Config config;
@TableField(typeHandler = JsonbTypeHandler.class)
private List<Config> configs;
public void setConfigs(List configs) {
if(CollUtil.isEmpty(configs)){
return;
}
Object first = configs.getFirst();
if(first instanceof Map){
this.configs= JSONUtil.toList(JSONUtil.toJsonStr(configs), Config.class);
}
}
}