springboot+mybatis处理json数据

  • 注意:Navicat应用需要升级,至字段拥有json类型在这里插入图片描述
  • 注意导入fastion的包,低版本toJSONString()==高版本toString()
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.7</version>
		</dependency>

处理JSONObject数据

实体类

在这里插入图片描述

映射文件

在这里插入图片描述

自定义类型转换器继承BaseTypeHandler接口

  • 注意点
  • @MappedTypes和@MappedJdbcTypes
  • BaseTypeHandler
  • JSONObject对象的parseObject()方法
package com.springboot.vue.util;

import com.alibaba.fastjson.JSONArray;
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;

/**
 * @author HJ
 * @theme
 * @time 2022/9/15
 */
@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JsonTypeHandler extends BaseTypeHandler<JSONObject> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i,String.valueOf(parameter.toJSONString()));
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String sqlJson = rs.getString(columnName);
      if (null!=sqlJson) {
          return JSONObject.parseObject(sqlJson);
      }
       return null;
    }

    @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;
    }
}

mybatis中配置转换器的地址 — 切记配置

在这里插入图片描述
自我:mybatis-plus.type-handlers-package

Navicat中的数据

在这里插入图片描述

处理JSONArray数据

实体类

在这里插入图片描述

映射文件不变

改变自定义转换器的数据类型

  • 注意点
  • @MappedTypes和@MappedJdbcTypes
  • BaseTypeHandler
  • JSONObject对象的parseObject()方法
package com.springboot.vue.util;

import com.alibaba.fastjson.JSONArray;
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;

/**
 * @author HJ
 * @theme
 * @time 2022/9/15
 */
@MappedTypes(JSONArray.class)
@MappedJdbcTypes(JdbcType.ARRAY)
public class JsonTypeHandler extends BaseTypeHandler<JSONArray> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i,String.valueOf(parameter.toJSONString()));
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String sqlJson = rs.getString(columnName);
        if (null!=sqlJson){
            return JSONObject.parseArray(sqlJson);
        }
        return null;
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String sqlJson = rs.getString(columnIndex);
        if (null!=sqlJson){
            return JSONObject.parseArray(sqlJson);
        }
        return null;
    }

    @Override
    public JSONArray getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String sqlJson = cs.getString(columnIndex);
        if (null!=sqlJson){
            return JSONObject.parseArray(sqlJson);
        }
        return null;
    }
}

配置地址不变

Navicat中的数据

[{"a": "dfw"}, {"b": "dffw"}]

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一款优秀的持久层框架,它可以非常方便地操作数据库。如果要使用 MyBatis 插入 JSON 数据,可以通过以下步骤进行: 1. 在 MyBatis 的 Mapper 文件中编写插入语句,类似于以下代码: ``` <insert id="insertJsonData" parameterType="map"> INSERT INTO table_name (json_column) VALUES (#{jsonData, jdbcType=OTHER, typeHandler=com.example.JsonTypeHandler}) </insert> ``` 其中,`jsonData` 是一个 Map 类型的参数,其中包含一个名为 `json_data` 的键,对应的值是一个 JSON 对象。`jdbcType=OTHER` 表示使用 JDBC 的 `setObject()` 方法将 JSON 对象插入数据库中,`typeHandler` 指定了自定义的类型处理器,用于将 Java 对象转换成数据库中的类型。 2. 编写自定义的类型处理器,实现 Java 对象和数据库类型之间的转换。例如,以下是一个将 JSON 对象转换成字符串类型的类型处理器的示例代码: ``` public class JsonTypeHandler implements TypeHandler<Object> { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { if (parameter == null) { ps.setNull(i, Types.VARCHAR); } else { try { ps.setString(i, objectMapper.writeValueAsString(parameter)); } catch (JsonProcessingException e) { throw new SQLException("Error converting JSON to string", e); } } } @Override public Object getResult(ResultSet rs, String columnName) throws SQLException { String json = rs.getString(columnName); return parseJson(json); } @Override public Object getResult(ResultSet rs, int columnIndex) throws SQLException { String json = rs.getString(columnIndex); return parseJson(json); } @Override public Object getResult(CallableStatement cs, int columnIndex) throws SQLException { String json = cs.getString(columnIndex); return parseJson(json); } private Object parseJson(String json) throws SQLException { if (json == null) { return null; } try { return objectMapper.readValue(json, Object.class); } catch (IOException e) { throw new SQLException("Error parsing JSON", e); } } } ``` 这个类型处理器将 JSON 对象转换成字符串类型,然后在插入数据库时将其作为普通字符串类型处理。在从数据库中查询时,将字符串反序列化成 JSON 对象。 3. 在 MyBatis 的配置文件中注册自定义的类型处理器,例如: ``` <typeHandlers> <typeHandler handler="com.example.JsonTypeHandler"/> </typeHandlers> ``` 这样就可以在 MyBatis 中使用自定义的类型处理器,插入 JSON 数据数据库中了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值