Mybatis处理PostgreSQL中jsonb的数据

Mybatis处理PostgreSQL中jsonb的数据

出现的问题

Mybatis只能是将java中的字段与数据库的字段做映射,字段的类型需要匹配才能完成数据映射。
但是Mybatis中没有json或者jsonb的的type的。所以要操作PostgreSQL中json或者jsonb数据,需要自己写一个支持JsonbTypeHandler。

解决方式

继承BaseTypeHandler重写JsonbTypeHandler

package com.junction.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;

@MappedTypes({ Object.class })
public class JsonbTypeHandler extends BaseTypeHandler<Object> {

	//报错的话,请将pom文件的引入graphql的地方<version></version>标签注释掉
	private static final PGobject jsonObject = new PGobject();

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

	@Override
	public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
		return rs.getObject(columnName);
	}

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

	@Override
	public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		return cs.getObject(columnIndex);
	}

}

修改mapper.xml指定typeHandler

<resultMap type="User" id="userResultMap">
		<id property="id" column="id" />
		<result property="active" column="active" />
		<result property="sn" column="sn" />
		<result property="name" column="name" />
		<result property="kind" column="kind" />
		<result property="gender" column="gender" />
		<result property="age" column="age" />
		<result property="remark" column="remark" />
		<result property="data" column="data" jdbcType="OTHER"
			typeHandler="com.junction.util.JsonbTypeHandler" />
	</resultMap>
	
	<select id="selectUser" parameterType="java.lang.Long"
		resultMap="userResultMap">
		select *
		from users where id = #{id}
	</select>

insert的时候可以这么写:

<insert id="insertUser" parameterType="User">
		insert into users
		values(#{id},#{active},#{sn},#{name},#{kind},#{gender},#{age},#{remark},#{data,jdbcType=OTHER,typeHandler=com.junction.util.JsonbTypeHandler})
</insert>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值