postgres里的json格式

我们在使用postgres数据库时会使用到json格式来存放一些格式不固定的字段,postgres支持json和jsonb两种格式,两者的区别以后再说,今天说一下结合mybatis的使用方法:

  • 1. typeHandler的实现
    mybatis默认是没有实现json类型字段对应的TypeHandler,所以一般我们需要自定义mybatis的TypeHandler:
    json类型字段对应的TypeHandler的一个简单实现:
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;@MappedTypes({Object.class})
public class JsonTypeHandler extends BaseTypeHandler <Object> {private static final PGobject jsonObject = new PGobject();@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {jsonObject.setType("json");jsonObject.setValue(JsonUtil.toJsonString(o));preparedStatement.setObject(i,jsonObject);}@Overridepublic Object getNullableResult(ResultSet resultSet, String s) throws SQLException {return JsonUtil.fromJson(resultSet.getString(s), Object.class);}@Overridepublic Object getNullableResult(ResultSet resultSet, int i) throws SQLException {return JsonUtil.fromJson(resultSet.getString(i), Object.class);}@Overridepublic Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {return JsonUtil.fromJson(callableStatement.getString(i), Object.class);}
}

jsonb类型字段对应的TypeHandler的一个简单实现:

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;@MappedTypes({Object.class})
public class JsonbTypeHandler extends BaseTypeHandler <Object> {private static final PGobject jsonObject = new PGobject();@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {jsonObject.setType("jsonb");jsonObject.setValue(JsonUtil.toJsonString(o));preparedStatement.setObject(i,jsonObject);}@Overridepublic Object getNullableResult(ResultSet resultSet, String s) throws SQLException {if(null != resultSet.getString(s)){return JsonUtil.fromJson(resultSet.getString(s), Object.class);}return null ;}@Overridepublic Object getNullableResult(ResultSet resultSet, int i) throws SQLException {if(null != resultSet.getString(i)){return JsonUtil.fromJson(resultSet.getString(i), Object.class);}return null ;}@Overridepublic Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {if(null != callableStatement.getString(i)){return JsonUtil.fromJson(callableStatement.getString(i), Object.class);}return null ;}
}
  • 2.mapper.xml文件中的配置
 <resultMap id="BaseResultMap" type="com.jun.test.handler.mapper.entity.EventLog"><id column="uuid" jdbcType="VARCHAR" property="uuid" /><result column="device_name" jdbcType="VARCHAR" property="deviceName" /><result column="status" jdbcType="SMALLINT" property="status" /><result column="extend" jdbcType="OTHER" property="extend" typeHandler="com.jun.test.handler.JsonTypeHandler" />...</resultMap>

注意在insert和update语句等用到json字段的属性都要手动去引用自定义的typeHandler。

