【Mybatis整合mysql之Json类型属性适配手把手】

【Mybatis整合mysql之Json类型属性适配&&手把手】

场景

JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 、TEXT或LONGTEXT )来保存 JSON 文档。在开发中发现,Mybatis查询Json字段时,发现不能映射,如下:

java实体:

@Data
public class ApiGatherProject extends Base {

    /**
     * id
     */
    private Long id;

    /**
     * 项目id
     */
    private Long projectId;

    /**
     * sap接口url
     */
    private String url;

    /**
     * 请求类型 0:GET 1:POST 2:PUT 3:DELETE
     */
    private Integer httpType;

    /**
     * 请求参数列表
     */
    private JSONArray requestParamList;

    /**
     * 检验条件 0:默认响应码200 1:自定义响应码 2:内容包含 3:内容不包含
     */
    private Integer checkCondition;

    /**
     * 检验内容
     */
    private String checkContent;

    /**
     * 路由
     */
    private String route;

    /**
     * api类型:0 自定义
     */
    private Integer apiType;

    /**
     * json类型:0  application/json
     */
    private Integer jsonType;
}

mybatis config.xml如下:

<mapper namespace="com.mapper.ApiGatherProjectMapper">
    <resultMap id="resultList" type="com.test.entity.ApiGatherProject">
        <id column="id" property="id"></id>
        <result column="project_id" property="projectId"></result>
        <result column="url" property="url"></result>
        <result column="http_type" property="httpType"></result>
        <result column="request_param_list" property="requestParamList"></result>
        <result column="check_condition" property="checkCondition"></result>
        <result column="check_content" property="checkContent"></result>
        <result column="api_type" property="apiType"></result>
        <result column="json_type" property="jsonType"></result>
        <result column="route" property="route"></result>
        <result column="creator_id" property="creatorId"></result>
        <result column="create_time" property="createTime"></result>
        <result column="modify_time" property="modifyTime"></result>
    </resultMap>
    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO t_gather_api (project_id, url, http_type, request_param_list, check_condition, check_content, api_type, json_type, route)
        VALUES (#{projectId}, #{url}, #{httpType}, #{requestParamList}, #{checkCondition}, #{checkContent}, #{apiType}, #{jsonType}, #{route})
    </insert>
    <delete id="batchDeleteByProjectIds">
        DELETE FROM t_gather_api WHERE project_id IN
        <foreach collection="projectIds" item="projectId" open="(" separator="," close=")">
            #{projectId}
        </foreach>
    </delete>
    <delete id="batchDelete">
        DELETE FROM t_gather_api WHERE id IN
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
    <select id="getById" resultMap="resultList">
        SELECT * FROM t_gather_api WHERE id = #{id}
    </select>
    <select id="getByProjectId" resultMap="resultList">
        SELECT * FROM t_gather_api WHERE project_id = #{id}
    </select>

</mapper>

mysql数据库中,requestParamList字段有数据,如下:
在这里插入图片描述

对于JSONArray 类型 requestParamList字段,服务启动不了,报如下错误:

Caused by: java.lang.IllegalStateException: No typehandler found for property requestParamList
	at org.apache.ibatis.mapping.ResultMapping$Builder.validate(ResultMapping.java:151)
	at org.apache.ibatis.mapping.ResultMapping$Builder.build(ResultMapping.java:140)
	at org.apache.ibatis.builder.MapperBuilderAssistant.buildResultMapping(MapperBuilderAssistant.java:446)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildResultMappingFromContext(XMLMapperBuilder.java:393)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:280)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:254)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements(XMLMapperBuilder.java:246)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:119)

原因分析

