从 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*/@Overridepublic 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*/@Overridepublic 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*/@Overridepublic JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String sqlJson = rs.getString(columnIndex);if(null != sqlJson) {return JSONObject.parseObject(sqlJson);}return null;}@Overridepublic 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
