springbootmybatis中数组和字符串数据类型的转换

news2024/11/15 7:37:21

需求

前端(VUE)页面上有一个可多选的select控件,前端以数组形式存储被选中的数据,但是数据库中不想新建表来存储,希望在主表中用以逗号为分隔符的字符串来存。

于是在存储和读取数据的时候就涉及到数据类型转换的问题:

  1. 存储时前端的数组需要转换成以逗号分隔的字符串给数据库;
  2. 读取时从数据库中读取的字符串数据需要转成数组给前端

针对1,可以在前端调用存储接口之前,就先转换成字符串,再作为参数传给存储接口;

针对2,可以在后端从数据库中读出来之后,转换成字符串,再返回给前端。

但是这样做的弊端,主要是1,前端每次调用后端接口的时候,都需要自行拼接一下字符串作为参数,我觉得不太方便,也不便于后期维护。

关于数据类型转换的思考:

  1. 前端的所有数据,其实都是字符串,大多数时候使用json格式传送。但是传给后台接口的时候,我们是在controller中用一个java对象来接收的;
  2. 数据库中的数据,是jdbc格式,但是同样,需要与1中的java对象互相转换。

基于这两个初步认知,简单学习了一下springboot和mybatis框架在数据转换中的作用(这就是框架的好处吧,不声不响地为我们做了很多事情)。

基础知识学习

springboot

在Spring Boot项目中,通常会按照一定的分层结构来组织代码和资源文件。

常见的Spring Boot项目目录分层结构:

根目录(Root)
  • 包含项目配置文件(如pom.xml、build.gradle等)
  • 可以包含一些通用的配置和资源文件
src目录(Source)
  • main目录:包含主要的源代码和资源文件
    • java目录:包含Java源代码
      • com.example.application:包含应用程序的入口点和配置类
      • com.example.controller:包含Web层控制器类
      • com.example.service:包含业务逻辑和服务类
      • com.example.repository:包含数据访问和持久化类
      • com.example.entity:包含实体类
    • resources目录:包含应用程序的资源文件(如配置文件、静态资源、模板文件等)
test目录
  • java目录:包含测试用例的Java源代码
  • resources目录:包含测试用例的资源文件
target目录
  • 包含编译后的代码和打包后的应用程序文件

分层的作用

这种分层结构的作用主要是为了将不同的逻辑功能模块划分清楚,有利于代码的维护和扩展。每一层都有其特定的职责和作用,例如:

  • 应用程序入口点和配置类(com.example.application):负责初始化Spring Boot应用程序的各个组件,包括配置数据源、扫描并注册Bean、启动Web服务器等。
  • Web层控制器类(com.example.controller):负责处理HTTP请求,调用业务逻辑和服务类,并返回响应结果给客户端。
  • 业务逻辑和服务类(com.example.service):负责处理具体的业务逻辑,包括数据处理、业务规则验证、事务管理等。
  • 实体类(com.example.entity):用于表示业务领域的对象,与数据库中的表结构对应。

通过合理的分层结构可以使代码结构更加清晰,便于团队开发和后期维护,同时也符合软件设计的开闭原则和单一职责原则。

前端数据与springboot java数据类型转换

从上面可见,在Spring Boot中,前端数据通常以JSON格式发送到后端,后端Web层控制器类(com.example.controller)中,根据使用的注解(比如@RequestBody)确定传参方式,并调用对应的内置类型转换器,来将前端传来的参数转换成相应的对象来接收这些数据(据说有124个内置转换器,在在 GenericConverter 接口的内部类 ConvertiblePair 中),但是,其中很重要的一点是,当我们使用我们自定义的实体类对象来接收的时候,会调用实体类中的set/get函数

mybatis

前端数据转换成java对象,进行符合业务逻辑的处理之后,需要访问数据库进行长久化存储。同样,也需要从数据库中读取,传给前端进行展示。那么,与数据库交互部分,使用的就是mybatis,它同样需要使用前面实体类中的set/get来实现数据库jdbc格式的数据与java对象之间的转换。

思路整理

基于以上基本概念的了解,思路整理如下:

所以,焦点就在实体类Module中

1、定义一个与前端交互的的对象devIdList

2、定义一个与数据库交互的对象devIds

3、接收前端数据时,同时将值赋给devIds,以便传给数据库做存储

4、从数据库读取数据后,转成List格式并存储在devIdList,以便传给前端

实现

1、前端参数

form:{
    docName:"",
    devIdList:[]
}

2、controller中:使用实体类接收参数

@RestController
@PostMapping(value = "/add")
public R<String> add(@RequestBody Module module){        
    moduleService.AddModule(module);
    return R.ok("success");        
}