<insert id="insert" parameterType="com.jun.test.mapper.entity.EventLog">insert into ec.event_log (uuid,  device_name, resource_name, status, extend)values (#{uuid,jdbcType=VARCHAR},#{deviceName,jdbcType=VARCHAR},  #{status,jdbcType=SMALLINT}, #{extend,jdbcType=OTHER,typeHandler=com.jun.test.handler.JsonTypeHandler})</insert>

想要进行解析时,可以获取到该Object对象后,先转成json字符串,再转成对应的对象,如下:

 Extend extend  = JsonUtil.parser(JsonUtil.toJson(eventLog.getExtend ()), Extend .class);

使用mybatis中的自定义TypeHandler处理PostgreSQL中的Json类型相关推荐

  1. python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体、自定义设置图像标题使用的字体类型

    python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体.自定义设置图像标题使用的字体类型 目录

  2. 【Mybatis】SpringBoot 自定义TypeHandler 完整步骤

    1 注解的使用 import org.apache.ibatis.annotations.*; import org.apache.ibatis.type.JdbcType; import org.s ...

  3. html控制多个音频audio css,vue中audio自定义样式(页面中包含多个audio)

    前言 一开始看到UI设计稿,我内心是十分抗拒的.觉得用原生audio的样式就可以了,也不是特别丑,毕竟时间给的不多,自定义样式还要改逻辑啥的.在网上搜索了一番有没有合适的插件,没有看到心动的.最后还是 ...

  4. WPF学习笔记(7):DataGrid中数字自定义格式显示

    WPF学习笔记(7):DataGrid中数字自定义格式显示 原文:WPF学习笔记(7):DataGrid中数字自定义格式显示 DataGrid中数据显示如下图,数据格式比较杂乱.希望达到以下要求:(1 ...

  5. Jenkins Pipeline中的自定义环境变量

    Jenkins Pipeline中的自定义环境变量 Jenkins中自带很多的环境变量,这些大部分都是构建相关的值,可以在网页localhost:8080/env-vars.html/里面查看.这些是 ...

  6. Oracle、Postgresql 中round函数的用法说明

    首先我们来说下这个Oracle中的round函数 Oracle round 函数的意思是四舍五入的方法,即传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果,参数 number 是指需要 ...

  7. matlab中m文件是什么,MATLAB中M文件的使用

    运行方法: 使用matlab的时候,可以在"Command Window"内直接书写matlab代码,也可以将代码保存到M文件中,然后运行该文件.使用matlab主界面菜单&quo ...

  8. MyBatis 自定义 typeHandler

    自定义typeHandler 对于自定义typeHandler来说,需要在配置文件中注册typeHandlers 然后需要实现TypeHandler接口, 一个例子 首先编写调度的处理类 packag ...

  9. Mybatis实现自定义TypeHandler

    本文主要记录学习mybatis自定义TypeHandler实例. 本实例是java中的List类型的数据存入数据库转为varchar类型 首先是POJO的内容如下 public class Hobby ...

最新文章

  1. java servletconfig_ServletConfig中的方法
  2. mysql约束sex_MySQL笔记--约束
  3. js设置奇偶行数样式
  4. jax-rs jax-ws_使用JAX-RS的HTTP缓存
  5. FirefoxOS 1.2 on ZTE Open
  6. Linux 下,系统时间毫秒级命名文件
  7. windows11 - 快速实现局域网内传文件
  8. linux下数学公式的编辑器,Linux下的公式编辑器——libreoffice math 使用快速入门
  9. 傻瓜式安装卸载office
  10. AUTOCAD--实时缩放
  11. 联想z400成功带起外置显卡gtx1050
  12. linux 虚拟钢琴,Virtual MIDI Piano Keyboard下载-虚拟MIDI钢琴键盘 v0.8.0 官方版 - 安下载...
  13. int / long / long int / long long / long long int
  14. 完美解决迅雷极速版强制升级到迅雷X
  15. streaing-kafka
  16. 使用universalimageloader实现viewpager加载网络图片轮显
  17. 连接已失效_电信运营商物联网连接管理平台的研究及对比分析
  18. C练题笔记之:Leetcode-1455. 检查单词是否为句中其他单词的前缀
  19. Lesson 47 A cup of coffee 一杯咖啡
  20. 前端布局flex从入门到入土

热门文章

  1. easypoi list中的map导出_Java中的集合类(List,Set.Map)
  2. 过河问题matlab建模,matlab三对夫妻过河问题
  3. python序列类型唯一的映射类型_python2.x学习笔记(8)-映射和集合类型
  4. matlab超出矩阵索引维度_搜你想看“头条搜索”网页版上线 搜索引擎迎来新玩家...
  5. linux的memmap函数_linux /proc下的statm、maps、memmap 内存信息文件分析
  6. Mongo服务器二进制文件修复,Mongodb-File-Server
  7. android 一个activity定时更新另一个activity的UI
  8. 为什么有时打不开爬取到的图片
  9. 博士申请 | 佐治亚理工学院陈永昕教授招收机器学习理论方向博士生
  10. 博士申请 | 北京大学信息科学技术学院段凌宇教授招收2022级博士生