多表联合的查询(实例)、对于前端返回数据有很多表,可以分开操作、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 mapper
        PUBLIC "-//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">
        SELECT
            t1.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_name
        FROM
            om_term_info t1
                JOIN
            out_term_ship t2 ON t1.out_term_ship_bom_no = t2.bom_no
                JOIN
            out_bom_info t3 ON t1.out_term_ship_bom_name = t3.bom_name
                JOIN
            out_term_type t4 ON t1.out_term_type_name = t4.name
                JOIN
            out_model_outer t5 ON t1.out_model_outer_name = t5.model_outer
                JOIN
            out_model_inner t6 ON t1.out_model_inner_name = t6.model_inner
        WHERE
            t1.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_info
        SET
            out_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;


    @Override
    public 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;
    }
    @Override
    public List<addDistrictDTO> getAllDistrict() {//这个是我们的切入点
        List<addDistrictDTO> allAllDistrict = addMapper.getAllDistrict();//我们先调用getAllDistrict,查出所有的数据包含code,name,parent_id
        return buildHierarchy(allAllDistrict, null);//然后调用我们的递归。最开始的parentcode的值为null
    }

    @Override
    public List<User> selectUser() {
        return addMapper.selectUser();
    }

    @Override
    public 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
    @Override
    public void add(AddPage addPage) {
        AddPageDTO addPageDTO = new AddPageDTO();
        System.out.println("Received addPage termSn: " + addPage.getTermSn());

        // 获取 termSn 并设置到 addPage 和 addPageDTO
        String 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_info
        SET
            out_region_id = #{code},
            out_region_name = #{name},
            out_region_parent_code = #{parentCode}
        WHERE term_sn = #{termSn};
    </update>

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

SELECT
    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 AS custom_name, -- 注意这里假设myBatis中的#{customName}对应于数据库中的custom_num
    out_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
FROM
    om_term_info
WHERE
        term_sn = '20';

在这里插入图片描述

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

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

三、debug调试

1. 第二步,debug启动!

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

4. 查看数据

在这里插入图片描述

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

Debug断点调试
DTO到entity赋值

五、感悟

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:使用 Amazon Bedrock 的 semantic_text

作者&#xff1a;来自 Elastic Gustavo Llermaly 使用 semantic_text 新功能&#xff0c;并使用 AWS Bedrock 作为推理端点服务。 Elasticsearch 的新 semantic_text 映射类型旨在简化构建 RAG 应用程序的常见挑战。它整合了文本分块、生成嵌入以及检索嵌入的步骤。 在本文中…

C++进阶(while循环——函数应用)

知识点代码框架总结 输入n组数据 &#xff0c;对n组数据里面的每一组进行处理&#xff08;输出、求和 、运算、其他&#xff09; int n;//几组数据cin >> n;//2while(n--){//对每组数据进行处理}看到下面的样例&#xff0c;肌肉型反映出上面的框架//2// 1 2 3// 4 5 6若…

机器学习筑基篇,Jupyter Notebook 精简指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 Jupyter Notebook 简明指南 描述&#xff1a;前面我们已经在机器学习工作站&#xff08;Ubuntu 24.04 Desktop Geforce RTX 4070Ti SUPER&#xff09;中安装 Anaconda 工具包&#xff0c;其…

Oracle23ai 新特性IF [NOT] EXISTS 语法支持

Oracle23ai 新特性IF [NOT] EXISTS Syntax Support 官方文档地址 https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/release-changes.html#GUID-9EE96980-43F9-4068-893E-C191CD83ACA6 IF [NOT] EXISTS 语法支持 CREATE、ALTER和DROP DDL语句支持IF NO…

python:绘制一元三次函数的曲线

编写 test_x3_3x.py 如下 # -*- coding: utf-8 -*- """ 绘制函数 y x^33x4 在 -3<x<3 的曲线 """ import numpy as np from matplotlib import pyplot as plt# 用于正常显示中文标题&#xff0c;负号 plt.rcParams[font.sans-serif] […

【人工智能】线性回归

目录 一、使用正规化方法计算下列样本的预测函数 1. 没有归一化之前 2. 归一化之后 二、读取ex1data2.txt中的数据&#xff0c;建立样本集&#xff0c;使用正规化法获取&#xff08;房屋面积&#xff0c;房间数量&#xff09;与房屋价格间的预测函数 1. 读取数据&#xff…

pico+unity3d项目配置

重点&#xff1a;unity编辑器版本要和pico的sdk要求一致、比如&#xff1a; 对于 Unity 2022.1.14 及以上版本&#xff0c;若同时在项目中使用 URP、Linear 色彩空间、四倍抗锯齿和OpenGL&#xff0c;会出现崩溃。该问题待 Unity 引擎解决。对于 Unity 2022&#xff0c;若同时…

Ubuntu20.04 编译安装FFmpeg,出错分析以及解决方案

最近工程上需要对FFmpeg底层源码进行修改&#xff0c;需要重新编译&#xff0c;遇见不少坑&#xff0c;出篇教程记录一下。 文章目录 1.FFmpeg源码下载地址2.编译环境配置3.编译FFmpeg4.配置FFmpeg运行环境 1.FFmpeg源码下载地址 官方下载地址:Index of /releases (ffmpeg.or…

寄存器分配

概述 寄存器位于CPU 或 GPU内部的少量高速存储器&#xff0c;通常用于保存机器指令的操作数 由于其价格昂贵&#xff0c;导致其数量有限&#xff0c;又由于存储速度快&#xff0c;使其不可或缺。因此&#xff0c;寄存器是计算机体系结构中的关键资源之一。在计算复杂表达式的…

Python爬虫速成之路(2):爬天气情况

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

常见问题记录(持续更新)

备注&#xff1a; 在7月10日记录之前遇到的问题及解决方法: 一&#xff1a;常见的访问问题&#xff1a; 403 Forbidden&#xff1a;&#xff08;未有请求权限&#xff09; 表示服务器理解请求但是拒绝执行它。这通常是由于服务器上的文件或资源没有正确的读、写或执行权限&…

IDEA启动Web项目总是提示端口占用

文章目录 IDEA启动Web项目总是提示端口占用一、前言1.场景2.环境 二、正文1.场景一:真端口占用2. 场景二:假端口占用 IDEA启动Web项目总是提示端口占用 一、前言 1.场景 IDEA启动Web项目总是提示端口占用&#xff1a; 确实是端口被占用&#xff0c;比如&#xff1a;没有正常…

复制vmware虚拟机文件并改名(文件名使用python替换)得到一台新的虚拟机

文章目录 需求实验复制文件夹并重命名使用python将所有文件名“WinSer2022”字符替换成“wingetmac”修改虚拟机配置文件&#xff08;.vmx&#xff09;打开新的虚拟机成功 需求 将已有的Winser2022虚拟机复制成wingetmac并开机 实验 复制文件夹并重命名 将"WinSer2022…

使用机器学习 最近邻算法(Nearest Neighbors)进行点云分析 (scikit-learn Open3D numpy)

使用 NearestNeighbors 进行点云分析 在数据分析和机器学习领域&#xff0c;最近邻算法&#xff08;Nearest Neighbors&#xff09;是一种常用的非参数方法。它广泛应用于分类、回归和聚类分析等任务。下面将介绍如何使用 scikit-learn 库中的 NearestNeighbors 类来进行点云数…

NSSCTF_RE(一)暑期

[SWPUCTF 2021 新生赛]简单的逻辑 nss上附件都不对 没看明白怎么玩的 dnspy分析有三个 AchievePoint , game.Player.Bet - 22m; for (int i 0; i < Program.memory.Length; i) { byte[] array Program.memory; int num i; array[num] ^ 34; } Environment.SetEnvironment…

全自主巡航无人机项目思路:STM32/PX4 + ROS + AI 实现从传感融合到智能规划的端到端解决方案

1. 项目概述 本项目旨在设计并实现一款高度自主的自动巡航无人机系统。该系统能够按照预设路径自主飞行&#xff0c;完成各种巡航任务&#xff0c;如电力巡线、森林防火、边境巡逻和灾害监测等。 1.1 系统特点 基于STM32F4和PX4的高性能嵌入式飞控系统多传感器融合技术实现精…

机器学习(五) -- 监督学习(6) --逻辑回归

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;5&#xff09; -- 线性回归2 下篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;7&#xff09; --SVM1 前言 tips&#xff1a;标题前有“***”的内…

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…

[Vulnhub] Stapler wp-videos+ftp+smb+bash_history权限提升+SUID权限提升+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.106TCP:21,22,53,80,123,137,138,139,666,3306, Using Nmap for scanning: $ nmap -p- 192.168.8.106 --min-rate 1000 -sC -sV The results are as follows: PORT STATE SERVICE VERSION 20/tcp closed ftp-data…

交换机和路由器的工作流程

1、交换机工作流程&#xff1a; 将接口中的电流识别为二进制&#xff0c;并转换成数据帧&#xff0c;交换机会记录学习该数据帧的源MAC地址&#xff0c;并将其端口关联起来记录在MAC地址表中。然后查看MAC地址表来查找目标MAC地址&#xff0c;会有一下一些情况&#xff1a; MA…