当前位置: 首页 > 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.gsyq.cn/news/131.html

相关文章:

  • katalon常用定位元素Xpath合集
  • (期望)名字(name)
  • MathType7下载安装2025最新下载+安装+教程(附安装包)
  • 模板 AE PR 达芬奇 剪影
  • 如何自动删除重复执行的任务?
  • 开始更新第一篇
  • springboot~SpringData自定义Repository的正确方式
  • Linux之进程状态
  • 2. O(NlogN)的排序
  • React-手写支持多文件、并行上传、串行上传、分片上传、单文件上传、失败自动重试、自动上传/手动按钮上传切换
  • postcss-px-to-viewport-8-plugin无法转换tailwindcss样式问题
  • 82、SpringMVC 参数传递,浏览器和服务器之间的数据传输
  • 问卷调查数据库设计
  • Linux 系统调用详解与工作机制
  • The 2025 Sichuan Provincial Collegiate Programming Contest
  • 详细介绍:Android 热点开发的相关api总结
  • 十大经典排序算法 - lucky
  • 基于Operator方式和二进制方式部署prometheus环境
  • 27家网省
  • 使用DeepState进行API模糊测试的技术解析(第二部分)
  • Linux 进程管理之软硬限制以及企业应用实践
  • 智能血压计芯片解决方案AI版
  • MySQL约束
  • JDK 24.0.1 下载安装教程与环境配置教程(Windows10/11超详细图文安装步骤)
  • PTA
  • 82、制作座位表
  • 第十天 C#学习事件 021
  • 事半功倍是蠢蛋52 使用docker-compose.override.yml
  • [TJOI2015] 概率论 题解
  • Linux进程与线程