尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询

MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询
📅 发布时间:2026/6/18 19:07:28

新建Jsonb处理类

方式 1


/*** PostgreSQL jsonb 数据处理器** @author CoderKK* @date 2025/09/08*/
@MappedTypes({Object.class})
@MappedJdbcTypes(JdbcType.OTHER)//JSONB对应JdbcType.OTHER
public class JsonbTypeHandler extends BaseTypeHandler<Object> {private static final PGobject jsonObject = new PGobject();private static final String JSONB_STR = "jsonb";private static final String JSON_STR = "json";/*** 写数据库时,把Java对象转成JSONB类型*/@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {if (preparedStatement != null) {jsonObject.setType(JSONB_STR);jsonObject.setValue(JSON.toJSONString(o));preparedStatement.setObject(i, jsonObject);}}@Overridepublic Object getNullableResult(ResultSet resultSet, String s) throws SQLException {return JSON.parse(resultSet.getString(s));}@Overridepublic Object getNullableResult(ResultSet resultSet, int i) throws SQLException {return JSON.parse(resultSet.getString(i));}@Overridepublic Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {return JSON.parse(callableStatement.getString(i));}
}

方式 2

/*** PostgreSQL数据库中的JSON、JSONB字段类型的处理程序** @author CoderKK* @date 2025/09/08*/
@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 null;}if (!PGobject.class.isAssignableFrom(v.getClass())) {return v;}PGobject p = (PGobject) v;String type = p.getType();if (type == null) {return v;}if (!JSONB.equalsIgnoreCase(type) && !JSON.equalsIgnoreCase(type)) {return v;}String pv = p.getValue();if (StringUtils.isBlank(pv)) {return v;}try {return parse(pv);} catch (Exception e) {// 根据实际业务需求,可以选择返回null、抛出异常或返回原始值return v;}}}

推荐方式 2 可以兼容所有类型自动转换,其他类型例如数组类型等都可以写自定义转换器实现

PostgreSQL 整数数组类型处理程序

/*** PostgreSQL 整数数组类型处理程序** @author CoderKK* @date 2025/09/08*/
public class IntegerArrayTypeHandler extends BaseTypeHandler<Integer[]> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Integer[] parameter, JdbcType jdbcType) throws SQLException {if (parameter != null && parameter.length > 0) {StringBuilder sb = new StringBuilder("{");for (int j = 0; j < parameter.length; j++) {sb.append(parameter[j]);if (j < parameter.length - 1) {sb.append(",");}}sb.append("}");ps.setString(i, sb.toString());} else {ps.setNull(i, java.sql.Types.VARCHAR);}}@Overridepublic Integer[] getNullableResult(ResultSet rs, String columnName) throws SQLException {String str = rs.getString(columnName);return parseString(str);}@Overridepublic Integer[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String str = rs.getString(columnIndex);return parseString(str);}@Overridepublic Integer[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String str = cs.getString(columnIndex);return parseString(str);}private Integer[] parseString(String str) {if (str == null || !str.startsWith("{") || !str.endsWith("}")) {return null;}// 去掉首尾的大括号String content = str.substring(1, str.length() - 1);if (content.isEmpty()) {return new Integer[0];}String[] parts = content.split(",");Integer[] result = new Integer[parts.length];for (int i = 0; i < parts.length; i++) {result[i] = Integer.parseInt(parts[i]);}return result;}
}

创建实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder(toBuilder = true)
@TableName(value = "t_uz_word_assess", autoResultMap = true)
public class WordAssessPO implements Serializable {/*** 主键ID*/@TableId(type = IdType.AUTO)private Long id;/*** 定位点(x1,x2,y1,y2)*/@TableField(value = "point", typeHandler = IntegerArrayTypeHandler.class)private Integer[] point;/*** 各维度得分*/@TableField(value = "dim_score", typeHandler = JsonbTypeHandler.class)private EvalDim dimScore;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;}

本文来自博客园,作者:Micky233,转载请注明原文链接:https://www.cnblogs.com/geek233/p/19080222

相关新闻

  • Day03 课程
  • 【Python】使用matplotlib绘图,显示中文字符。
  • Linux服务器中代码仓库(gitea+drone)搭建

最新新闻

  • 宁波各区黄金回收测评 鄞州/海曙/江北变现哪家不压价 - 逸程
  • 2026深圳三大商圈黄金回收实测,逸程验金标准统一靠谱 - 逸程
  • K2.5技术解析:动态稀疏注意力与原生多模态架构
  • 2026杭州黄金回收避坑|认准商圈备案认证门店,杜绝虚高引流、到店压价 - 薛定谔的梨花猫
  • 石家庄黄金回收正规军在哪?2026实测门店星级榜,卖金前看一眼 - 奢侈品回收测评
  • 深度学习进阶(三十一)FlashAttention:IO 感知的精确注意力

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号