字段里存的是json字符串,如何在查询时就将其转换为java对象呢?使用mybatis的typehandlers
考试类
/**
* 考试设置实体,Es,它只是一个java类,并没有对应的数据库表,examSetting是考试设置实体表的一个字段,存储了ES对应的JSON串
*
*/
public class ExamSettingEntity extends BaseModel{
/**
* 考试基本设置
*/
private Es examSetting;
……
}
然后是考试基本设置类Es
/**
* 考试基本设置 examSetting
*
*/
public class Es {
/**
* 考试时长类型 examLengthType
*/
private ExamSettingEntity.ExamLengthType elt;
/**
* 考试时长 examLength
*/
private Integer el = 0;
/**
* 答题模式 answerType
*/
private ExamSettingEntity.AnswerType at;
/**
* 是否允许修改答案 canEdit
*/
private Boolean ce = false;
/**
* 补考设置类型
*/
private ExamSettingEntity.MakeUpType mt;
/**
* 补考次数 makeupNum
*/
private Integer mn = 0;
public ExamSettingEntity.ExamLengthType getElt() {
return elt;
}
public void setElt(ExamSettingEntity.ExamLengthType elt) {
this.elt = elt;
}
public Integer getEl() {
return el;
}
public void setEl(Integer el) {
this.el = el;
}
public ExamSettingEntity.AnswerType getAt() {
return at;
}
public void setAt(ExamSettingEntity.AnswerType at) {
this.at = at;
}
public Boolean getCe() {
return ce;
}
public void setCe(Boolean ce) {
this.ce = ce;
}
public ExamSettingEntity.MakeUpType getMt() {
return mt;
}
public void setMt(ExamSettingEntity.MakeUpType mt) {
this.mt = mt;
}
public Integer getMn() {
return mn;
}
public void setMn(Integer mn) {
this.mn = mn;
}
}
如何在查考试设置类时自动将examSetting字段里的JSON串转为Es实体呢。。
自定义类处理器 JsonTypeHandler
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;
}
//保存数据的时候的处理,将对象转为JSON字符串
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, this.toJson(parameter));
}
//获取对象时候的处理,将字段里的JSON串转为java对象
@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) {
return JSON.toJSONString(object);
}
private T toObject(String content, Class<?> clazz) {
if (content != null && !content.isEmpty()) {
return (T)JSON.parseObject(content, clazz);
} else {
return null;
}
}
}
mybatis-config.xml里配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeHandlers>
<typeHandler javaType="com.kttx.business.domain.exam.vo.Es"
handler="com.kttx.business.mybatisTypeHandler.JsonTypeHandler"/>
</typeHandlers>
</configuration>
examSetting.xml里面配置
<resultMap id="settingsResultMap" type="com.kttx.business.domain.exam.ExamSettingEntity">
……
<result property="examSetting" column="exam_setting" javaType="com.kttx.business.domain.exam.vo.Es"/>
</resultMap>
配置完成