1、创建数据库表
指定类型为json类型
CREATE TABLE `table_json_data` (
`id` varchar(32) NOT NULL COMMENT '编码',
`obj_data` json DEFAULT NULL COMMENT 'json数据',
PRIMARY KEY (`id`)
)
2、mybatis配置文件设置
指定typeHandler为FastJsonTypeHandler,其中FastJsonTypeHandler为自定义类型解析类
<resultMap id="BaseResultMap"
type="com.test.TableJsonData">
<result column="id" property="id" />
<result column="obj_data" property="objData"
javaType="java.lang.Object"
typeHandler="com.mybatis.typeHandler.FastJsonTypeHandler" />
</resultMap>
FastJsonTypeHandler实现类demo如下
public class FastJsonTypeHandler<T extends Object> implements TypeHandler<T> {
private Class<T> type;
public FastJsonTypeHandler(Class<T> type) {
if (type == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
// 拿到xml中配置的javaType
this.type = type;
}
@Override
public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parseJsonString(parameter));
}
@Override
public T getResult(ResultSet rs, String columnName) throws SQLException {
return parseJavaObject(rs.getString(columnName));
}
@Override
public T getResult(ResultSet rs, int columnIndex) throws SQLException {
return parseJavaObject(rs.getString(columnIndex));
}
@Override
public T getResult(CallableStatement cs, int columnIndex) throws SQLException {
return parseJavaObject(cs.getString(columnIndex));
}
/**
* 转换成json字符串
* @param parameter 参数
* @return String json格式字符串
*/
private String parseJsonString(T parameter) {
if (parameter == null) {
return null;
}
// 将参数转换成fastjson格式的文本
return JSON.toJSONString(parameter);
}
@SuppressWarnings("unchecked")
private T parseJavaObject(String parameter) {
if (parameter == null) {
return null;
}
if (parameter.startsWith("[")) {
return (T)JSON.parseArray(parameter, this.type);
}
return JSON.parseObject(parameter, this.type);
}
}
3、查询JSON类型
-- 查询记录
SELECT sname,JSON_EXTRACT(info,'$.age') FROM table_json_data;
SELECT sname,info->'$.age' FROM table_json_data;
-- 查询key
SELECT id,json_keys(info) FROM table_json_data;
网友评论