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这里就不再贴了,相信这对你来说不是问题。
文章来自:http://www.cnblogs.com/waterystone/p/5547254.html