多表联合的查询(实例)、对于前端返回数据有很多表,可以分开操作、debug调试教程

2024.7.13

  • 一、 对于多表的更深层的认识
    • 1. 认识
    • 2. 多表联合查询的列子:
    • 3. 对于多表查询的进一步认识
    • 4. 在实现功能的时候,原本对于省市县这样的表,对于项目的要求,是直接全部查询出来,然后开始使用,但我想着能不能直接用树形结构来操作,然后通过递归的形式来实现,让我们看看我的成果!!
    • 4.1 其他的都不看了,直接看service:
    • 4.2 解释 for (addDistrictDTO area : allDistrict)
    • 4.3 成果!
  • 二、 新增
    • 1. 先看需求!
    • 2. 新增的分析(查询和上面大差不差,直接返回就行,就不提了)
    • 3. 开始开发!!
    • 4. 对于不分开,直接进行插入,我没弄出来,一直报错,有机会我会写在这,如果真有人看,能指点我一下!!!
    • 5. 优化我的代码(递归,以及两个sql操作)
  • 三、debug调试
    • 1. 第二步,debug启动!
    • 2. 第一步,对于错误的方法和地方打断点,查看当时的值和状态。(不用像我这样,哈哈哈,我这太夸张了)
    • 3. 第三步,通过这些按钮进行控制
    • 4. 查看数据
  • 四、感谢大佬们的文章给我的提示,也感谢该死的GPT!!
  • 五、感悟

一、 对于多表的更深层的认识

1. 认识

