1.mybatis配置
<result property="jsonResult" column="json_result" typeHandler="com.text.mapper.handler.JacksonTypeHandler" />
2.java handler 配置
package com.test.mapper.handler;
import org.apache.commons.lang3.StringUtils;
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;
public abstract class AbstractJsonTypeHandler extends BaseTypeHandler<Object> {
protected Class<?> classType;
public AbstractJsonTypeHandler(Class<?> classType) {
this.classType = classType;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, toJson(parameter));
}
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
final String json = rs.getString(columnName);
return StringUtils.isBlank(json) ? null : parse(json);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
final String json = rs.getString(columnIndex);
return StringUtils.isBlank(json) ? null : parse(json);
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
final String json = cs.getString(columnIndex);
return StringUtils.isBlank(json) ? null : parse(json);
}
protected abstract Object parse(String json);
protected abstract String toJson(Object obj);
}
package com.test.mapper.handler;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects;
@Slf4j
public class JacksonTypeHandler extends AbstractJsonTypeHandler {
private static final ObjectMapper MAPPER = new ObjectMapper();
static {
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MAPPER.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
MAPPER.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
}
public JacksonTypeHandler(Class<?> classType) {
super(classType);
}
@Override
protected Object parse(String jsonStr) {
if (StringUtils.isBlank(jsonStr)) {
return null;
}
try {
return MAPPER.readValue(jsonStr, classType);
} catch (JsonProcessingException e) {
log.error("parse failed, jsonStr={}", jsonStr, e);
return null;
}
}
@Override
protected String toJson(Object obj) {
if (Objects.isNull(obj)) {
return null;
}
try {
return MAPPER.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException("Object to json string failed!" + obj, e);
}
}
}
3.java domain配置
private Map<String,Object> jsonResult;