背景:
1、mysql5.7开始支持json类型字段;
2、mybatis暂不支持json类型字段的处理,需要自己做处理
第一步:建表
CREATE TABLE rules_json(
id INT PRIMARY KEY AUTO_INCREMENT,
sys_name VARCHAR(16) NOT NULL unique,
rules JSON,
create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
第二步:创建xml文件,entity(实体)文件,mapper文件
RulesJsonMapper.xml
RulesJson.java
RulesJsonMapper.java
第三步:新建MySqlJsonHandler.java
,内容如下:
package com.demo.apps.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.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@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;
}
/**
*
* @param cs
* @param columnIndex
* @return
* @throws SQLException
*/
@Override
public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String sqlJson = cs.getNString(columnIndex);
if (null != sqlJson) {
return JSONObject.parseObject(sqlJson);
}
return null;
}
}
第四步:在application.yml
中增加对应配置
mybatis:
mapper-locations: classpath:/mapper/*.xml
type-handlers-package: com.demo.apps.handler
第五步:修改RulesJsonMappler.xml
中对应部分
<resultMap id="BaseResultMap" type="com.demo.apps.entity.RulesJson" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="sys_name" property="sysName" jdbcType="VARCHAR" />
<!--将json类型的rules字段修改为如下形式-->
<result column="rules" property="rules" typeHandler="com.demo.apps.handler.MySqlJsonHandler" />
<result column="date" property="date" jdbcType="TIMESTAMP" />
</resultMap>
<insert id="insertTest" parameterType="com.demo.apps.entity.RulesJson" >
insert into rules_json (id, sys_name, rules, date)
values (#{id,jdbcType=INTEGER}, #{sysName,jdbcType=VARCHAR},
#{rules,jdbcType=OTHER,typeHandler=com.zy.fenbu.subtreasurydemo.handler.MySqlJsonHandler},
#{date,jdbcType=TIMESTAMP})
</insert>
<select id="selectRulesTest" resultMap="BaseResultMap">
select * from rules_json
</select>
第六步:修改RulesJson.java
实体文件中,rules
对应的属性修改为JSONObejct
,以下仅摘取修改相关代码
@Data
@ToString
public class RulesJson {
private String id;
private String sysName;
//属性
private JSONObject rules;
private Date createDate;
}