3、数据库中字段:

dev_idsvarchar(200)

4、实体类定义(关键)

public class Module {    
    private List<String> devIdList; //前端数组字段
    private String devIds;  //数据库中字段

    /*与前端交互时使用的get/set*/
    public List<String> getDevIdList() {
        return devIdList;
    }
    

    public void setDevIdList(List<String> devIdList) {
        this.devIds = String.join(",",devIdList);
        this.devIdList = devIdList;
        System.out.println("接收前端数据");
    }
    /*与前端交互时使用的get/set*/

    /*与数据库交互时使用的get/set*/
    public String getDevIds() {
        return devIds;
    }

    public void setDevIds(String devIds) {
        this.devIds = devIds;
        this.devIdList = Arrays.asList(devIds.split(","));
        System.out.println("从数据库中读取数据");
    }
    /*与数据库交互时使用的get/set*/
    
}

总结

以上,从前端接收数据时,因前端字段名称为devIdList,会自动调用 setDevIdList,将接收到的数组转成字符串并赋值给Java变量devIds,这样在与数据库交互时,因数据库字段名为dev_ids,会自动调用getDevIds,获取到字符串变量devIds的值,并存储。

从数据库读取数据时,根据字段名称,调用setDevIds,将jdbc格式的数据转换成Java的数组变量devIdList,转换成给前端的响应报文时,将根据前端的变量名devIdList,调用getDevIdList,获取到数组变量的值。从而可以使数据库的字符串变量正确地转换成前端需要的数组,来进行业务逻辑处理。

经过这一些列的转换,前端的数组和后端的逗号分隔的字符串,就在读取和存储间自动完成了。前端在调用存取接口的时候,就不需要再额外地考虑类型转换的问题了。

这只是一个例子,通过这个例子,对springboot中的实体类有了更进一步的了解。

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

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

相关文章

现在别买MPV,比亚迪“夏”来搅局了

文 | AUTO芯球 作者 | 雷慢 买MPV的今年千万别出手&#xff0c; MPV市场可能要变天了。 来&#xff0c;看这个&#xff0c;比亚迪刚刚在成都车展上发布了第一款MPV“夏”&#xff0c; 标准的中大型尺寸&#xff0c; 长5145mm&#xff0c;宽1970mm&#xff0c;高1805mm 主…

学院个人信息|基于SprinBoot+vue的学院个人信息管理系统(源码+数据库+文档)

学院个人信息管理系统基于SprinBootvue的学院个人信息管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 学生模块实现 教师模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

『功能项目』技能爆炸与伤害数值显示【13】

我们打开上一篇12怪物受击后显示受击状态UI的项目&#xff0c; 本章要做的事情是显示魔法球碰撞到怪物时产生的技能爆炸特效 与 显示伤害数值的功能 首先打开资源商店下载一个免费的技能特效 我们双击red技能效果预制体 我们要做的是当怪物受击时&#xff0c;生成这个red预制体…

公务员面试(c语言)

1./ 描述 //公务员面试现场打分。有7位考官&#xff0c;从键盘输入若干组成绩&#xff0c;每组7个分数&#xff08;百分制&#xff09;&#xff0c;去掉一个最高分和一个最低分&#xff0c;输出每组的平均成绩。 //&#xff08;注&#xff1a;本题有多组输入&#xff09; //输入…

Trying to update a textarea with string from an OpenAI request

题意&#xff1a;把从 OpenAI 请求中得到的字符串更新到一个文本区域中。 问题背景&#xff1a; Can anyone assist me with an issue Im facing. Im trying to append a string received back from an OpenAI request to an exisitng textarea element. The requested string…

【ESP-IDF FreeRTOS】信号量

下一个内容&#xff0c;信号量。 先包含头文件。 #include "freertos/semphr.h" 我们通过队列可以进行任务间的数据传递&#xff0c;也可以通过队列来控制任务间的同步。如果我只需要控制任务而不需要传递数据&#xff0c;那么我们完全可以用信号量来代替队列。 …

VS2019开发CAN上位机

1、CAN分析仪&#xff0c;主要功能就是把CAN信号转换成电脑能接收的USB信号。索引号是指电脑连接了几台CAN分析仪设备&#xff0c;一般情况下都是一台&#xff0c;该值为0。不同CAN盒的二次开发文件不同 2、CAN上位机一般只能适应一个CAN盒&#xff0c;如果需要实现多个CAN盒通…

Elasticsearch - SpringBoot 查询 es 相关示例

文章目录 前言Elasticsearch - SpringBoot 查询 es1. ES 整合2. 示例-简单匹配查询3. 示例-简单范围查询4. 示例-布尔查询-分页查询-match 查询5. 示例-布尔查询-分页查询-term查询 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三…

