SpringMVC结合设计模式:解决MyBatisPlus传递嵌套JSON数据的难题

🎉🎉欢迎光临,终于等到你啦🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 🚀

本专栏带你从Spring入门到入魔 

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/


引出

我们经常会遇到需要传递对象的场景。有时候,我们需要将一个对象的数据传递给另一个对象进行处理,但是又不希望直接暴露对象的内部结构和实现细节。这时,我们可以使用模板模式来实现优雅的对象传递。

为了实现这个场景,我们可以使用模板模式。

模板模式是一种行为设计模式,它定义了一个抽象类或接口作为模板,其中包含了一个或多个抽象方法,用于定义算法的骨架。具体的子类可以根据需要实现这些抽象方法,从而完成算法的定制化

说说我这边的起因

大概是这样的 要做一个问卷系统 这个问卷里面包含各种各样的标签和因子  就使得 属性里面又包含属性 对象里面又嵌套数组 数组里面又有对象  遇到这种情况相信大家都会很头疼吧   那这种时候很多人就要开始写Mapper了  这里我提出一个大大节约时间的方法  类型构造器

设计模式的引入

我们知道 每一个属性需要引入一个新的类型构造器 那就要根据他的具体情况重写一个 那岂不是代码量指数级上涨?

还有很多...各种嵌套 于是我想 有没有一种办法能规定好所有的嵌套方法的逻辑  然后他们只需要说明自己是什么类型 就能套进去?

有  就是今天要说的 模板方法

先定义一个通用的模板


public class JsonArrayHandler<T> extends BaseTypeHandler<List<T>> {private Class<T> type;public JsonArrayHandler() {// 添加无参构造函数}public JsonArrayHandler(Class<T> type) {if (type == null) {throw new IllegalArgumentException("Type argument cannot be null");}this.type = type;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, JSONArray.toJSONString(parameter));}@Overridepublic List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {String json = rs.getString(columnName);return parseJsonArray(json);}@Overridepublic List<T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String json = rs.getString(columnIndex);return parseJsonArray(json);}@Overridepublic List<T> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String json = cs.getString(columnIndex);return parseJsonArray(json);}private List<T> parseJsonArray(String json) {JSONArray jsonArray = JSONArray.parseArray(json);return jsonArray.toJavaList(type);}
}

让我逐点解释其妙处:

  1. 泛型支持:public class JsonArrayHandler<T> extends BaseTypeHandler<List<T>> 中的 <T> 表示这是一个泛型类,可以适用于不同类型的 JSON 数组字段。通过使用泛型,可以在运行时指定具体的类型,使得处理不同类型的 JSON 数组变得更加灵活和通用。

  2. 构造函数重载:public JsonArrayHandler() 是一个无参构造函数,而 public JsonArrayHandler(Class<T> type) 是一个有参构造函数。通过提供两个构造函数,可以灵活地创建 JsonArrayHandler 的实例。无参构造函数用于在不知道具体类型时创建实例,而有参构造函数用于在已知类型时创建实例。

  3. 参数设置:setNonNullParameter 方法用于将 Java 对象转换为存储在数据库中的 JSON 字符串。在这里,使用了阿里巴巴的 FastJSON 库将 List<T> 对象转换为 JSON 字符串,并将其设置到 PreparedStatement 对象中。

  4. 结果获取:getNullableResult 方法用于从数据库中获取 JSON 字符串,并将其转换回 List<T> 对象。在这里,使用了 FastJSON 库将 JSON 字符串解析为 JSONArray,然后将其转换为 List<T> 对象。

有了这一个模板 那么剩下来的就是 直接使用他!

这里浅浅给出我业务中的6个例子

  1. 商品分类:数据库中的 category_ids 字段存储了商品所属的分类列表。使用自定义 TypeHandler,可以将 Java 对象的 List<Category> 直接映射到数据库的 JSON 字符串,并在读取时将 JSON 字符串转换回 List<Category>。

    public class CategoryHandler extends JsonArrayHandler<Category> {public CategoryHandler() {super(Category.class);}
    }

  2. 用户角色:数据库中的 role_ids 字段存储了用户所拥有的角色列表。使用自定义 TypeHandler,可以将 Java 对象的 List<Role> 直接映射到数据库的 JSON 字符串,并在读取时将 JSON 字符串转换回 List<Role>。

    public class RoleHandler extends JsonArrayHandler<Role> {public RoleHandler() {super(Role.class);}
    }

  3. 订单商品列表:数据库中的 order_items 字段存储了订单中的商品列表。使用自定义 TypeHandler,可以将 Java 对象的 List<OrderItem> 直接映射到数据库的 JSON 字符串,并在读取时将 JSON 字符串转换回 List<OrderItem>。

    public class OrderItemHandler extends JsonArrayHandler<OrderItem> {public OrderItemHandler() {super(OrderItem.class);}
    }

  4. 图片列表:数据库中的 image_urls 字段存储了一组图片的 URL 列表。使用自定义 TypeHandler,可以将 Java 对象的 List<String> 直接映射到数据库的 JSON 字符串,并在读取时将 JSON 字符串转换回 List<String>。

