資料庫JSON型別對映到java實體類中的物件——MyBatis框架
阿新 • • 發佈:2021-01-20
簡介
在使用MyBatis的過程中,會有這樣的需求:POJO裡有個屬性是非基本資料型別,在DB儲存時我們想存的是json格式的字串,從DB拿出來時想直接對映成目標型別,也即json格式的字串欄位與Java類的相互型別轉換。
解決方式是為每一個類寫一個TypeHandler,但是這樣過於繁瑣。
引入泛型,寫一個通用的TypeHandler。
程式碼
import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @autho ConnorSong * @date 2021/1/19 3:33 下午 */ public class JsonTypeHandler<T> extends BaseTypeHandler<T> { private static final ObjectMapper mapper = new ObjectMapper(); private Class<T> clazz; public JsonTypeHandler(Class<T> clazz) { if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null"); this.clazz = clazz; } @Override public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, this.toJson(parameter)); } @Override public T getNullableResult(ResultSet rs, String columnName) throws SQLException { return this.toObject(rs.getString(columnName), clazz); } @Override public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return this.toObject(rs.getString(columnIndex), clazz); } @Override public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return this.toObject(cs.getString(columnIndex), clazz); } private String toJson(T object) { try { return mapper.writeValueAsString(object); } catch (Exception e) { throw new RuntimeException(e); } } private T toObject(String content, Class<?> clazz) { if (content != null && !content.isEmpty()) { try { return (T) mapper.readValue(content, clazz); } catch (Exception e) { throw new RuntimeException(e); } } else { return null; } } // static { // mapper.configure(Feature.WRITE_NULL_MAP_VALUES,false); // mapper.setSerializationInclusion(WritableTypeId.Inclusion.NON_NULL); // } }
使用方法
查詢:
在resultMap中的欄位後面註明typeHandler,也可以加上javaType,指定對映的物件。
<result column="metrics" jdbcType="JSON" property="chartMetrics" typeHandler="com.server.configuration.mybatis.JsonTypeHandler" />
更新和插入:
也是需要指定引數的typeHandler
#{metrics,typeHandler=com.server.configuration.mybatis.JsonTypeHandler}