MyBatis里json型字段到Java类的映射
Posted waterystone
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis里json型字段到Java类的映射相关的知识,希望对你有一定的参考价值。
一、简介
我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是非基本数据类型,在DB存储时我们想存的是json格式的字符串,从DB拿出来时想直接映射成目标类型,也即json格式的字段串字段与Java类的相互类型转换。
当然,你可以为每个类写一个MyClassTypeHandler,但问题是要为每个类都写一个TypeHandler,过于繁琐。
有了泛型,一个通用的TypeHandler直接搞定。
二、源码
package com.xxx.typehandler; import com.xxx.utils.JsonUtil; 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; /** * mapper里json型字段到类的映射。 * 用法: * 入库:#{item.myObject, typeHandler=com.xxx.typehandler.JsonTypeHandler} * 出库: * <resultMap> * <result property="jsonDataField" column="json_data_field" javaType="com.xxx.MyClass" typeHandler="com.xxx.typehandler.JsonTypeHandler"/> * </resultMap> * * @author xxx * @date 2016/5/31 19:33 */ public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> { 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, JsonUtil.toString(parameter)); } @Override public T getNullableResult(ResultSet rs, String columnName) throws SQLException { return JsonUtil.toObject(rs.getString(columnName), clazz); } @Override public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return JsonUtil.toObject(rs.getString(columnIndex), clazz); } @Override public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return JsonUtil.toObject(cs.getString(columnIndex), clazz); } }
具体JsonUtil这里就不再贴了,相信这对你来说不是问题。
以上是关于MyBatis里json型字段到Java类的映射的主要内容,如果未能解决你的问题,请参考以下文章