mysql5.7开始支持json数据操作,用springboot+mybatis操作特别方便,和mongodb挺像的
我写这个demo的时候用的java8+mysql8,整个操作都很简单,增查改删demo中都写了一遍
代码下载:https://gitee.com/zhuhongliang/MysqlJsonDemo.git
具体操作分为三步走。
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<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; } }
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') * */