我今天早上,基本上一直都在进行查询的书写,写了四五个查询的接口吧,根据着页面和F12进行推断,我需要哪些表,一开始很慢,因为要去找对应的字段,需要自己写xml。后面结合gpt就快很多了(不要依赖gpt,我就是因为太依赖gpt,导致于我在一个逻辑上,没有仔细想,出错了,就问他,他给我建议,离我最初的逻辑越来越偏!!!gpt只是工具。

2. 多表联合查询的列子:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.hengyin.ship.mapper.AddMapper"><!-- Result Map 定义 --><resultMap id="MaterialsResultMap" type="com.hengyin.ship.domain.Materials"><result property="outTermShipBomNo" column="out_term_ship_bom_no" /><result property="outTermShipBomName" column="out_term_ship_bom_name" /><result property="outTermTypeName" column="out_term_type_name" /><result property="outModelOuterName" column="out_model_outer_name" /><result property="outModelInnerName" column="out_model_inner_name" /></resultMap><!-- 查询语句定义 --><select id="selectMaterials" resultMap="MaterialsResultMap">SELECTt1.out_term_ship_bom_no,t1.out_term_ship_bom_name,t1.out_term_type_name,t1.out_model_outer_name,t1.out_model_inner_nameFROMom_term_info t1JOINout_term_ship t2 ON t1.out_term_ship_bom_no = t2.bom_noJOINout_bom_info t3 ON t1.out_term_ship_bom_name = t3.bom_nameJOINout_term_type t4 ON t1.out_term_type_name = t4.nameJOINout_model_outer t5 ON t1.out_model_outer_name = t5.model_outerJOINout_model_inner t6 ON t1.out_model_inner_name = t6.model_innerWHEREt1.out_term_ship_bom_no = #{outTermShipBomNo}</select><insert id="add">INSERT INTO om_term_info (term_sn,out_term_ship_bom_no,out_term_ship_bom_name,out_term_type_name,out_model_outer_name,out_model_inner_name,out_custom_info_name,out_sales_contract_sales_uid,sub_branch_contacts,out_region_id,out_region_name,out_region_parent_code,ship_state,out_term_ship_ship_time,out_term_ship_take_address,branch_name,sub_branch_tel,out_logistics_provider_info_id,out_logistics_provider_info_name)VALUES (#{termSn},#{outTermShipBomNo},#{outTermShipBomName},#{outTermTypeName},#{outModelOuterName},#{outModelInnerName},#{customName},#{salesUid},#{code},#{name},#{parentCode}#{shipState},#{shipTime, jdbcType=TIMESTAMP},#{takeAddress},#{branchName},#{bankContacts},#{bankTel},#{LoCode},#{LoName})</insert><insert id="addDTO">INSERT INTO om_term_info (term_sn, out_term_ship_bom_no, out_term_ship_bom_name,out_term_type_name, out_model_outer_name, out_model_inner_name,custom_num, out_sales_contract_sales_uid, ship_state, out_term_ship_ship_time,out_term_ship_take_address, branch_name, sub_branch_contacts, sub_branch_tel,out_logistics_provider_info_name) VALUES (#{termSn}, #{outTermShipBomNo}, #{outTermShipBomName},#{outTermTypeName}, #{outModelOuterName}, #{outModelInnerName},#{customName}, #{salesUid}, #{shipState}, #{shipTime},#{takeAddress}, #{branchName}, #{bankContacts}, #{bankTel},#{loName})</insert><update id="addDistrict">UPDATE om_term_infoSETout_region_id = #{code},out_region_name = #{name},out_region_parent_code = #{parentCode}WHERE term_sn = #{termSn};</update>
</mapper>

3. 对于多表查询的进一步认识

我一直对于这种关联表和基础表认识的不是特别透彻,当我操作的一层表里有和基础表一样的数据的时候,我在想,他们两个关联,是不是证明,他们就会数据共享,我修改一个另一个也会修改?那我到底该操作哪个表?底层表还是我的一层表。(虽然现在我说出来,你可能会觉得,这不肯定是一层表吗?但我确实绕进去了,哈哈哈)
然后开始理清楚,我可以从底层表里拿到数据,返回,也能从一层表拿啊,但底层表很多都是提供的公共数据,虽然我们小组成员之间会使用同一张表,但我们创建的数据,和修改的数据,不应该去修改底层表,而是应该修改自己的主表(主要操作的表),比如我现在进行发货管理,对于发货信息表和信息台账表,**我看了一下,信息台账表里我需要的数据会更多,应该定为主表。**所以,在后面新增操作的时候,都是直接操作自己的一层表,对于查询的话,可能两个都会使用到。

4. 在实现功能的时候,原本对于省市县这样的表,对于项目的要求,是直接全部查询出来,然后开始使用,但我想着能不能直接用树形结构来操作,然后通过递归的形式来实现,让我们看看我的成果!!

4.1 其他的都不看了,直接看service:

@Service
public class AddServiceImpl implements AddService {
@Autowired
private AddMapper addMapper;@Overridepublic addLogistics selectLogistics() {return addMapper.selectLogistics();}// 构建层级结构的方法private List<addDistrictDTO> buildHierarchy(List<addDistrictDTO> allDistrict, String parentCode) {//这里开始进入方法,传入的是我们的allDistrict(含值的对象),和parentcode的值List<addDistrictDTO> result = new ArrayList<>();//定义一个集合 result用于存放结果System.out.println("Building hierarchy for parentCode: " + parentCode);// 打印当前递归层级的父节点代码// 遍历所有的地区对象for (addDistrictDTO area : allDistrict) {System.out.println("Checking area: " + area.getCode() + ", parentCode: " + area.getParent_code());// 打印正在检查的地区代码和其父节点代码if ((parentCode == null && area.getParent_code()== null) || (parentCode != null && parentCode.equals(area.getParent_code()))) {//  如果是子地区,则递归调用 buildHierarchy 方法,构建子地区的树形结构List<addDistrictDTO> children = buildHierarchy(allDistrict, area.getCode());// 如果子地区列表不为空,将其设置为当前地区的子地区if (!children.isEmpty()) {area.setChildren(children);}// 将当前地区加入结果列表result.add(area);}}// 打印当前父节点下构建的结果System.out.println("Result for parentCode " + parentCode + ": " + result);return result;}@Overridepublic List<addDistrictDTO> getAllDistrict() {//这个是我们的切入点List<addDistrictDTO> allAllDistrict = addMapper.getAllDistrict();//我们先调用getAllDistrict,查出所有的数据包含code,name,parent_idreturn buildHierarchy(allAllDistrict, null);//然后调用我们的递归。最开始的parentcode的值为null}@Overridepublic List<User> selectUser() {return addMapper.selectUser();}@Overridepublic List<Materials> selectMaterials(String outTermShipBomNo) {return addMapper.selectMaterials(outTermShipBomNo);

4.2 解释 for (addDistrictDTO area : allDistrict)

解释:这段代码中的 for (addDistrictDTO area : allDistrict) 是 Java 中的增强型 for 循环,也称为 for-each 循环。它是一种简化遍历数组或集合的语法形式,其基本结构为:
addDistrictDTO 是迭代过程中每个元素的类型。
area 是循环每次迭代时,代表集合 allDistrict 中的一个元素。
allDistrict 是需要被遍历的集合,其中存储了 addDistrictDTO 类型的对象。

for (ElementType element : collection) {// 循环体内的操作
}

4.3 成果!

[{"code": "1","name": "上海市","parent_code": null,"children": [{"code": "2","name": "嘉定区","parent_code": "1","children": []}]},{"code": "3","name": "贵州省","parent_code": null,"children": [{"code": "4","name": "六盘水市","parent_code": "3","children": [{"code": "5","name": "盘州市","parent_code": "4","children": []}]},{"code": "6","name": "贵阳市","parent_code": "3","children": [{"code": "7","name": "花溪区","parent_code": "6","children": []}]}]}
]

二、 新增

1. 先看需求!

在这里插入图片描述

2. 新增的分析(查询和上面大差不差,直接返回就行,就不提了)

首先,我对表进行了修改,因为我在我的基础表上,只有一两个字段没有(偷个懒,写入接口文档找关联吧),然后开始分析,因为返回的数据Json为:(这个json写的也真费劲,让gpt写,写的一点都不匹配!!!一定先修改json对于属性。)

{"termSn": "21","outTermShipBomNo": "BOM123456","outTermShipBomName": "Bom Name","outTermTypeName": "Type Name","outModelOuterName": "Outer Model Name","outModelInnerName": "Inner Model Name","customName": "Customer Name","salesUid": 1001,"phoneNumber": "1234567890","shipState": 1,"shipTime": "2024-07-13","takeAddress": "123 Shipping Address","branchName": "Branch Name","bankContacts": "Bank Contacts","bankTel": "0987654321","loCode": "LOG123","loName": "Logistics Name","children": [{"code": "110000","name": "Beijing","parentCode": "000000","children": [{"code": "110100","name": "Beijing City","parentCode": "110000","children": []}]},{"code": "120000","name": "Tianjin","parentCode": "000000","children": [{"code": "120100","name": "Tianjin City","parentCode": "120000","children": []}]}]
}

3. 开始开发!!

对于我们传回后端进行处理的数据里,有一个树形结构(也不知道我犟什么,不用这个早写完了),开始进行设计。
我想到,我定义一个总的类(包含所有的属性),然后用行政区域的DTO把树形结构拿走,其他的再封装为一个DTO进行操作。然后实体类的DTO直接进行插入操作,然后行政区域的根据SN进行修改,开始操作!对了,我首先想到的就是 BeanUtils.copyProperties(a,b)用大去赋小,这样就可以把不用的省去,就不用stream流了。
首先,树形数据也是需要进行递归把数据拿出来,插入到表里面,那我们老规矩,直接看service:

   @Transactional@Overridepublic void add(AddPage addPage) {AddPageDTO addPageDTO = new AddPageDTO();System.out.println("Received addPage termSn: " + addPage.getTermSn());// 获取 termSn 并设置到 addPage 和 addPageDTOString termSn = addPage.getTermSn();addDistrict.settermSn(termSn);addPageDTO.setTermSn(termSn);addDistrict addDistrict = new addDistrict();BeanUtils.copyProperties(addPage, addPageDTO);System.out.println("Received addPageDTO termSn: " + addPageDTO.getTermSn());BeanUtils.copyProperties(addPage, addDistrict);addDistrict.setTermSn(termSn); //这里把sn放到addDistrict中,下面查不到!!!// 检查 termSn 字段是否有值if (addPageDTO.getTermSn() == null) {throw new IllegalArgumentException("termSn cannot be null");}// 插入主记录addMapper.addDTO(addPageDTO);addDistrictTree(addPage.getChildren(), termSn); // 传递 termSn}private void addDistrictTree(List<addDistrict> districts, String termSn) {for (addDistrict district : districts) {district.setTermSn(termSn); // 设置 termSn// 插入子记录addMapper.addDistrict(district);if (district.getChildren() != null && !district.getChildren().isEmpty()) {addDistrictTree(district.getChildren(), district.getTermSn()); // 传递当前节点的 termSn}}}

然后就是XML!:

 <insert id="addDTO">INSERT INTO om_term_info (term_sn, out_term_ship_bom_no, out_term_ship_bom_name,out_term_type_name, out_model_outer_name, out_model_inner_name,custom_num, out_sales_contract_sales_uid, ship_state, out_term_ship_ship_time,out_term_ship_take_address, branch_name, sub_branch_contacts, sub_branch_tel,out_logistics_provider_info_name) VALUES (#{termSn}, #{outTermShipBomNo}, #{outTermShipBomName},#{outTermTypeName}, #{outModelOuterName}, #{outModelInnerName},#{customName}, #{salesUid}, #{shipState}, #{shipTime},#{takeAddress}, #{branchName}, #{bankContacts}, #{bankTel},#{loName})</insert><update id="addDistrict">UPDATE om_term_infoSETout_region_id = #{code},out_region_name = #{name},out_region_parent_code = #{parentCode}WHERE term_sn = #{termSn};</update>

这样就可以完美插入了,然后再让gpt生成一条查询这些语句的sql,来查看我们是否完成插入。

SELECTterm_sn,out_term_ship_bom_no,out_term_ship_bom_name,out_term_type_name,out_model_outer_name,out_model_inner_name,custom_num AS custom_name, -- 注意这里假设myBatis中的#{customName}对应于数据库中的custom_numout_sales_contract_sales_uid AS sales_uid,ship_state,out_term_ship_ship_time AS ship_time,out_term_ship_take_address AS take_address,branch_name,sub_branch_contacts,sub_branch_tel,out_logistics_provider_info_name AS lo_name,out_region_id,out_region_name,out_region_parent_code
FROMom_term_info
WHEREterm_sn = '20';

在这里插入图片描述

4. 对于不分开,直接进行插入,我没弄出来,一直报错,有机会我会写在这,如果真有人看,能指点我一下!!!

5. 优化我的代码(递归,以及两个sql操作)

三、debug调试

1. 第二步,debug启动!

在这里插入图片描述

2. 第一步,对于错误的方法和地方打断点,查看当时的值和状态。(不用像我这样,哈哈哈,我这太夸张了)

在这里插入图片描述

3. 第三步,通过这些按钮进行控制

在这里插入图片描述

4. 查看数据

在这里插入图片描述

四、感谢大佬们的文章给我的提示,也感谢该死的GPT!!

Debug断点调试
DTO到entity赋值

五、感悟

当你遇到问题的时候,一定要先独立思考,思考不出来,就要考虑换个思路,起来走走,问问别人,不要和gpt死磕,更多的用自己的思维。
还有就是代码规范的问题,写的一点都不规范,命名和方法名称的规范一定要注意。新增模块还有需求,明天再写!!!

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

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

相关文章

JavaScript中的面向对象编程

OPP在JavaScript的表现方式&#xff1a;原型 传统的OPP&#xff1a;类 ● 对象&#xff08;实例&#xff09;由类实例化&#xff0c;类的功能类似于蓝图&#xff0c;通过蓝图来实现建筑&#xff08;实例&#xff09; ● 行为&#xff08;方法&#xff09;从类复制到所有实例 …

AWS-S3实现Minio分片上传、断点续传、秒传、分片下载、暂停下载

文章目录 前言一、功能展示上传功能点下载功能点效果展示 二、思路流程上传流程下载流程 三、代码示例四、疑问 前言 Amazon Simple Storage Service&#xff08;S3&#xff09;&#xff0c;简单存储服务&#xff0c;是一个公开的云存储服务。Web应用程序开发人员可以使用它存…

2024.7.12 检测H1S-0806MT-XP (问题:脉冲自己会给)

步骤一&#xff1a;先把H1s里面的程序上载保存&#xff0c;避免丢失。 注意&#xff1a;上载程序时&#xff0c;参数也需要上载。&#xff08;勾选软原件内存选项&#xff09; 步…

EasyExcel批量读取Excel文件数据导入到MySQL表中

1、EasyExcel简介 官网&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 2、代码实战 首先引入jar包 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</v…

智慧校园缴费管理-缴费项目类型功能概述

智慧校园的缴费管理系统&#xff0c;以缴费项目类型为核心功能之一&#xff0c;精细划分并优化了各类缴费流程&#xff0c;为学生和家长带来更为直观、便捷的财务管理体验。这一功能通过整合校园内广泛的费用类别&#xff0c;确保每一笔费用都能准确、高效地处理&#xff0c;体…

Provider(2)- SourceAudioBufferProvider

SourceAudioBufferProvider 从Source源端出来的数据&#xff0c;通常是来自于应用层&#xff0c;但没有与应用层直接连接&#xff0c;通过MonoPipe相关类连接&#xff0c;其SourceAudioBufferProvider和MonoPipe相关类的包含关系图如下&#xff1a; 如上图&#xff0c;Sourc…

11计算机视觉—语义分割与转置卷积

目录 1.语义分割应用语义分割和实例分割2.语义分割数据集:Pascal VOC2012 语义分割数据集预处理数据:我们使用图像增广中的随机裁剪,裁剪输入图像和标签的相同区域。3.转置卷积 上采样填充、步幅和多通道填充步幅多通道转置卷积是一种卷积:重新排列输入和核转置卷积是一种卷…

Java高级重点知识点-22-缓冲流、转换流、序列化流、打印流

文章目录 缓冲流字节缓冲流字符缓冲流 转换流InputStreamReader类OutputStreamWriter类 序列化ObjectOutputStream类ObjectInputStream类 打印流 缓冲流 缓冲流,也叫高效流&#xff0c;是对4个基本的 FileXxx 流的增强&#xff0c;所以也是4个流 基本原理&#xff1a; 缓冲流的…

ES13的4个改革性新特性

1、类字段声明 在 ES13 之前,类字段只能在构造函数中声明, ES13 消除了这个限制 // 之前 class Car {constructor() {this.color = blue;this.age = 2

C++ | Leetcode C++题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; class MyQueue { private:stack<int> inStack, outStack;void in2out() {while (!inStack.empty()) {outStack.push(inStack.top());inStack.pop();}}public:MyQueue() {}void push(int x) {inStack.push(x);}int pop() {if (outStac…

linux_进程周边知识——理解冯诺依曼体系结构

前言&#xff1a; 本篇内容是为了让友友们较好地理解进程的概念&#xff0c; 而在真正了解进行概念之前&#xff0c; 要先了解一下冯诺依曼体系结构。 所以博主会先对冯诺伊曼体系结构进行解释&#xff0c; 然后再讲解进程的概念。 ps&#xff1a; 本篇内容适合了解一些linux指…

基于复旦微JFMQL100TAI的全国产化FPGA+AI人工智能异构计算平台,兼容XC7Z045-2FFG900I

基于上海复旦微电子FMQL45T900的全国产化ARM核心板。该核心板将复旦微的FMQL45T900&#xff08;与XILINX的XC7Z045-2FFG900I兼容&#xff09;的最小系统集成在了一个87*117mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;能够快速的搭建起…

springboot大学校园二手书交易APP

摘 要 在数字化与移动互联网迅猛发展的今天&#xff0c;人们对于图书的需求与消费方式也在悄然改变。为了满足广大读者对图书的热爱与追求&#xff0c;我们倾力打造了一款基于Android平台的图书交易APP。这款APP不仅汇聚了海量的图书资源&#xff0c;提供了便捷的交易平台&…

【产品经理】WMS多仓调拨转移说明

对于仓储管理来说&#xff0c;越来越多企业开始应用WMS进行系统化的管理&#xff0c;以提升仓库的作业效率。本文作者从业务流程和基础功能两个方面展开介绍&#xff0c;希望对你有帮助。 一、业务流程 。在线下业务流程拓展&#xff0c;仓库不断增多的过程中&#xff0c;由于…

vscode终端(控制台打印乱码)

乱码出现的两种可能&#xff08;重点是下面标题2&#xff09; 1、文件中的汉字本来就是乱码&#xff0c;输出到控制台(终端)那就当然是乱码 在vscode中设置文件的编码格式为UTF-8&#xff0c; 2、输出到控制台(终端)之前的汉字不是乱码&#xff0c;针对此种情况如下设置 原因…

GuLi商城-商品服务-API-品牌管理-JSR303分组校验

注解:@Validated 实体类: package com.nanjing.gulimall.product.entity;import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.nanjing.common.valid.ListValue; import com.nanjing.common.valid.Updat…

【Python学习笔记】Optuna + Transformer B站视频实践

【Python学习笔记】Optuna Transformer 实践 背景前摇&#xff08;省流可不看&#xff09;&#xff1a; 之前以泰坦尼克号数据集为案例&#xff0c;学习了Optuna的基本操作&#xff0c;为了进一步巩固知识和便于包装简历&#xff0c;决定找个唬人一点的项目练练手。 ————…

[读论文]Transformers are SSMs

Notation T T T: Sequence length/ time length $$: 摘要 虽然transformer一直是深度学习在语言建模方面成功的主要架构&#xff0c;但状态空间模型(ssm)&#xff0c;如Mamba&#xff0c;最近被证明在中小规模上与transformer相匹配或优于transformer。这些模型族实际上是非常…

数据结构(4.1)——串的存储结构

串的顺序存储 串&#xff08;String&#xff09;的顺序存储是指使用一段连续的存储单元来存储字符串中的字符。 计算串的长度 静态存储(定长顺序存储) #define MAXLEN 255//预定义最大串为255typedef struct {char ch[MAXLEN];//每个分量存储一个字符int length;//串的实际长…

子进程继承父进程文件描述符导致父进程打开设备文件失败

开发过程中有时会遇到需要在程序中执行三方程序或者shell脚本&#xff0c;一般会通过system(), popen(), exec簇来完成该功能。我们知道以上方法会通过fork创建子进程后在子进程中执行相应指令。如图1为某个示例流程&#xff0c;具体的程序执行流程如图2所示&#xff0c;线程my…