mysql5.7,mysql8操作Json数据,spring,mybatis,源码下载

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')
 *
 */

要发表评论,您必须先登录