数据库JSON类型到映射JAVA上

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_skuwhere 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">SELECTt4.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 pictureFROMbook_specs_value t2JOIN t_specs_value t3 ON t2.specs_value_id = t3.idJOIN t_specs t4 ON t2.specs_id = t4.idWHEREt2.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.mzph.cn/news/708869.shtml

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

相关文章

UV-K5

该方法是安装到python的安装目录了&#xff0c;建立项目的时候勾选 Inherit globel site-packages (使用全局的站点包) &#xff0c;就能调用安装路径的包文件环境。 cmd进入Dos窗口安装 pyserial 模块&#xff1a; pip install pyserial

阿里巴巴中国站获得公司档案信息 API 返回值说明

一、应用场景 阿里巴巴中国站获得公司档案信息 API接口的应用场景可以包括但不限于以下几种情况&#xff1a; 1、企业信息查询&#xff1a;API接口可用于查询企业的基本档案信息&#xff0c;如企业名称、注册地址、法定代表人、经营范围等。这些信息对于了解企业背景、信用状…

学习枚举

枚举 引入 编写季节类&#xff08;Season&#xff09;&#xff0c;该类只有四个对象&#xff08;spring&#xff0c;summer&#xff0c;autumn&#xff0c;winter&#xff09; 概念 枚举&#xff08;enum&#xff09;全称为 enumeration&#xff0c; 是 JDK 1.5 中引入的新特性…

Find Yourself

前言 2月份&#xff0c;真是发生了很多事情啊。 离职&#xff0c;放假&#xff0c;瞒着家人&#xff0c;过春节&#xff0c;陪女儿玩游戏&#xff0c;找工作&#xff0c;选择Offer。 也和别人一起解决了一个设备不稳定的重大问题。 每一项展开讲讲都能写一篇文章。 如果你感…

手机和windows的便签怎么共享账号使用

在忙碌的生活中&#xff0c;我经常需要在手机和电脑之间同步记事信息。可是&#xff0c;每次当我在手机上记下一些重要事项后&#xff0c;想要在电脑上查看或继续编辑时&#xff0c;总是遇到各种麻烦。因为手机和电脑上的便签软件各不相同&#xff0c;无法实现账号共享和内容同…

从0到1实现五子棋游戏!!

Hello&#xff0c;好久不见宝子们&#xff0c;今天来给大家更一个五子棋的程序~ 我们今天要讲的内容如下&#xff1a; 文章目录 1.五子棋游戏介绍1.1 游戏玩法介绍&#xff1a; 2.准备工作2.1 具体操作流程 3.游戏程序主函数4.初始化棋盘4.1.定义宏变量4.2 初始化棋盘 5.打印…

2024年2月最新微信域名检测拦截接口源码

这段PHP代码用于检测指定域名列表中的域名是否被封。代码首先定义了一个包含待检测域名的数组 $domainList&#xff0c;然后遍历该数组&#xff0c;对每个域名发送HTTP请求并检查响应内容以判断域名是否被封。 具体步骤如下&#xff1a; 1. 定义待检测的域名列表。 2. 遍历域名…

一、深度学习介绍

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

rust连接postgresql数据库

同步操作 引入crate&#xff1a; postgres "0.19.7" use postgres::{Client, NoTls, error::Error};fn main() -> Result<(), Error> {let mut client Client::connect("hostlocalhost port5432 dbnamexxxxxdb userpostgres password123456"…

优化全球应用交付,详解GLSB是什么?

伴随着互联网的快速发展&#xff0c;网站的流量请求甚至能达到上千亿&#xff0c;越来越多的用户不满足于在单一数据中心提供服务&#xff0c;开始考虑容灾、用户就近访问以及全球应用交付等问题。在这样的需求下&#xff0c;全局服务器负载均衡技术&#xff08;GSLB&#xff0…

Linux笔记--基本操作指令

