数据库JSON类型到映射JAVA上

news2025/2/26 11:39:14

Mysql存放JSON数据如何映射JAVA实体类

概述:最近写在写SKU模块中,需要表中字段存放JSON类型数据,mybatis-plus在查询的时候如何跟JSON类型所匹配呢?再次记录一下。

直接上代码,后面有解释到底如何映射上的。

Mysql表数据

在这里插入图片描述

JAVA实体类

@Data
public class TSku {
    private Long id;
    private Long bookId;
    private Long inventory;
    private BigDecimal oldPrice;
    private String picture;
    private BigDecimal price;
    private String skuCode;
    // 自定义类型处理器,表示java类型与数据库类型双向转换
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private JSONObject skuProperties;
    private String specs1;
    private String specsValue1;
    private String specs2;
    private String specsValue2;
    // 自定义类型处理器,表示java类型与数据库类型双向转换
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private JSONArray skuPropertiesName;

    @TableField(exist = false)
    private List<SkusSpec> specs;
}

XML查询SQL

<select id="getTSkuList" resultMap="skuList">
        select * from t_sku
        where book_id = #{bookId}
    </select>

    <resultMap id="skuList" type="org.dromara.library.domain.TSku">
        <!-- 转换JSONObject-->
        <result column="sku_properties"
                property="skuProperties"
        jdbcType="OTHER" javaType="com.alibaba.fastjson.JSONObject"
        typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" />
        <!-- 转换JSONArray-->
        <result column="sku_properties_name"
                property="specs"
                jdbcType="OTHER" javaType="com.alibaba.fastjson.JSONArray"
                typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" />
    </resultMap>
属性名称作用
column数据库表中列名
propertyJava实体类中的属性名
jdbcType数据库字段的JDBC类型,这里是OTHER表示字段的类型不是JDBC标准类型
javaType映射到Java实体类属性类型
typeHandler自定义类型处理器,主要负责Java类型和JDBC类型之间进行转换

java返回结果展示

