从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型。
使用 mybatis 操作 json 类型,需要配置一个 java json类型与 mysql json 类型的转换器
package com.e6yun.project.tms.core;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 用以mysql中json格式的字段,进行转换的自定义转换器,转换为实体类的JSONObject 属性
* 原文: jianshu.com/p/700452aaae8c
* @author demon
* @date 2021/8/18 16:59
*/
@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JsonHandler extends BaseTypeHandler<JSONObject> {
/**
* 设置非空参数
*
* @param ps
* @param i
* @param parameter
* @param jdbcType
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.valueOf(parameter.toJSONString()));
}
/**
* 根据列名,获取可以为空的结果
*
* @param rs
* @param columnName
* @return
* @throws SQLException
*/
@Override
public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
String sqlJson = rs.getString(columnName);
if(null != sqlJson) {
return JSONObject.parseObject(sqlJson);
}
return null;
}
/**
* 根据列索引,获取可以为空的结果
*
* @param rs
* @param columnIndex
* @return
* @throws SQLException
*/
@Override
public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String sqlJson = rs.getString(columnIndex);
if(null != sqlJson) {
return JSONObject.parseObject(sqlJson);
}
return null;
}
@Override
public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String sqlJson = cs.getString(columnIndex);
if(null != sqlJson) {
return JSONObject.parseObject(sqlJson);
}
return null;
}
}
定义 resultMap 时,指定转换器, insert 语句针对json 字段也指定类型转换器
<resultMap id="BaseResultMap" type="com.e6yun.project.tms.report.po.WaybillBaseInfoPO">
<!--略-->
<result column="abnormal_info" jdbcType="OTHER" property="abnormalInfo" typeHandler="com.e6yun.project.tms.core.JsonHandler"/>
</resultMap>
insert into waybill_base_info (id, river_allowance)
values( #{id,jdbcType=VARCHAR},
driverAllowance,jdbcType=OTHER,typeHandler=com.e6yun.project.tms.core.JsonHandler})
mybatis 包扫描扫描指定的类型转化器
mybatis.type-handlers-package=com.e6yun.project.tms.core.JsonHandler