一、查看日期与日历 1.date指令 显示日期 #用法1:dateCST: China Standard Time时区&#xff0c;中国标准时间 #用法2: date 指定格式 [常用格式]: "%Y-%m-%d"(%F): 2022-07-25 "%H:%M:%S"(%T): 14:53:44 "%F %T" #用法3: date -d "-1 da…

Python电能质量扰动信号分类(六)基于扰动信号特征提取的超强机器学习识别模型

目录 往期精彩内容&#xff1a; 前言 1 数据集和特征提取 1.1 数据集导入 1.2 扰动信号特征提取 2超强模型XGBoost——原理介绍 2.1 原理介绍 2.2 特征数据集制作 3 模型评估和对比 3.1 随机森林分类模型 3.2 支持向量机SVM分类模型 3.3 XGBoost分类模型 代码、数据…

智慧应急与物联网相结合:物联网技术如何提升智慧应急响应能力

目录 一、引言 二、智慧应急与物联网技术的结合 三、物联网技术提升智慧应急响应能力的途径 四、物联网技术在智慧应急中的应用案例 五、物联网技术在智慧应急中面临的挑战与解决方案 挑战一&#xff1a;技术标准与规范不统一 解决方案&#xff1a; 挑战二&#xff1a;…

工业锅炉物联网:HiWoo Cloud为工业能源转型注入新动力

随着全球工业化的快速发展&#xff0c;工业锅炉作为工业生产的“心脏”&#xff0c;其能源效率和运行安全性越来越受到关注。然而&#xff0c;传统的工业锅炉管理往往依赖于人工监控和定期维护&#xff0c;这种方式不仅效率低下&#xff0c;而且难以确保设备的持续高效运行。在…

Matlab如何批量读取txt数据?科研效率UpUp第1期

最近帮几个亲朋好友整理博士毕业论文。 期间&#xff0c;我观察了他们的行为模式&#xff0c;发现其将大量的时间&#xff0c;不同程度地浪费在一些机械、重复性劳动上&#xff0c;导致效率低下。 博士尚且如此&#xff0c;想必还有很多人也深受其扰。 作为一个专业摸鱼人&a…

分享:大数据信用报告查询的价格一般要多少钱?

现在很多人都开始了解自己的大数据信用了&#xff0c;纷纷去查大数据信用报告&#xff0c;由于大数据信用与人行征信有本质的区别&#xff0c;查询方式和价格都不是固定的&#xff0c;本文就为大家详细讲讲大数据信用报告查询的价格一般要多少钱&#xff0c;希望对你有帮助。 大…

MySql-索引失效的情况

1.模糊查询时%在开头 当使用模糊查询&#xff08;如使用 LIKE %keyword%&#xff09;时&#xff0c;如果通配符 % 出现在搜索关键字的开头&#xff0c;那么索引将无法被有效利用&#xff0c;从而导致索引失效。 当通配符出现在搜索关键字的开头时&#xff0c;索引失效的主要原…

如何用golang写一个自己的后端框架

如果你想要不使用任何现有的后端框架,完全从头开始创建一个后端框架,你需要实现Web服务器的基本组件,比如路由器、请求处理、中间件支持等。以下是一个简单的指南,用于创建一个基本的、不使用任何外部框架的Go后端框架。 步骤 1: 设置工作环境 确保你已经安装了Go语言环境…

vue3 实现一个简单的输入框

需求背景 需要一个输入框&#xff0c;可以输入文字&#xff0c;添加表情&#xff0c;一开始用了富文本编辑器&#xff0c;有点大材小用&#xff0c;所以自己封装一个输入框组件。支持输入文字&#xff0c;选择表情/插入表情&#xff0c;支持组合键换行&#xff0c;使用enter 进…

模块化学习

CommonJS 全局变量污染依赖混乱 模块化的标准&#xff1a; CommonJS CMJ 社区标准 node环境ES Module ESM 官方标准 CMJ规范&#xff1a; 所有的 js 文件都是一个模块 运行的模块 入口模块所有的模块中的全局变量、函数&#xff0c;均不会产生污染当一个模块需要提供一些东西给…