mybatis中操作json类型数据

2023-11-17

mysql使用json类型字段保存数据,使用mybatis进行新增、查询操作,实现字段映射转换

  1. 自定义TypeHandler
package com.xxx.xxx.handler;
  
import java.io.IOException;  
import java.sql.CallableStatement;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
  
import com.fasterxml.jackson.core.JsonProcessingException;  
import com.fasterxml.jackson.databind.DeserializationFeature;  
import com.fasterxml.jackson.databind.ObjectMapper;  
import lombok.extern.slf4j.Slf4j;  
import org.apache.ibatis.exceptions.PersistenceException;  
import org.apache.ibatis.type.BaseTypeHandler;  
import org.apache.ibatis.type.JdbcType;  
import org.apache.ibatis.type.MappedJdbcTypes;  

/**
 1. @ModifyTime 2021/11/25
 2. JSON 字段类型处理器
 **/
@Slf4j
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JacksonTypeHandler<T extends Object> extends BaseTypeHandler<T> {
    private static ObjectMapper objectMapper;
    private Class<T> type;

    static {
        objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    public JacksonTypeHandler(Class<T> type) {
        if (log.isTraceEnabled()) {
            log.trace("JacksonTypeHandler(" + type + ")");
        }
        if (null == type) {
            throw new PersistenceException("Type argument cannot be null");
        }
        this.type = type;
    }

    private T parse(String json) {
        try {
            if (json == null || json.length() == 0) {
                return null;
            }
            return objectMapper.readValue(json, type);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private String toJsonString(T obj) {
        try {
            return objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return parse(rs.getString(columnName));
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return parse(rs.getString(columnIndex));
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return parse(cs.getString(columnIndex));
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int columnIndex, T parameter, JdbcType jdbcType)
            throws SQLException {
        ps.setString(columnIndex, toJsonString(parameter));
    }
}
  1. yml配置文件中添加配置
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-handlers-package: com.xx.xx.handler
  1. 在mapper文件中编写对应的字段映射规则
<result column="parameter" property="parameter" jdbcType="VARCHAR"
            typeHandler="com.xx.xx.handler.JacksonTypeHandler"/> 
            //指定返回信息使用该Typehandler
`parameter` = #{parameter,javaType=com.xx.xx.entity.ParameterEntity, typeHandler=com.xx.xx.handler.JacksonTypeHandler},
//新增或修改时指定该字段对应的对象类型、以及Typehandler
  1. 结果
//新增结果
{
    "code": 200,
    "msg": "操作成功",
    "data": {
        "id": "9c43257c-90ff-464d-aa84-43784b728c06",
        "name": "string",
        "parameter": [
            {
                "name": "新增的参数",
                "type": 1
            },
            {
                "name": "新增的参数",
                "type": 1
            }
        ],
        "createTime": "2021-11-25T11:54:24.577+08:00",
        "updateTime": "2021-11-25T11:54:24.577+08:00"
    }
}
//查询结果
{
  "code": 200,
  "msg": "操作成功",
  "data": [
    {
      "id": "2ecb88f6-c99c-4877-ade5-72c3081b6009",
      "name": "string",
      "parameter": [
        {
          "name": "新增的参数",
          "type": 1
        },
        {
          "name": "新增的参数",
          "type": 1
        }
      ],
      "createTime": "2021-11-25T00:00:00.000+08:00",
      "updateTime": "2021-11-25T00:00:00.000+08:00"
    },
    {
      "id": "65e0a272-4267-4ea8-a89b-79e811ca2e17",
      "name": "string2",
      "parameter": [
        {
          "name": "新增的参数",
          "type": 1
        },
        {
          "name": "新增的参数",
          "type": 1
        }
      ],
      "createTime": "2021-11-25T00:00:00.000+08:00",
      "updateTime": "2021-11-25T00:00:00.000+08:00"
    }
  ]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis中操作json类型数据 的相关文章

  • 如何在没有@Transactional的情况下使用Hibernate @Filter?

    我使用 Hibernate Filter 和 Spring Data 为项目中的每个查询添加特定的 where 子句 问题是 只要我对 findAll 方法使用 Transactional 注释 它就可以工作 有什么办法可以避免使用 Tra
  • Spring Redis 排序键

    我在 Redis Spring Data Redis 中有以下键 localhost gt Keys 1 id 1 Name C5796 Site DRG1 2 id 2 Name CX1XE Site DG1 3 id 3 Name C5
  • 删除 JSON 属性 [重复]

    这个问题在这里已经有答案了 如果我有一个 JSON 对象 请说 var myObj test key1 value key2 value 我可以删除 key1 使其变为 test key2 value Simple delete myObj
  • 从java应用程序发送电子邮件时出现异常:中继被拒绝

    我们正在使用 Spring Mail 从 java 应用程序发送电子邮件 org springframework mail javamail JavaMailSenderImpl Spring电子邮件配置是
  • 将 pandas DataFrame 写入 unicode 中的 JSON

    我正在尝试将包含 unicode 的 pandas DataFrame 写入 json 但是内置的 to json函数对字符进行转义 我该如何解决 Example import pandas as pd df pd DataFrame a
  • Spring MVC 和复选框

    我正在使用 Spring MVC 3 0 并且不能完全看到这个问题的所有部分 我的控制器将生成一个域对象列表 假设有一个简单的 User 对象 具有firstName lastName age 和role 属性 我想在表中输出该用户列表 每
  • 将json解析为条形图d3js

    我正在尝试使用 json url 创建条形图 关于印象和时间 我认为我没有正确引用 data data 中的数据 如何从 d3 中的 json 文件访问印象字段 var url https script google com macros
  • 如何通过 firebase 托管将我的主页重定向到随机 url?

    我正在尝试使用 firebase 托管通过 302 重定向来重定向我的主页 redirects source destination what do i put here type 302 在我的公共文件夹中 有index html 404
  • 反序列化 HTTP POST 参数

    我正在尝试找到一种更原生或更优雅的解决方案 用于将 HTTP POST 参数反序列化为相应的对象 目前 我将字符串转换为字典 然后将其序列化为 JSON 然后将其反序列化为我的最终对象 参数字符串示例 TotalCost 0 01200 D
  • 自定义存储库的 Spring Data Solr 优先级

    我需要在 Spring Data Solr 自定义存储库中实现以下内容 X 或 Y 和 Z 我当前的代码如下 Criteria criteria new Criteria x is X VALUE criteria criteria or
  • 为什么 Twitter API 返回错误的推文 ID?

    我使用 Twitter API 来检索用户主页时间线推文 我使用 json 响应格式 最近推文 ID 在 API 中只是 id 被重新调整错误 举个例子 通常它应该像这样返回 id 14057503720 示例来自twitter控制台 但是
  • Spring-data-jdbc 插入 LocalDateTime 类型变量期间微秒精度丢失

    在我看来 当我们跑步时repository save entity 并且该实体有一个LocaldateTime映射到类型列的变量timestamp 6 spring data jdbc 或某些底层库 将列中插入的数据四舍五入到小数点后 3
  • 无法验证模式并正确使用additionalProperties

    我正在尝试验证我的 JSON 架构并使用 extraProperties false 来确认没有其他属性 我的responseBody看起来像这样 id 1234567890987654 email email protected cdn
  • 汉字编码?

    我有一个用例 我通过发布请求向 spring 控制器提交参数 在控制器中 我正在读取参数并执行一些操作 之后 我将这些参数作为请求参数的一部分发送到其他 URL 在这里我无法处理中文字符 它变得乱码 我现在正在做的行动 1 我将下面的中文文
  • Spring-Social/Twitter -- ConnectController 不响应 /connect?

    好吧 我已经拉了我的头发很长时间了 至少看起来是这样 试图找出我做错了什么 我有一个Java项目 我想允许用户登录 通过正常的Spring 启用安全性 JDBC 的存储库 向我的应用程序授予对其 Twitter 帐户的访问权限 我已经在 T
  • 如何在 Spring 3 中以编程方式执行注销

    我有一个用于注销的 spring 配置 如下所示
  • 带有 @Scheduled Spring 注释的方法的切入点

    我想要一个带有注释的方法的 AspectJ 切入点 Scheduled 尝试了不同的方法但没有任何效果 1 Pointcut execution org springframework scheduling annotation Sched
  • shell解析json并循环输出组合变量

    杰斯克喜欢我之前的话题 https stackoverflow com questions 74063588 shell parsing json contains spaces in string 我知道如何解析带有空格的简单 json
  • 如何在 Flutter 中解码 Gzip Http 响应?

    我是颤振新手 我正在发出网络请求 并且得到了正确的响应 但数据已被压缩 我已经在 Swift 中解压了相同的内容 但是对于 Flutter 我无法做到这一点 有人可以帮忙吗 这是我尝试过的 import dart convert impor
  • 在 Spring 和 SPeL 中使用 @Value 注释

    我正在尝试找到一种方法在我的 Spring Boot 1 5 应用程序中执行以下操作 我有一个变量 其值是动态的 这意味着它来自外部系统 String name abc gets set externally 我想尝试使用名称的值来查找我的

随机推荐

  • 网络层

    网络层 从它的名字可以看出 它解决的是网络与网络之间 即网际的通信问题 而不是同一网段内部的事 用于网络互联的设备都处于网络层 如 路由器 网络交互机等 一个底层网络内部只存在两层 即数据链接层 与 物理层 没有其它层
  • 考研C++/C数据结构之单链表两种查找方法

    继上篇文章我们探讨了单链表的两种创建方法 头插法和尾插法 今天我们来学习一下单链表的两种查找方法 按序查找和按值查找 按序查找的代码实现如下 按位查找 LinkList GetElem LinkList L int i int j 1 Li
  • python是真刑啊!爬虫这样用,离好日子越铐越近了~

    一个程序员写了个爬虫程序 整个公司200多人被端了 不可能吧 刚从朋友听到这个消息的时候 我有点不太相信 做为一名程序员来讲 谁还没有写过几段爬虫呢 只因写爬虫程序就被端有点夸张了吧 朋友说 消息很确认并且已经进入审判阶段了 01 对消息进
  • 求解视觉里程计(基于特征点法)

    目录 1 视觉里程计 VO 2 基于特征点法的视觉里程计算法 2 1 特征点 2 2 ORB特征点的提取与匹配 2 2 1 关键点与描述子 灰度质心法 特征描述子计算 2 2 2 特征点匹配 2 3 特征点法估计相机位姿 2 3 1 对极几
  • MySQL事务简介

    一 事务的起源 原子性 Atomicity 要么全做 要么全不做 一致性 Consistency 数据库中的数据全部符合现实中的约束 隔离型 Isolation 操作以原子性执行 且不同事务操作互不干扰 多种隔离级别 持久性 Durabil
  • Ubuntu18.04配置Seetaface6

    目录 一 下载安装Qt软件 1 安装包下载 2 安装Qt 3 配置 二 下载源码 三 编译工具 四 编译 1 编译OpenRoleZoo 2 编译SeetaAuthorize 3 编译TenniS 五 运行 1 修改lib路径 2 buil
  • 360n6pro刷鸿蒙系统,360N6和N6Pro通用刷机包MIUI9开发版V8.6.9紫火定制版

    本帖最后由 360fans 80867761 于 2018 8 7 19 44 编辑 360N6和N6Pro通用MIUI9开发版V8 6 9紫火定制版刷机包更新指纹解 除了有个小BUG 相机有时候加载有点慢 其他都很正常 无任何推广软件 刷
  • Vue实例选项之【methods】

    methods div h1 site site h1 h1 url url h1 h1 alexa alexa h1 p 通过调用方法返回数据 p div
  • 0欧电阻和磁珠的区别

    来源 B站https www bilibili com video BV1Yi4y1x7JL 0欧姆电阻实际上并不能达到真正的0欧姆 它是一个阻性的阻值极小的电阻 磁珠浅显的可以看成是一个电感 故很多原理图中磁珠的符号是电感的符号 磁珠的直
  • less命令详解-最好用的文档查看命令

    less命令详解 最好用的文档查看命令 其他文件查看命令 less使用场景 less的日常使用 less快捷键 less参数 其他文件查看命令 小文本查看命令 cat 将文件所有内容打印打控制台 tac 将文件所有内容反向打印打控制台 vi
  • C#线程中使用委托实现textbox显示

    delegate void SetTextCallback string text 后加的 好好想一想 参数是SetText带的参数 From www uzhanbao com private void SetText string tex
  • 《Spring源码深度分析》第3章 默认标签的解析

    目录标题 前言 一 Spring默认的四个标签 二 bean标签的解析及注册 1 BeanDefinition下的三个实现类 2 解析BeanDefinition 1 processBeanDefinition 2 parseBeanDef
  • C/C++预定义宏

    MSVC文档 https learn microsoft com en us cpp preprocessor predefined macros view msvc 170 GCC文档 https gcc gnu org onlinedo
  • APS高级计划排程系统:什么是按库存生产(MTS)计划?

    文章目录 前言 什么是按库存生产 MTS 按库存交货的缺点 MTS MTS的替代产品 按订单生产 MTO 按库存计划 MTS 计划示例 前言 制造企业寻求提高设备利用率 缩短制造周期 寻求降低成本和利润最大化 可以使用许多生产策略 在理想的
  • 蒙特卡洛方法生成随机数_随机股票生成器—财务方面的蒙特卡洛模拟

    蒙特卡洛方法生成随机数 金融 机器学习 Finance Machine Learning In this article I will focus on how to create a procedural stock from nowhe
  • day03 756 蛇形矩阵(偏移量技巧)

    756 蛇形矩阵 输入两个整数n和m 输出一个n行m列的矩阵 将数字 1到 n m按照回字蛇形填充至矩阵中 具体矩阵形式可参考样例 输入格式 输入共一行 包含两个整数n和m 输出格式 输出满足要求的矩阵 矩阵占n行 每行包含m个空格隔开的整
  • Python lxml库的安装和使用

    lxml 是 Python 的第三方解析库 完全使用 Python 语言编写 它对 Xpath 表达式提供了良好的支持 因此能够了高效地解析 HTML XML 文档 本节讲解如何通过 lxml 库解析 HTML 文档 安装lxml库 lxm
  • spring mvc中post、get方法获取参数的几种方式

    get与post两种方式的区别 对于本次主题而言 最显著的区别就是get请求方式参数是在url后 而post请求方式的参数是在request body中 因此两者获取参数的方式也大不一样 Getter Setter AllArgsConst
  • Cocos2d-x学习笔记(二) 永远的HelloWorld

    HelloCpp是Cocos2d x自带的一个工程 它演示了Cocos2d x最基本的使用方法和流程 先看一下它的基本构成 win32目录中包含了对应平台的代码 而Classes目录中包含了我们自己的实现代码 编译运行的结果如下图 main
  • mybatis中操作json类型数据

    mysql使用json类型字段保存数据 使用mybatis进行新增 查询操作 实现字段映射转换 自定义TypeHandler package com xxx xxx handler import java io IOException im