mysql5.7版本以后支持原生json格式,基于Spring boot进行配置说明。
mybatis支持mysql的json格式
mysql-connector,mysql的驱动版本要大于等于5.1.40,否则json字段查询会发生乱码。 继承BaseTypeHandler自定义一个json类型处理器,放到一个handler包下,例:
package com.c.config.handler; 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.*; /** * @description 用以mysql中json格式的字段,进行转换的自定义转换器,转换为实体类的JSONObject属性 */ @MappedTypes(JSONObject.class) @MappedJdbcTypes(JdbcType.VARCHAR) public class MySqlJsonHandler 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; } }配置自定义的类型处理器,配置文件中加入:
#配置mybaits自定义类型转换类所在的包 mybatis.type-handlers-package=com.c.config.handler
mapper的配置文件,利用属性typeHandler,例:
<!-- resultMap中配置实体类json属性字段 --> <resultMap id="entityMap" type="com.c.entity.TrafficRestriction"> 、、、 <!-- 实体类的json字段,typeHandler指定自定义的typeHandler --> <result column="rule" property="rule" typeHandler="com.c.config.handler.config.MySqlJsonHandler"/> 、、、 </resultMap> <!-- 保存时的配置 --> <insert id="save" parameterType="com.c.TrafficRestriction"> <!-- 指定rule的typeHandler --> insert into table (rule) values (#{rule,jdbcType=OTHER,typeHandler=com.c.handler.config.MySqlJsonHandler}) </insert>实体类TrafficRestriction中rule字段类型为:com.alibaba.fastjson.JSONObject(当然也可以用其他工具的JSONObject)。配置完成后,保存、查询,rule字段就和普通字段一样,自动进行转换了。MySQL数据库中rule这一列,创建类型为:json。 mysql还支持基于json字段的查询。
作者:Knight_9 链接:https://www.jianshu.com/p/700452aaae8c