1.字段映射到对象类型java
a.建立handler实现org.apache.ibatis.type.BaseTypeHandlersql
import com.google.gson.Gson; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.*; public class ObjectHandler extends BaseTypeHandler<Object> { private static final Gson GSON = new Gson(); @Override public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { if (parameter == null) { ps.setNull(i, Types.VARCHAR); } else { ps.setString(i, GSON.toJson(parameter)); } } @Override public Object getNullableResult(ResultSet rs, String columnName) throws SQLException { Object convert = convert(rs.getString(columnName)); return convert; } @Override public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException { Object convert = convert(rs.getString(columnIndex)); return convert; } @Override public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { Object convert = convert(cs.getString(columnIndex)); return convert; } private static Object convert(final String columnValue) { return GSON.fromJson(columnValue, Object.class); } }
b.mapper文件中引用数据库
1).对于select操做,在 resultMap 中进行result配置,指定 typeHandler 便可生效apache
<result property="info" jdbcType="VARCHAR" column="info" typeHandler="com.tencent.iask.util.ObjectHandler"/>
2).对于更新或查询操做,须要在sql中指定mybatis
<insert id="createTask"> INSERT INTO `task` (`id`,`project`, `priority`, `info`) VALUES (#{id},#{project},#{priority}, #{info,typeHandler=ObjectHandler}); </insert>
2. 使用了typehandler找不到构造函数的问题app
Caused by: org.apache.ibatis.executor.ExecutorException: No constructor found in com.model.Task matching [java.lang.Integer, java.lang.String, java.lang.Integer, java.lang.String]
个人Task类,定义以下(info字段映射的数据库字段类型为varchar):ide
@Slf4j @Data @AllArgsConstructor public class Task { private Integer id; private String project; private int priority; private Object info; }
缘由为:mybatis默认使用无参构造函数,若是没有此函数会根据数据库字段类型寻找有参构造函数,此时,若是对象只有成员列表对应有参构造函数,那么会报找不到构造函数的错误,所以在使用typehandler时,最好给数据类型一个无参构造函数。函数