使用mybatis中的自定义TypeHandler处理PostgreSQL中的Json类型
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类型相关推荐
- python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体、自定义设置图像标题使用的字体类型
python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体.自定义设置图像标题使用的字体类型 目录
- 【Mybatis】SpringBoot 自定义TypeHandler 完整步骤
1 注解的使用 import org.apache.ibatis.annotations.*; import org.apache.ibatis.type.JdbcType; import org.s ...
- html控制多个音频audio css,vue中audio自定义样式(页面中包含多个audio)
前言 一开始看到UI设计稿,我内心是十分抗拒的.觉得用原生audio的样式就可以了,也不是特别丑,毕竟时间给的不多,自定义样式还要改逻辑啥的.在网上搜索了一番有没有合适的插件,没有看到心动的.最后还是 ...
- WPF学习笔记(7):DataGrid中数字自定义格式显示
WPF学习笔记(7):DataGrid中数字自定义格式显示 原文:WPF学习笔记(7):DataGrid中数字自定义格式显示 DataGrid中数据显示如下图,数据格式比较杂乱.希望达到以下要求:(1 ...
- Jenkins Pipeline中的自定义环境变量
Jenkins Pipeline中的自定义环境变量 Jenkins中自带很多的环境变量,这些大部分都是构建相关的值,可以在网页localhost:8080/env-vars.html/里面查看.这些是 ...
- Oracle、Postgresql 中round函数的用法说明
首先我们来说下这个Oracle中的round函数 Oracle round 函数的意思是四舍五入的方法,即传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果,参数 number 是指需要 ...
- matlab中m文件是什么,MATLAB中M文件的使用
运行方法: 使用matlab的时候,可以在"Command Window"内直接书写matlab代码,也可以将代码保存到M文件中,然后运行该文件.使用matlab主界面菜单&quo ...
- MyBatis 自定义 typeHandler
自定义typeHandler 对于自定义typeHandler来说,需要在配置文件中注册typeHandlers 然后需要实现TypeHandler接口, 一个例子 首先编写调度的处理类 packag ...
- Mybatis实现自定义TypeHandler
本文主要记录学习mybatis自定义TypeHandler实例. 本实例是java中的List类型的数据存入数据库转为varchar类型 首先是POJO的内容如下 public class Hobby ...
最新文章
- java servletconfig_ServletConfig中的方法
- mysql约束sex_MySQL笔记--约束
- js设置奇偶行数样式
- jax-rs jax-ws_使用JAX-RS的HTTP缓存
- FirefoxOS 1.2 on ZTE Open
- Linux 下,系统时间毫秒级命名文件
- windows11 - 快速实现局域网内传文件
- linux下数学公式的编辑器,Linux下的公式编辑器——libreoffice math 使用快速入门
- 傻瓜式安装卸载office
- AUTOCAD--实时缩放
- 联想z400成功带起外置显卡gtx1050
- linux 虚拟钢琴,Virtual MIDI Piano Keyboard下载-虚拟MIDI钢琴键盘 v0.8.0 官方版 - 安下载...
- int / long / long int / long long / long long int
- 完美解决迅雷极速版强制升级到迅雷X
- streaing-kafka
- 使用universalimageloader实现viewpager加载网络图片轮显
- 连接已失效_电信运营商物联网连接管理平台的研究及对比分析
- C练题笔记之:Leetcode-1455. 检查单词是否为句中其他单词的前缀
- Lesson 47 A cup of coffee 一杯咖啡
- 前端布局flex从入门到入土
热门文章
- easypoi list中的map导出_Java中的集合类(List,Set.Map)
- 过河问题matlab建模,matlab三对夫妻过河问题
- python序列类型唯一的映射类型_python2.x学习笔记(8)-映射和集合类型
- matlab超出矩阵索引维度_搜你想看“头条搜索”网页版上线 搜索引擎迎来新玩家...
- linux的memmap函数_linux /proc下的statm、maps、memmap 内存信息文件分析
- Mongo服务器二进制文件修复,Mongodb-File-Server
- android 一个activity定时更新另一个activity的UI
- 为什么有时打不开爬取到的图片
- 博士申请 | 佐治亚理工学院陈永昕教授招收机器学习理论方向博士生
- 博士申请 | 北京大学信息科学技术学院段凌宇教授招收2022级博士生