Caused by: java.lang.IllegalStateException: No typehandler found for property requestParamList`

出现该异常,大致原因是是因为requestParamList属性的类型无法和mysql映射!
从该问题入手后,发现mybatis目前不支持Json字段的的处理,如下包:

org.apache.ibatis.type.*;

在这里插入图片描述
找不到Json的Handler,哦 my gay,好像找到问题了,我决定仿照org.apache.ibatis.type.ArrayTypeHandler自定义一个JsonTypeHandler,看到这里,是不是觉得我很牛逼,no no no,去掉牛!!!!

解决方案

自定义JsonTypeHandler

package com.test.handler;

import org.apache.ibatis.type.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import org.springframework.context.annotation.Configuration;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedTypes(JSONArray.class) // 指定映射的目标类型为 JSONArray
@Configuration
public class JsonTypeHandler extends BaseTypeHandler<JSONArray> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException {
        String jsonString = JSON.toJSONString(parameter);
        ps.setString(i, jsonString);
    }

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

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

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

    private JSONArray parseJson(String jsonString) {
        if (jsonString == null || "".equals(jsonString)) {
            return new JSONArray();
        } else {
            return JSON.parseArray(jsonString);
        }
    }
}

适配mbatis 的Xml文件中的,如下,主要关注request_param_list

<resultMap id="resultList" type="com.entity.ApiGatherProject">
        <id column="id" property="id"></id>
        <result column="project_id" property="projectId"></result>
        <result column="url" property="url"></result>
        <result column="http_type" property="httpType"></result>
        <result column="request_param_list" property="requestParamList"
                javaType="com.alibaba.fastjson.JSONArray" jdbcType="OTHER"
                typeHandler="com.cctegitc.warehouse.handler.JsonTypeHandler"></result>
        <result column="check_condition" property="checkCondition"></result>
        <result column="check_content" property="checkContent"></result>
        <result column="api_type" property="apiType"></result>
        <result column="json_type" property="jsonType"></result>
        <result column="route" property="route"></result>
        <result column="creator_id" property="creatorId"></result>
        <result column="create_time" property="createTime"></result>
        <result column="modify_time" property="modifyTime"></result>
    </resultMap>

重启服务,测试:
在这里插入图片描述
成功了!!!!!看着很简单吧,看到这里了,求个小关小赞吧,家人们 /笑。

写到最后

作为一个程序员,公认的都是很忙的,但是,我就很“闲”了,开发工作游刃有余,但就是太闲了,哈哈哈,因为我的领导也很闲呀,上班8小时,谝传4小时,上厕所2小时,接水1小时,剩余1小时给我安排任务,阿达。。。
作为小小程序员,最近也开始研究“伏羲一画开天下”,八卦图,哈哈【乾三连,坤六断,震仰盂,艮覆碗,离中空,坎中满,兑上缺,巽下断】,当我慢慢深入发现,没有比程序员更适合学习《易经》的人了,因为我们的逻辑思维很强呀,,哈哈,我去上个厕所,下期见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/476199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AWS监控,AWS 性能监控工具

监控云部署的性能是 IT 环境正常运行的内在条件。AWS 云是一个架构良好的框架&#xff0c;管理员可以使用专用的AWS 性能监控工具增强服务的功能。执行AWS监视是为了跟踪在AWS环境中积极运行的应用程序工作负载和资源。AWS监视器跟踪各种AWS云指标&#xff0c;以帮助提高在其上…

电子证书查询系统如何制作证书?

1、制作空白证书&#xff1a;网上找一张证书背景图&#xff0c;用PPT工具或photoshop等图片处理工具&#xff0c;将证书上固定的文字打上&#xff0c;有公章的话贴上电子公章&#xff0c;不固定的内容留空白。 2、制作电子证书&#xff1a;上传前一步制作好的空白证书&#xf…

LeetCode刷题记录:(13)N皇后(难题不难)

leetcode传送通道 传说中的N皇后&#xff0c;不难&#xff0c;进来了就看完吧 注释序号代表鄙人写代码的顺序和思考逻辑&#xff0c;供参考 class Solution {// 1.定义结果数组List<List<String>> result new ArrayList<>();public List<List<String&…

moviepy简介及使用教程

moviepy简介及基本概念 MoviePy 是一个用于视频编辑的 Python 库&#xff0c;使用户能够处理、编辑和操作视频文件。这个库允许你剪辑视频、添加文本、合并视频剪辑&#xff0c;以及应用各种效果和转换。它建立在 NumPy、imageio 和 Decorator 等库的基础上&#xff0c;使得在…

部署mysql,前端,后端

部署mysql docker pull mysql 从镜像源中拉取镜像。 创建mysql容器 docker run -d \--name mysql_container \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \--restartalways \-v /opt/mysql:/var/lib/mysql \mysql -d后台运行&#xff0c;--name指定容器…

点餐小程序开发:如何通过抽奖与消费者互动

随着科技的发展&#xff0c;越来越多的商家开始使用点餐小程序来提升自己的服务质量和效率。然而&#xff0c;仅仅提供点餐服务并不能满足消费者的需求&#xff0c;他们还需要一种方式来增加与商家的互动&#xff0c;提高消费体验。抽奖活动就是一种非常有效的互动方式&#xf…

C++ stack和queue

什么是stack stack就是平常所说的栈&#xff0c;栈只能进行在固定的一端插入数据和删除数据的操作&#xff0c;也就是先进后出&#xff0c;后进先出 什么是queue queue是平常所说的队列&#xff0c;队列就像平常排队吃饭一样&#xff0c;先到的就有饭吃&#xff0c;只能从一端…

C语言每日一题07

一、题目 二、解析 逻辑与 &&、逻辑或 || 均有“短路”特性: 逻辑与&&“短路”&#xff1a;当逻辑与&&的左操作数为逻辑 “假“ 时&#xff0c;就足以判断该逻辑运算的结果为假了&#xff0c;故右操作数就不再被执行。 逻辑或||“短路”&#xff1a…

为什么大家都在“挺”鸿蒙?

试想某一天&#xff0c;应用软件能够在手机、电视、手表甚至汽车等设备上&#xff0c;实现无缝流转、纵享丝滑。 这不仅是畅想&#xff0c;而是鸿蒙正在布局的“遥遥领先”。 随着HarmonyOS NEXT鸿蒙星河版面向开发者开放申请、鸿蒙原生应用版图的基本成型&#xff0c;这个国…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——量子粒子群算法(QDPSO)

基于python语言&#xff0c;采用经典量子粒子群算法&#xff08;QDPSO&#xff09;对 需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果4. 代码片段参考 往期优质资源 经过一年多的创作&#xff0c;目前…

【解决navicat登录报 insufficient privileges 错误】

今天使用navicat sysdba角色登录报 insufficient privileges 以下是解决方案&#xff1a; 1、使用管理员身份打开cmd登录 sqlplus sys/admin as sysdba2、给system用户授权 grant sysdba to system;登录navicat

Git——IDEA中的使用详解

目录 Git1、IDEA中配置Git2、将本地项目推送到远程仓库2.1、创建项目远程仓库2.2、初始化本地仓库2.3、连接远程仓库2.4、提交到本地仓库2.5、推送到远程仓库 3、克隆远程仓库到本地4、基本操作4.1、代码提交到暂存区4.2、暂存区代码提交到本地库4.3、推送到远程仓库4.4、撤销本…

QT的学习

代码练习 做一个UI登录页面 源文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowTitle("洛克启动&#xff01;");this->…

[python]bar_chart_race绘制动态条形图

最近在 B 站上看到了一个宝藏 up 主&#xff0c;名叫 "Jannchie见齐"&#xff0c;专门做动态条形图相关的数据可视化。 可以看到做出的效果还是很不错的&#xff0c;但工具使用的是 JS&#xff0c;不是 Python&#xff0c;于是尝试搜索了一下&#xff0c;看看 Python…

C语言实现高精度计时和高精度延时微秒级别

C语言实现高精度计时和高精度延时微秒级别 目的说明环境说明一、高精度延时(微秒级别)二、测试例程三、测试结果 目的说明 在Windows下C语言实现高精度计时功能和高精度延时微秒级别环境说明 Dev-C V5.11一、高精度延时(微秒级别) void vDelayUS(u32 usDelay) {LARGE_INTEGER…

机器学习-可解释性机器学习:支持向量机与fastshap的可视化模型解析

一、引言 支持向量机(Support Vector Machine, SVM)作为一种经典的监督学习方法&#xff0c;在分类和回归问题中表现出色。其优点之一是生成的模型具有较好的泛化能力和可解释性&#xff0c;能够清晰地展示特征对于分类的重要性。 fastshap是一种用于快速计算SHAP值&#xff08…

【C++】弥补C语言的不足(②有默认参数的函数)

&#x1f33b;缺省参数 我们先来看一个简单地例子&#xff0c;对于在函数的定义中三个形参都给定默认值&#xff1a; #include <iostream> using namespace std; void fun(int a 10, int b 20, int c 30) {cout << "a " << a << endl;…

RentrantLock关键字详解

一、什么是AQS 全称是 AbstractQueuedSynchronizer&#xff08;队列同步器&#xff0c;下文简称同步器&#xff09;&#xff0c;是阻塞式锁和相关的同步器工具的框架&#xff0c;它是构建锁或者其他同步组件的基础框架。【AQS是实现锁的关键&#xff0c;在锁的实现中聚合同步器…

Python:柱状-折线图

写论文&#xff0c;需要画数据分析图&#xff1a; 用柱状图描述算法执行时间用折线图描述性能改进 示例代码&#xff1a; import numpy as np import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocatorSecurity ["128", "192",…

供电营业厅安防监控视频智能监管解决方案

一、方案背景 供电营业厅作为电力服务的重要窗口&#xff0c;其运营效率和客户满意度直接影响到企业的形象和声誉。在传统的监管模式下&#xff0c;供电营业厅的监控系统与其他消防报警、门禁系统等独立运行&#xff0c;无法做到集中管理、综合监控。为了提升供电营业厅的安防及…