"code": 200,
    "msg": "操作成功",
    "data": [
        {
            "id": 1,
            "bookId": 11,
            "inventory": 10,
            "oldPrice": "100.00",
            "picture": "http://xx.xx.xxx.xx:xx/ttbook/2024/02/28/bc4d02cc21974b85aceb9c4aa55b8b66.jpg",
            "price": "49.00",
            "skuCode": "TT001",
            "skuProperties": {
                "1": "1",
                "2": "3"
            },
            "specs1": "1",
            "specsValue1": "1",
            "specs2": "2",
            "specsValue2": "3",
            "skuPropertiesName": null,
            "specs": [
                {
                    "valueName": "十宗罪1",
                    "name": "系列"
                },
                {
                    "valueName": "不恐怖",
                    "name": "版本"
                }
            ]
        }

首先,要知道一个概念,就是mybatis-plus执行SQL查询的过程

  1. 构建SQL语句:编写SQL语句,在xml中或使用注解定义SQL。参数占位符:使用#{}或 ${}来插入动态参数
  2. 参数绑定:在执行SQL查询之前,使用TypeHandler将Java类型转换成JDBC类型。例如String -> varchar, Date -> TIMESTAMP
  3. 预编译SQL:使用PreparedStatement预编译SQL语句,将参数替换成占位符。
  4. 执行SQL:执行预编译后的SQL语句,从 数据库中获取结果集
  5. 结构映射:
    1. mybatis:通过ResultMap配置,将数据库结果集中的列值映射到Java对象的属性上
    2. 结果映射中同样会使用TypeHandler来处理从数据库类型到Java类型的转换
    3. 如果结果 集中的列是一个JSON字符串,而你想映射到一个com.alibaba.fastjson.JSONObject对象,这时可以使用自定义的TypeHandler(FastjsonTypeHandler 针对JSON字段使用)来进行转换
  6. 构建对象:根据映射配置,mybatis会遍历结果集,并为每一行数据创建一个Java对象实例,将结果集中对应的列填充到对象的属性中。

知道这个概念之后,只要利用typeHandler来指定javaType类型为JSONObject或JSONArray就可以实现映射了!!

附加功能: Mybatis 一对多映射

SQL结果集

3	系列	十宗罪1	6	第一部	  1	测试地址
3	系列	十宗罪2	7	第二部	  1 测试地址
4	版本	恐怖	     8	 真恐怖   1 测试地址
4	版本	不恐怖	    9	真不恐怖  1	测试地址

最终结果:

 "data": [
        {
            "id": "3",
            "name": "系列",
            "values": [
                {
                    "id": "6",
                    "name": "十宗罪1",
                    "picture": "测试地址",
                    "available": "1",
                    "desc": "第一部"
                },
                {
                    "id": "7",
                    "name": "十宗罪2",
                    "picture": "测试地址",
                    "available": "1",
                    "desc": "第二部"
                }
            ]
        },
        {
            "id": "4",
            "name": "版本",
            "values": [
                {
                    "id": "8",
                    "name": "恐怖",
                    "picture": "测试地址",
                    "available": "1",
                    "desc": "真恐怖"
                },
                {
                    "id": "9",
                    "name": "不恐怖",
                    "picture": "测试地址",
                    "available": "1",
                    "desc": "真不恐怖"
                }
            ]
        }
    ]

resultMap实现一对多

<!--    查询规格 属性值 -->
    <select id="getSpecsList" resultMap="specsList">
        SELECT
            t4.id  as id,
            t4.`name` as name,
            t3.`name` as nameValue,
            t3.id as idValue,
            t3.`desc` as `desc`,
            t3.available as available,
            t3.picture as picture
        FROM
            book_specs_value t2
                JOIN t_specs_value t3 ON t2.specs_value_id = t3.id
                JOIN t_specs t4 ON t2.specs_id = t4.id
        WHERE
            t2.book_id = #{bookId}
    </select>

    <!-- 一对多 -->
    <resultMap id="specsList" type="org.dromara.app.appojo.aojo.details.Specs">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <collection property="values" ofType="org.dromara.app.appojo.aojo.details.SpecsValue">
            <id column="idValue" property="id" ></id>
            <result column="nameValue" property="name"></result>
            <result column="desc" property="desc"></result>
            <result column="picture" property="picture"></result>
            <result column="available" property="available"></result>
        </collection>
    </resultMap>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java 商机管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 商机管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

跨越边界:Compose Multiplatform 跨平台开发的未来之路

跨越边界&#xff1a;Compose Multiplatform 跨平台开发的未来之路 1. 引言 在移动应用和软件开发领域&#xff0c;跨平台开发一直是一个备受关注的话题。随着移动设备多样化和用户需求的不断增长&#xff0c;开发者们迫切需要一种在多个平台上共享代码的解决方案。Jetpack C…

深入浅出JVM(十七)之并发垃圾收集器CMS

上篇文章介绍用户线程与GC线程并发执行时可能产生的问题以及使用三色标记法演示原始快照和增量更新两种解决方案 这篇文章将主要介绍并发垃圾收集器中的CMS&#xff0c;其中CMS使用增量更新来解决对象消失问题&#xff0c;如果不了解增量更新的同学可以查看上篇文章深入浅出JV…

oracle with check option 学习

with check option保证了通过视图进行的修改&#xff0c;必须也能通过该视图看到修改后的结果&#xff1b; 你插入&#xff0c;那么插入这条记录在刷新视图后必须可以看到&#xff1b; 如果修改&#xff0c;修改完的结果也必须能通过该视图看到&#xff1b; scott登录了以后创…

day04_拦截器Apifox角色管理(登录校验,API接口文档,权限管理说明,角色管理,添加角色,修改角色,删除角色)

文章目录 1. 登录校验1.1 需求说明1.2 实现思路1.3 ThreadLocal1.4 AuthContextUtil1.5 拦截器使用1.5.1 拦截器开发1.5.2 拦截器注册 1.6 代码优化1.6.1 配置优化1.6.2 代码优化1.6.3 前端修改 2. API接口文档2.1 Apifox接口管理平台2.1.1 接口管理平台简介2.1.2 Apifox简介2.…

minGW-64-win使用

本文适用于win7 win10。 下载 官网下载地址&#xff1a;MinGW-w64 - for 32 and 64 bit Windows - Browse /mingw-w64/mingw-w64-release at SourceForge.net 不过我下了exe安装版报错&#xff0c;如下图&#xff0c;所以最后选择了zip方式。 zip版本解压 配置环境变量 ;C…

自定义el-dialog的样式

实现效果&#xff1a; 样式代码如下&#xff1a;&#xff08;可以写在common.scss文件夹中&#xff09; .el-dialog__header {padding: 16px 20px;border-bottom: 1px solid #DCDFE6;display: flex;align-items: center;.el-dialog__title {font-size: 16px;position: relativ…

Flask基础学习4

19-【实战】问答平台项目结构搭建_剪_哔哩哔哩_bilibili 参考如上大佬的视频教程&#xff0c;本博客仅当学习笔记&#xff0c;侵权请联系删除 问答发布的web前端页面实现 register.html {% extends base.html %}{% block head %}<link rel"stylesheet" href&qu…

C++ 反向迭代器的设计与实现

在本文开始之前&#xff0c;先明晰几个 关键词 的含义&#xff08;T : 模板参数&#xff09;&#xff1a; Ref : T& / const T&Ptr : T* / const T* 一、反向迭代器设计的上帝视角 我们希望将 反向迭代器 设计成一种适配器——传 list::iterator 得到 list 的反向迭代…

批量剪辑利器:轻松调整视频画面尺寸,打造专业级视听体验!

在数字时代&#xff0c;视频已成为我们生活中不可或缺的一部分。无论是制作个人Vlog、企业宣传片&#xff0c;还是进行专业的影视剪辑&#xff0c;调整视频画面的高度和宽度都是至关重要的一步。然而&#xff0c;面对大量视频文件&#xff0c;如何快速、高效地调整画面尺寸呢&a…

第四十六回 扑天雕两修生死书 宋公明一打祝家庄- Python使用闭包来将单个方法的类转换成函数

原来那人是鬼脸儿杜兴&#xff0c;在蓟州受过杨雄的恩&#xff0c;目前在扑天雕李应家里做主管。杨雄和石秀去拜见李应&#xff0c;李应写了封信&#xff0c;派了副主管送去祝家庄请求放了石迁。结果人家不答应。 李应又派了杜兴去&#xff0c;杜兴被羞辱而回。李应亲自带着人…

python自动化管理和zabbix监控网络设备(防火墙和python自动化配置部分)

目录 前言 一、ssh配置 1.FW1 2.core-sw1 3.core-sw2 二、python自动化配置防火墙 三、验证DNAT 四、验证DNAT 前言 视频演示请访问b站主页 白帽小丑的个人空间-白帽小丑个人主页-哔哩哔哩视频 一、ssh配置 给需要自动化管理的设备配置ssh服务端用户名和密码 1.FW1 …

TSINGSEE青犀AI智能分析网关V4智慧油田安全生产监管方案

一、方案背景 随着科技的不断发展&#xff0c;视频监控技术在油田行业中得到了广泛应用。为了提高油田生产的安全性和效率&#xff0c;建设一套智能视频监控平台保障安全生产显得尤为重要。本方案采用先进的视频分析技术、物联网技术、云计算技术、大数据和人工智能技术&#…

AI PC:赋能个人电脑的人工智能革命

导语&#xff1a;AI PC是一种集成了人工智能&#xff08;AI&#xff09;技术的个人电脑&#xff0c;它不仅具备传统PC的功能&#xff0c;还具备AI算力和AI功能。AI PC的出现为用户带来了更便捷、智能的使用体验&#xff0c;推动了PC行业的发展。本文将介绍AI PC的定义、特点以及…

一、深度学习介绍

目录 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景

数学建模【分类模型】

一、分类模型简介 本篇将介绍分类模型。对于二分类模型&#xff0c;我们将介绍逻辑回归&#xff08;logistic regression&#xff09;和Fisher线性判别分析两种分类算法&#xff1b;对于多分类模型&#xff0c;我们将简单介绍SPSS中的多分类线性判别分析和多分类逻辑回归。 分…

nginx如何使用多个域名在一个服务器上指向多个服务

最近整了一个域名&#xff0c;想着就先把域名给放在自己的测试服务器上玩玩&#xff0c;但是自己又有多个服务&#xff0c;就打算搞几个二级域名来用&#xff0c;现在出一篇文章&#xff0c;把我的经验分享给大家吧&#xff0c;大致的内容是;如何生成二级域名&#xff0c;如何生…

Vivado Vitis 2023.2 环境配置 Git TCL工程管理 MicroBlaze和HLS点灯测试

文章目录 本篇概要Vivado Vitis 环境搭建Vivado 免费标准版 vs 企业版Vivado Windows 安装Vivado 安装更新 Vivado 工程操作GUI 创建工程打开已有工程从已有工程创建, 重命名工程GUI导出TCL, TCL复原工程TCL命令 Vivado 版本控制BlinkTcl脚本新建导出重建工程纯Verilog BlinkTc…

Linux alias命令(为复杂命令创建别名,其中命令可带选项或参数)

文章目录 Mastering the Linux alias Command&#xff08;精通Linux的alias命令&#xff09;1. Understanding the alias Command&#xff08;理解alias命令&#xff09;示例Ubuntu20.04 arm操作系统OpenEuler20.03 arm操作系统 2. Basic Usage of alias&#xff08;alias的基本…

k8s初始化报错 [ERROR CRI]: container runtime is not running: ......

一、环境参数 linux系统为centos7kubernetes版本为v1.28.2containerd版本为1.6.28 二、报错内容 执行初始化命令kubeadm init命令时报错&#xff0c;内容如下 error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR CRI]: container runtime is…