    public class ImageHandler extends JsonArrayHandler<String> {public ImageHandler() {super(String.class);}
    }

  5. 标签列表:数据库中的 tags 字段存储了一组标签。使用自定义 TypeHandler,可以将 Java 对象的 List<Tag> 直接映射到数据库的 JSON 字符串,并在读取时将 JSON 字符串转换回 List<Tag>。

    public class TagHandler extends JsonArrayHandler<Tag> {public TagHandler() {super(Tag.class);}
    }

  6. Answer 类是一个答案类,包含了答案内容 answer 和分数 score 两个字段。Questionnaire 类是一个问卷调查类,其中包含了一些字段,包括主键 id、问题编号 qid、答案 answer、问题名称 qname、问题描述 question、标签 tab 、 ans。在 ans 字段上,使用了 @TableField 注解,并设置了 typeHandler = AnswerHandler.class,指定了使用 AnswerHandler 这个自定义的 TypeHandler 来处理该字段。

public AnswerHandler(Class<Answer> type) {super(Answer.class);
}
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("tb_questionnaire")
public class Questionnaire {/*** 主键*/@TableId(value = "id", type = IdType.AUTO)private Long id;private int qid;private String answer;private String qname;private String question;private String tab;@TableField(exist = false,typeHandler = AnswerHandler.class)private List<Answer> ans;public void setAnswer() {this.answer = JSONUtil.toJsonStr(ans);}public void setAnswerList() {this.ans = JSONUtil.toList(answer,Answer.class);answer=null;}
}

查询

这样就不用写复杂的Mapper 和sql语句 也能轻松查询嵌套的复杂的JSON数据啦

实现效果

这样就形成了复杂的嵌套的数据的自动构造

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

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

相关文章

Spark杂谈

文章目录 什么是Spark对比HadoopSpark应用场景Spark数据处理流程什么是RDDSpark架构相关进程入门案例&#xff1a;统计单词数量Spark开启historyServer 什么是Spark Spark是一个用于大规模数据处理的统一计算引擎Spark一个重要的特性就是基于内存计算&#xff0c;从而它的速度…

LSS (Lift, Splat, Shoot)

项目主页 https://nv-tlabs.github.io/lift-splat-shoot 图1&#xff1a;本文提出一种模型&#xff0c;给定多视角相机数据 (左)&#xff0c; 直接在鸟瞰图 (BEV) 坐标系(右)中推理语义。我们展示了车辆分割 (蓝色)&#xff0c;可驾驶区域 (橙色) 和车道分割 (绿色) 的结果。然…

C语言项目:数组与函数实践:扫雷游戏

目录 目录&#xff1a; 1.扫雷游戏分析与设计 1.1扫雷游戏的功能说明&#xff1a; 1.1.1使用控制台实现经典扫雷的游戏 1.1.2游戏可以通过菜单实现继续玩或者退出游戏 1.1.3扫雷棋盘是9*9的格子 1.1.4默认随机布置10个雷 1.1.5 可以排查雷 2.扫雷游戏的代码实现 1.遇到的问题…

项目文章|真菌ChIP-seq+RNA-seq解析脱落酸生物合成的调控机制

组蛋白翻译后修饰是表观遗传调控的主要机制之一&#xff0c;已被证明在基因表达的调控中发挥重要作用&#xff0c;参与真菌发育、感染相关的形态发生、环境应激反应、次级代谢产物的生物合成和致病性。我们分享过不少真菌组蛋白修饰的文章&#xff0c;今天接着带来一篇利用ChIP…

Anaconda安装proplot库

看了一下Anaconda中的环境&#xff0c;现在我有4个&#xff0c;其中gee是一个虚拟环境 因此一般在prompt中装库时要先进入其中一个虚拟环境 conda activate geepip install proplot --no-deps下完了之后&#xff0c;发现版本不对应 conda install matplotlib3.4.3

软件开发项目管理/研发项目管理软件:国产EDA工具厂商行芯科技上线奥博思PowerProject项目管理软件平台

国内领先的EDA工具链提供商杭州行芯科技有限公司&#xff08;以下简称&#xff1a;行芯科技&#xff09;与北京奥博思软件技术有限公司达成战略合作&#xff0c;奥博思软件将基于PowerProject项目管理系统助力行芯科技实现研发项目的全生命周期管理&#xff0c;提升管理效能&am…

论文阅读:Face Deblurring using Dual Camera Fusion on Mobile Phones

今天介绍一篇发表在 ACM SIGGRAPH 上的文章&#xff0c;是用手机的双摄系统来做人脸去模糊的工作。这也是谷歌计算摄影研究组的工作。 快速运动物体的运动模糊在摄影中是一个一直以来的难题&#xff0c;在手机摄影中也是非常常见的问题&#xff0c;尤其在光照不足&#xff0c;…

jasypt加解密

项目中经常遇到jasypt加解密的配置文件&#xff0c;尤其是项目不是自己创建的时候&#xff0c;压根不知道加密的内容是什么&#xff0c;而配置文件中一般加密的也都是数据库或其他非结构型数据库的账号或密码&#xff0c;这时候想要看一下db的内容就非常的头疼&#xff0c;除了…

【爬虫】– 抓取原创力文档数据

使用RPA工具&#xff0c;实现针对于原创力中不可下载文档的抓取&#xff0c;可延用于其他类似文库 1 使用工具、环境 影刀RPA、WPS Office、谷歌浏览器&#xff08;非指定&#xff09; 2 代码流程 3 关键点 此方案只适合抓取非VIP即可预览全文的文档&#xff0c;抓取下来的数…

B007-springcloud alibaba 消息驱动 Rocketmq

目录 MQ简介什么是MQMQ的应用场景异步解耦流量削峰 常见的MQ产品 RocketMQ入门RocketMQ环境搭建环境准备安装RocketMQ启动RocketMQ测试RocketMQ关闭RocketMQ RocketMQ的架构及概念RocketMQ控制台安装 消息发送和接收演示发送消息接收消息 案例订单微服务发送消息用户微服务订阅…

(done) 解释 python3 torch.utils.data DataLoader

特别注意&#xff1a;DataLoader 返回的迭代器是无尽的&#xff0c;依据如下 (CHATGPT3.5) DataLoader 返回的迭代器默认情况下是无尽的&#xff0c;因为它会无限地循环遍历数据集&#xff0c;以提供批量的数据。在训练神经网络时&#xff0c;通常会使用无尽的迭代器来循环遍历…

LEETCODE 100255. 成为 K 特殊字符串需要删除的最少字符数

整体思路: 1.可以看到这道题是要求是最小的&#xff0c;那么可以想到遍历所有情况 2.把题干已知条件转换为一个数组&#xff0c;那么只需要以数组每个元素为开头遍历所有情况即可。 3.对于一个数考虑其后面的情况&#xff0c;其后每个数等于这个数k和数本身的最小值(遍历累计求…

参数高效微调(PEFT)技术概览

参数高效微调&#xff08;PEFT&#xff09;技术概览 在大型语言模型&#xff08;LLMs&#xff09;的世界里&#xff0c;参数量庞大&#xff0c;通常在70亿至700亿之间。这些模型的自监着训练成本高昂&#xff0c;对公司可能意味着高达1亿美元的支出。而对于资源相对有限的研究…

Codeforces Round 934 (Div. 2) --- C. MEX Game 1 --- 题解

C. MEX Game 1&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 重要的是那种只有一个的数字&#xff0c;因为如果这个数字有两个及以上&#xff0c;那么我可以再鲍勃删除之后&#xff0c;再拿&#xff0c;也一定能拿得到&#xff0c;所以瓶颈是只有一个的数字&#x…

爬虫3_爬取翻页URL不变的网站

之前实现了对大学排数据爬取&#xff1a;爬虫2_2019年549所中国大学排名. 近期复现代码&#xff0c;发现原网站升级&#xff0c;在翻页时&#xff0c;发现URL不改变&#xff0c;修改代码&#xff0c;使用网页自动化工具selenium实现对该类网站数据获取。 #-*- coding: UTF-8 -…

活动图高阶讲解-06

31 00:01:52,300 --> 00:02:04,300 刚才讲了&#xff0c;活动里面是动作 32 00:02:04,300 --> 00:02:06,300 这个动作 33 00:02:06,300 --> 00:02:09,300 就可以看作活动的一个 34 00:02:09,300 --> 00:02:13,300 里面的实现的一个行为了 35 00:02:16,300 --&g…

vue项目跳转html页面

1. 把html页面以及相关文件放到public文件夹下&#xff08;目的和index.html同级&#xff09; 2.在vue项目中正常写跳转事件&#xff0c;只是路径写法需要注意

【理解指针(三)】

文章目录 一、数组名的理解&#xff08;1&#xff09;数组的地址与数组首元素地址的区别 二、使用指针访问数组&#xff08;1&#xff09;一维数组传参的本质 三、冒泡排序&#xff08;1&#xff09;什么是冒泡排序&#xff08;2&#xff09;写冒泡排序 四、结束语 一、数组名的…

堆排序(向下调整法,向上调整法详解)

目录 一、 二叉树的顺序结构 二、 堆的概念及结构 三、数组存储、顺序存储的规律 此处可能会有疑问&#xff0c;左右孩子的父节点计算为什么可以归纳为一个结论了&#xff1f; 四、大小堆解释 五、大小堆的实现&#xff08;向上和向下调整法&#xff09; 5.11向上调整法…

Unity Timeline学习笔记(1) - 创建TL和添加动画片段

Timeline在刚出的时候学习了一下&#xff0c;但是因为一些原因一直都没用在工作中使用。 版本也迭代了很久不用都不会用了&#xff0c;抽时间回顾和复习一下&#xff0c;做一个笔记后面可以翻出来看。 创建Timeline 首先我们创建一个场景&#xff0c;放入一个Plane地板&#…