当前位置: 首页 > news >正文

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

新建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;}
http://www.agseo.cn/news/186/

相关文章:

  • katalon常用定位元素Xpath合集
  • 【项目实战】基于Hi3861的鸿蒙智能小车(循迹、超声波避障、远程控制、语音控制、4G定位)有教程代码
  • (期望)名字(name)
  • 新手小白如何快速入门PostgreSQL
  • Day03 课程
  • MathType7下载安装2025最新下载+安装+教程(附安装包)
  • Linux Strace 系统调用工具详解与企业应用
  • 想进大厂?从学习圈子里的“管理术语”开始
  • 配电网二进制粒子群重构(BPSO)
  • 模板 AE PR 达芬奇 剪影
  • 如何自动删除重复执行的任务?
  • 开始更新第一篇
  • springboot~SpringData自定义Repository的正确方式
  • Agisoft Metashape Professional 2.2.2.21069 多视点三维建模设计
  • Linux之进程状态
  • 2. O(NlogN)的排序
  • 【Python】使用matplotlib绘图,显示中文字符。
  • React-手写支持多文件、并行上传、串行上传、分片上传、单文件上传、失败自动重试、自动上传/手动按钮上传切换
  • Linux服务器中代码仓库(gitea+drone)搭建
  • 二分查找
  • postcss-px-to-viewport-8-plugin无法转换tailwindcss样式问题
  • html中的latex数据公式展示
  • IK Multimedia TONEX MAX 1.10.2 逼真音色建模
  • 重塑云上 AI 应用“运行时”,函数计算进化之路
  • 82、SpringMVC 参数传递,浏览器和服务器之间的数据传输
  • 问卷调查数据库设计
  • Linux 系统调用详解与工作机制
  • 一客一策:Data Agent 如何重构大模型时代的智能营销?
  • MySQL函数
  • The 2025 Sichuan Provincial Collegiate Programming Contest