欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 【Mybatis-Plus】PostgreSQL之JSONB自动映射对象

【Mybatis-Plus】PostgreSQL之JSONB自动映射对象

2025/7/9 11:04:04 来源:https://blog.csdn.net/friendlytkyj/article/details/140513729  浏览:    关键词:【Mybatis-Plus】PostgreSQL之JSONB自动映射对象

开发TypeHandler

如果数据库字段是字符类型,可以直接使用Mybatis-Plus内置的JacksonTypeHandler,如果是像PostgreSQL数据库的JSONB类型,则需要自定义开发一个TypeHandler,可以继承JacksonTypeHandler,然后覆写父类的方法,代码如下:

/*** PostgreSQL数据库中的JSON、JSONB字段类型的映射** @author tangheng*/
@MappedTypes({Object.class})
@MappedJdbcTypes(JdbcType.OTHER)//JSONB对应JdbcType.OTHER
public class JsonbTypeHandler extends JacksonTypeHandler {private static final PGobject jsonObject = new PGobject();private static final String JSONB = "jsonb";private static final String JSON = "json";public JsonbTypeHandler(Class<?> type) {super(type);}/**写数据库时,把java对象转成JSONB类型*/@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {if (ps != null) {jsonObject.setType(JSONB);jsonObject.setValue(toJson(parameter));ps.setObject(i, jsonObject);}}/**读数据时,把JSONB类型的字段转成java对象*/@Overridepublic Object getNullableResult(ResultSet rs, String columnName) throws SQLException {Object v = rs.getObject(columnName);return convertDbToJavaObject(v);}/**读数据时,把JSONB类型的字段转成java对象*/@Overridepublic Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {Object v = rs.getObject(columnIndex);return convertDbToJavaObject(v);}/**读数据时,把JSONB类型的字段转成java对象*/@Overridepublic Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {Object v = cs.getObject(columnIndex);return convertDbToJavaObject(v);}/**读数据时,把JSONB类型的字段转成java对象*/private Object convertDbToJavaObject(Object v) {if(Objects.isNull(v)) {return v;}if (!PGobject.class.isAssignableFrom(v.getClass())) {return v;}PGobject p = (PGobject) v;if(!StringUtils.equalsAnyIgnoreCase(p.getType(), JSONB, JSON)) {return v;}String pv = p.getValue();if(StringUtils.isBlank(pv)) {return v;}return parse(p.getValue());}
}

使用TypeHandler

  • 在库表实体类上加的@TableName的注解,设置autoResultMap属性
  • @TableField注解指定typeHandler
@TableName(value = "t_user", autoResultMap = true)
public class UserPo {@TableField(value = "user_jobs", typeHandler = JsonbTypeHandler.class)private List<UserJob> userJobs;@NoArgsConstructor@AllArgsConstructor@Datapublic static class UserJob {private String id;private String name;}
}

总结

  • 使用JacksonTypeHandler可以帮开发者自动处理json格式与java对象之间的映射关系,不需要每次手动做序列化和反序列化的工作了。
  • 如果使用的数据库有自己特有的字段类型,也可以自定义开发一个TypeHandler,达到自动转换的目的。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词