深度学习的基础_多层感知机的手动实现

多层感知机&#xff08;Multilayer Perceptron&#xff0c;简称MLP&#xff09;是一种前馈人工神经网络。它包含至少三层节点&#xff1a;一个输入层、一个或多个隐藏层以及一个输出层。除输入节点外&#xff0c;每个节点都是一个带有非线性激活函数的神经元&#xff08;或称为…

c# net8调用vc写的dll

dll程序&#xff08;vc,x86) 头文件 extern "C" int __declspec(dllexport) WINAPI add(int a, int b);实现 int WINAPI add(int a, int b) {return a b; }c#/net8 函数声明&#xff1a; [DllImport("dll/Dll1.dll", CallingConvention CallingCo…

redis的一些重要的基础知识

文章目录 1. rehash1.1 redis的hash表的数据结构 2. AOF日志2.1 简要介绍2.2 AOF重写 3. RDB快照3.1 执行过程3.2 存在问题解决方式 1. rehash 本文只介绍数据结构和结果图&#xff0c;如果要看文字描述过程&#xff0c;可以参考链接&#xff1a;rehash的详细过程 1.1 redis的…

最近 3 个 火火火火 的开源项目!

01 为你的敏感照片添加安全水印 EasyWatermark 是由开发者 rosuH 发起的一个开源项目&#xff0c;旨在帮助用户安全、轻松地为他们的照片添加水印。 这个工具不仅能够保护你的知识产权&#xff0c;还能在一定程度上防止照片被未经授权的人使用。EasyWatermark的核心功能包括&am…

WGCNA加权基因共表达网络一步法分析学习

WGCNA&#xff08;Weighted Gene Co-expression Network Analysis&#xff0c;加权重基因共表达网络分析&#xff09; WGCNA是一种用于分析基因表达数据的系统生物学方法。主要用于识别在基因表达数据中呈现共表达模式的基因模块&#xff0c;并将这些模块与样本特征&#xff0…

LSTM-Autoencoder深度学习模型在电动机异常检测中的应用

LSTM-Autoencoder深度学习模型在电动机异常检测中的应用 LSTM-Autoencoder Deep Learning Model for Anomaly Detection in Electric Motor Citation: Lachekhab, F.; Benzaoui, M.; Tadjer, S.A.; Bensmaine, A.; Hamma, H. LSTM-Autoencoder Deep Learning Model for Anoma…

Stable Diffusion绘画 | LightFlow工作流插件:一键导入,高效生图

LightFlow 是腾讯开源的工作流插件&#xff0c;通过它可以非常轻松地导入和导出工作流文件&#xff0c;从而快速地加载整个工作流。 下载后&#xff0c;放置在&#xff1a;SD安装目录\extensions&#xff0c;重载UI 即可使用&#xff0c;插件位置在生成图片区域下方&#xff1…

2024年8月31日CSDN自动提示的用法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

视频结构化从入门到精通———检索比对类应用

检索比对类应用 1 认识“检索比对” 1.检索和比对的区别 检索和比对是信息处理和数据分析中常见的两种操作&#xff0c;虽然二者在一定程度上都有涉及到信息的提取和分析&#xff0c;但其侧重点和应用场景有所不同。检索主要关注从大规模数据集中定位相关信息&#xff0c;而比…

腾讯云TRTC无UI集成——分享屏幕主流、辅流(Vue2+JS+TRTC无UI集成)

先阐述一下问题&#xff0c;在项目中用到腾讯云的TRTC&#xff0c;A端发布A1、A2两个视频源&#xff0c;在B端订阅A1、A2使用两个view进行播放渲染 问题主流视频源和辅流视频源渲染在同一view上&#xff0c;控制台报错 // 播放远端视频 TRTCService.js; setRemoteVideo(view)…

智慧工地可视化整体解决方案(Word完整版)

第 一 章 系统总体设计 1.1 总体架构 1.1.1 系统拓扑 1.1.2 系统组成 1.2 设计概述 1.3 平台系统功能 1.3.1 总部数据看板 1.3.2 项目部数据看板 1.3.3 视频联网系统 1.3.4 实名制考勤系统 1.3.5 安全生产系统 1.3.6 塔吊安全监控子系统 1.3.7 施工升降机安全监控管系统 1.3.8 …

Codeforces Round 969 (Div. 2 ABCDE题) 视频讲解

A. Dora’s Set Problem Statement Dora has a set s s s containing integers. In the beginning, she will put all integers in [ l , r ] [l, r] [l,r] into the set s s s. That is, an integer x x x is initially contained in the set if and only if l ≤ x ≤…