Mysql5.7新增加了Json类型字段,但是目前Mybatis中并不支持
1.新建MybatisJsonTypeHandler.java
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
//import org.apache.ibatis.type.BaseTypeHandler;
//import org.apache.ibatis.type.JdbcType;
//import org.codehaus.jackson.map.ObjectMapper;
//import org.codehaus.jackson.map.SerializationConfig.Feature;
//import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Author : Randy
* Date : 2018-06-28 12:55
* Comment :
*/
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MybatisJsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {
private static final ObjectMapper mapper = new ObjectMapper();
private Class<T> clazz;
public MybatisJsonTypeHandler(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, this.toJson(parameter));
}
@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) {
try {
return mapper.writeValueAsString(object);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private T toObject(String content, Class<?> clazz) {
if (content != null && !content.isEmpty()) {
try {
return (T) mapper.readValue(content, clazz);
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
return null;
}
}
static {
mapper.configure(JsonParser.Feature.ALLOW_MISSING_VALUES, false);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
}
2.在mybatis-config.xml中注册该Handler
<typeHandlers>
<typeHandler handler="com.demo.handler.MybatisJsonTypeHandler"
javaType="com.demo.dto.ReportDataDto"/>
</typeHandlers>
3.在mapper sql map中如下,其中content为mysql中的json类型字段
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.demo.mapper.ReportDataMapper" >
<resultMap id="BaseResultMap" type="com.demo.dto.ReportDataDto" >
<id column="id" property="id" jdbcType="BIGINT" />
<id column="content" property="content" jdbcType="VARCHAR" typeHandler="com.demo.common.MybatisJsonTypeHandler"/>
</resultMap>
<sql id="Base_Column_List" >
id,
create_time createTime,
command_id commandId ,
content,
partition_key partitionKey
</sql>
<insert id="insert" parameterType="com.demo.dto.DataDto">
insert into data(
id,
create_time,
command_id,
content,
partition_key
) values (
#{id},
#{createTime},
#{commandId},
#{content,typeHandler=com.demo.common.MybatisJsonTypeHandler},
#{partitionKey}
)
</insert>
</mapper>
原文:https://www.cnblogs.com/qizhelongdeyang/p/9240600.html