標籤:extend value 配置 映射 new tst map oid throw
業務擴充欄位在PostgreSQL資料庫中經常會使用json格式的資料來儲存,然而mybatis預設是沒有實現json類型欄位對應的TypeHandler,所以一般我們需要自訂mybatis的TypeHandler。
如下是mybatis中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(); @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException { jsonObject.setType("json"); jsonObject.setValue(JsonUtil.toJsonString(o)); preparedStatement.setObject(i, jsonObject); } @Override public Object getNullableResult(ResultSet resultSet, String s) throws SQLException { return JsonUtil.fromJson(resultSet.getString(s), Object.class); } @Override public Object getNullableResult(ResultSet resultSet, int i) throws SQLException { return JsonUtil.fromJson(resultSet.getString(i), Object.class); } @Override public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException { return JsonUtil.fromJson(callableStatement.getString(i), Object.class); }}
除了編寫TypeHandler外,還需要在xml對應檔中做如下配置:
<resultMap id="BaseResultMap" type="com.test.entity.EventLog"> <id column="uuid" jdbcType="VARCHAR" property="uuid"/> <result column="payload" jdbcType="OTHER" property="payload" typeHandler="com.test.dao.typehandler.JsonTypeHandler"/> </resultMap>
<insert id="insert" parameterType="com.test.entity.EventLog"> insert into "test".event_log (uuid,payload) values (#{uuid,jdbcType=VARCHAR},#{payload,jdbcType=OTHER,typeHandler=com.test.dao.typehandler.JsonTypeHandler}) </insert>
使用時,擷取到該Object對象後,可先轉成json字串,再轉成對應的對象,如下:
EventLogPayload eventLogPayload = JsonUtil.parser(JsonUtil.toJson(eventLog.getPayload()), EventLogPayload.class);
使用mybatis中的自訂TypeHandler處理PostgreSQL中的Json類型欄位