数据库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.hqwc.cn/news/499121.html

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

相关文章

推荐几款优秀免费开源的导航网站

&#x1f9a9;van-nav 项目地址&#xff1a;van-nav项目介绍&#xff1a;一个轻量导航站&#xff0c;汇总你的所有服务。项目亮点&#xff1a;全平台支持&#xff0c;单文件部署&#xff0c;有配套浏览器插件。效果预览 &#x1f9a9;发现导航 项目地址&#xff1a;nav项目…

Spring Cloud2022之OpenFeign使用以及部分源码分析

OpenFeign使用 Feign和OpenFeign Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端&#xff0c;可以使用⽤它来发起请求&#xff0c;进行远程调用。Fegin是以Java接口注解的⽅式调⽤Http请求&#xff0c;而不是像RestTemplate那样&#xff0c;在Java中通过封装HTTP请求…

android开发技术论文,Android中为什么需要Handler

前言 马爸爸总结了一句话&#xff1a;跳槽&#xff0c;要么是钱不到位&#xff0c;要么是受了委屈。 我给自己这次的跳槽经历做了一个分析&#xff0c;希望能对那些想换工作的朋友有所帮助。 许多朋友想换工作&#xff0c;但是对“换工作”的理解可能仅限于写简历、投简历、…

信号系统之滤波器比较

比较 1&#xff1a;模拟与数字滤波器 大多数数字信号源自模拟电子设备。**如果需要对信号进行滤波&#xff0c;是在数字化之前使用模拟滤波器&#xff0c;还是在数字化后使用数字滤波器更好&#xff1f;**将通过两个对比来回答问题。 目标是提供 1 kHz的低通滤波器。模拟端是…

华为HarmnyOS TypeScript基础语法快速入门

华为HarmnyOS TypeScript基础语法快速入门 一、JavaScript、TypeScript、ArkTS二、TypeScript基础语法1. 基础类型2. 条件语句3. 函数4. 类5. 模块6. 迭代器 一、JavaScript、TypeScript、ArkTS ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&am…

程序员必备开发工具(IDE)推荐

程序员必备开发工具&#xff08;IDE&#xff09;推荐 1.Python语言程序员必备开发工具&#xff08;IDE&#xff09;推荐1.1 **IDLE**1.2 ⭐️PyCharm1.3 **Anaconda**1.4 **Jupyter Notebook**1.5 **Sublime Text** 2.C语言程序员必备开发工具&#xff08;IDE&#xff09;推荐2…

谷歌seo推广留痕怎么做?

​要有效地进行谷歌SEO推广并留下有效的痕迹&#xff0c;首先要理解GLB外推的核心概念&#xff0c;GLB外推是一种利用高权重平台和蜘蛛池技术&#xff0c;通过在这些平台上生成查询页面并推广这些链接&#xff0c;快速促使谷歌搜索引擎抓取和收录&#xff0c;从而达到搜索结果霸…

C语言 vs Rust应该学习哪个?

C语言 vs Rust应该学习哪个&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&am…

苍穹外卖Day03——总结3

前期文章 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day01——解决总结1中存在的问题https://lushimeng.blog.csdn.net/article/details/135473412苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/articl…

【Wireshark傻瓜式安装,Wireshark使用过滤条件】

Wireshark傻瓜式安装&#xff0c;Wireshark使用过滤条件 安装使用wireshark过滤器表达式的规则1.抓包过滤器语法和实例&#xff08;1&#xff09;协议过滤&#xff08;2&#xff09;IP过滤&#xff08;3&#xff09;端口过滤&#xff08;4&#xff09;逻辑运算符&&与、…

GCN 翻译 - 1

ABSTRACT 我们提出了一种可扩展的在以图结构为基础的数据上的半监督学习&#xff0c;这种方法直接作用在图数据上&#xff0c;可以看做是卷积神经网络的变种。我们选择了图谱理论里面的一阶近似作为我们的卷积结构。我们的模型能够随着图的规模线性伸缩&#xff0c;并且隐藏层…

R语言数学建模(二)—— tidymodels

R语言数学建模&#xff08;二&#xff09;—— tidymodels 文章目录 R语言数学建模&#xff08;二&#xff09;—— tidymodels前言一、示例数据集二、拆分数据集2.1 拆分数据集的常用方法2.2 验证集2.3 多层次数据2.4 其他需考虑问题 三、parsnip用于拟合模型3.1 创建模型3.2 …