前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自定义 mybatis 的 TypeHandler 处理 PostgreSQL 中 json 类型字段

自定义 mybatis 的 TypeHandler 处理 PostgreSQL 中 json 类型字段

作者头像
北漂的我
发布2019-05-29 10:51:19
5.2K0
发布2019-05-29 10:51:19
举报
文章被收录于专栏:北漂的我北漂的我

1.定义一个 JsonTypeHandler 进行处理

代码语言:javascript
复制
package com.codingos.springboot.util;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;

import net.sf.json.util.JSONUtils;

@MappedTypes({Object.class})
public class JsonTypeHandler extends BaseTypeHandler<Object> {
    
    private static final PGobject pgObject = new PGobject();

    @Override
    public Object getNullableResult(ResultSet resultSet, String columnLabel) throws SQLException {
        return resultSet.getString(columnLabel);
    }

    @Override
    public Object getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
        return resultSet.getString(columnIndex);
    }

    @Override
    public Object getNullableResult(CallableStatement callableStatement, int parameterIndex) throws SQLException {
        return callableStatement.getString(parameterIndex);
    }

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object object, JdbcType jdbcType) throws SQLException {
        pgObject.setType("json");
        pgObject.setValue(JSONUtils.valueToString(object));
        preparedStatement.setObject(i, pgObject);
    }
}

2. 在对应的相关 mapper.xml 文件中配置

代码语言:javascript
复制
<resultMap id="BaseResultMap" type="com.test.entity.EventLog">
	<id column="uuid" jdbcType="VARCHAR" property="uuid"/>
	<result column="payload" jdbcType="OTHER" property="payload" typeHandler="com.codingos.springboot.util.JsonTypeHandler"/>
</resultMap>
代码语言:javascript
复制
<insert id="insert" parameterType="com.test.entity.EventLog">
	insert into "test".event_log (uuid,payload)
	values (#{uuid,jdbcType=VARCHAR},#{payload,jdbcType=OTHER,typeHandler=com.codingos.springboot.util.JsonTypeHandler})
</insert>

在 java 代码里保存方法中直接传入个 JSONObject 就可以了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档