SpringBoot + Mybatis + PostgreSQL JSON数据处理

上篇博客的遗留问题:

  • MySQL数据库,存储类型是VARCHAR(255),很容易超出上限。而且在实际项目中使用的是PostgreSQL数据库,有JSON格式的数据类型。
为什么要处理JSON格式的数据类型?
  • 在项目中持久层框架使用的Mybatis,Mybatis并未提供直接处理JSON的相关类,所以需要我们手动创建处理JSON的类,继承BaseTypeHandler。
具体实现:
import com.gotrade.esop.common.JacksonSerializer;
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;

/**
 * @author jason.tang
 * @create 2019-01-29 11:27
 * @description 自定义JsonTypeHandler处理PostgreSQL的JSON数据类型
 */
@MappedTypes({Object.class})
public class JsonTypeHandler extends BaseTypeHandler<Object> {
    //引入PGSQL提供的工具类PGobject
    private static final PGobject jsonObject = new PGobject();

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        jsonObject.setType("json");
        jsonObject.setValue(parameter.toString());
        ps.setObject(i, jsonObject);
    }

    @Override
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return JacksonSerializer.parseObject(rs.getString(columnName), Object.class);
    }

    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return JacksonSerializer.parseObject(rs.getString(columnIndex), Object.class);
    }

    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return JacksonSerializer.parseObject(cs.getString(columnIndex), Object.class);
    }
}
注意事项:
  • 一开始使用如果报错找不到PGobject类,请检查pom文件,将runtime注释掉:
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <!-- <scope>runtime</scope> -->
</dependency>
  • 在上篇文章中,我是先将需要监控的对象转成JSON字符串,所以这里的 setNonNullParameter方法直接setValue即可,如果是先直接传入对象,在自定义处理JSON数据类型的类中处理如下:
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
    jsonObject.setType("json");
    jsonObject.setValue(JacksonSerializer.toJSONString(parameter));
    ps.setObject(i, jsonObject);
}
  • 这里用到了JSON字符串与对象的相互转换工具类,请看这里
在Mybatis的xml中使用
<insert id="addAuditLog" parameterType="com.gotrade.autitlog.model.AuditLog">
    <selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="logNum">
        SELECT nextval('seq_audit_log'::regclass) AS logNum
    </selectKey>
    INSERT INTO audit_log (
        log_num, log_table_name, log_type, log_data, src_num, create_dt
    ) VALUES (
        #{logNum}, #{logTableName}, #{logType}, 
        #{logData, typeHandler=com.gotrade.autitlog.common.JsonTypeHandler},
        #{srcNum}, #{createDateTime}
    )
</insert>
  • 这里的log_data在PostgreSQL数据库的类型为JSON类型
  • 在对于的值后面加上typeHandler=com.gotrade.autitlog.common.JsonTypeHandler即可,这就是刚刚自定义处理JSON数据类的全限定名。
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值