mysql5.7开始支持json数据操作,用springboot+mybatis操作特别方便,和mongodb挺像的
我写这个demo的时候用的java8+mysql8,整个操作都很简单,增查改删demo中都写了一遍
具体操作分为三步走。
1,继承BaseTypeHandler,创建MySqlJsonHandler.java文件
package com.hongtai.mysql_json_study.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;
/**
* @description 用以mysql中json格式的字段,进行转换的自定义转换器,转换为实体类的JSONObject属性
*/
@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MySqlJsonHandler extends BaseTypeHandler {
/**
* 设置非空参数
* @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;
}
}
2,配置文件properties中加入
#配置mybaits自定义类型转换类所在的包,路径是第一步创建的文件路径mybatis.type-handlers-package=com.hongtai.mysql_json_study.handler
3,在DAO中加入@Result,能将json数据映射到实体类就行了,下面红色的
/**
* 查询
* @param id
* @return
*/
@Select("select * from test_json where id = #{id}")
@Results(
id="infoMap",
value={
@Result(column="id",property="id",id=true),
@Result(column="info",property="jsonobj",typeHandler=com.hongtai.mysql_json_study.handler.MySqlJsonHandler.class)
}
)
Info findById(@Param("id") int id);
mysql数据,sql文件都上传在git里,直接下载即可:
/**
* 其他搜索sql
* 搜索1
* SELECT * from test_json where JSON_EXTRACT( info, '$.b' ) like '%肥仔%';
* 搜索2
* SELECT * from test_json where JSON_EXTRACT( info, '$.b' ) = '小肥仔';
*
* #数组搜索
* SELECT * FROM test_json WHERE JSON_CONTAINS(JSON_ARRAY("ccc","bbb","ddd"),info->'$.a') ORDER BY id DESC;
*
* #查询是否存在路径,JSON_CONTAINS_PATH(json字段,one_or_all,路径[,……])
* #one表示只要有一个存在即可;all表示所有的都存在才行
* SELECT * FROM test_json where JSON_CONTAINS_PATH(info,'one','$.c','$.c.d')
*
*/