mysql 中使用 json 类型的字段

5.7 之后支持了 json 格式

但是在实际应用中好像不怎样

配置&使用流程

springboot+mybatisplus+mysql5.7

代码配置

java:

mysql 中的表:

配置类型转换插件

java 复制代码
package org.example.studyboot.demos.web;

import com.alibaba.fastjson2.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 JsonHandler 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;
    }
}

在yaml 中配置:

xml中配置:

对比MongoDb

假设有以下数据

json 复制代码
{
  "name": "John",
  "age": 25,
  "address": {
    "street": "123 Main St",
    "city": "New York"
  }
}

使用嵌套查询即可

css 复制代码
db.persons.find({"address.city": "New York"})

可以看到,直接被秒杀了

相关推荐
Victor35640 分钟前
MongoDB(118)如何在升级过程中进行数据备份?
后端
手握风云-40 分钟前
Spring AI:让大模型住进 Spring 生态(三)
java·后端·spring
Victor35642 分钟前
MongoDB(117)如何从旧版本迁移到新版本?
后端
pe7er4 小时前
window管理开发环境篇 - 持续更新
前端·后端
陈随易8 小时前
有生之年系列,Nodejs进程管理pm2 v7.0发布
前端·后端·程序员
陈随易10 小时前
AI时代,你还在坚持手搓文章吗
前端·后端·程序员
大鱼七成饱11 小时前
VMware NAT模式下固定内网IP(附详细图文)
后端
IT_陈寒13 小时前
Vue的这个响应式陷阱,我debug了一整天才爬出来
前端·人工智能·后端
兔子零102413 小时前
手把手教你在 Claude Code 中接入 DeepSeek-V4
后端
phenhorlin13 小时前
我做了个工具,让切换 Homebrew 镜像像切 npm 源一样简单
后端·shell