基于fastjson的mybatis自定义类型处理器JsonTypeHanlder代码示例
JsonTypeHanlder.javapackage com.ylb.boot.hanlder;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import
·
JsonTypeHanlder.java
package com.ylb.boot.hanlder;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import com.alibaba.fastjson.JSON;
/**
* 自定义类型处理器JsonTypeHanlder
*
* @author ty
* @date 2021年3月8日
*/
public class JsonTypeHanlder<T> implements TypeHandler<T> {
private Class<T> type;
public JsonTypeHanlder(Class<T> type) {
if (type == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
// 拿到xml中配置的javaType
this.type = type;
}
@Override
public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parseJsonString(parameter));
}
@Override
public T getResult(ResultSet rs, String columnName) throws SQLException {
return parseJavaObject(rs.getString(columnName));
}
@Override
public T getResult(ResultSet rs, int columnIndex) throws SQLException {
return parseJavaObject(rs.getString(columnIndex));
}
@Override
public T getResult(CallableStatement cs, int columnIndex) throws SQLException {
return parseJavaObject(cs.getString(columnIndex));
}
private String parseJsonString(T parameter) {
if (parameter == null) {
return null;
}
return JSON.toJSONString(parameter);
}
@SuppressWarnings("unchecked")
private T parseJavaObject(String parameter) {
if (parameter == null) {
return null;
}
if (parameter.startsWith("[")) {
return (T) JSON.parseArray(parameter, this.type);
}
return JSON.parseObject(parameter, this.type);
}
}
mybatis实体类特殊字段类型:private List<Image> imageList; 、private Image image; mysql数据库对应json或varchar类型,
对应的xml写法,我这里直接指定字段的类型处理器typeHandler ,同时指定 javaType ,不指定javaType可能导致反序列化异常,这里看起来有点怪,无论字段类型是list还是单个bean,javaType始终指定为bean的类型,而不是List类型,主要是拿不到泛型,后面再研究研究!
<result property="poster" javaType="com.ylb.bean.Image" typeHandler="com.ylb.boot.hanlder.JsonTypeHanlder" />
#{imageList, typeHandler=com.qingyan.common.boot.hanlder.JsonTypeHanlder}
泛型强转可直接调用官方工具类:org.springframework.data.util.CastUtils.cast(Objectobject) ,不必写@SuppressWarnings注解了。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)