省市县下拉框的逻辑以及多表联查的实例

news2024/9/21 4:25:42

2024.7.12

  • 一. 省市县的逻辑开发。
    • 1、准备:
      • 1.1. 要求:
      • 1.2 数据库表:
    • 2. 逻辑:
    • 3. 方法
      • 3.1 创建实体类
      • 3.2 数据访问层
      • 3.3 实现递归方法
      • 3.4 控制器实现
      • 3.5 前端处理
  • 二、多表联查(给我干红温了)
    • 1. 出现了问题
    • 2 sql语句的书写
    • 3 mapper.xml 中:
    • 4 解决前面报的错:

一. 省市县的逻辑开发。

1、准备:

1.1. 要求:

做一个选择省市县的开发:
在这里插入图片描述

1.2 数据库表:

在这里插入图片描述

2. 逻辑:

首先根据这张表,证明,我们所有的数据都将放到这张表里面,包含省市县。但有上级行政区划这一个字段,证明我们需要通过这个字段来判断,他的等级。(如:没有上级行政区划,则为省,有一级为市,有两级为县)根据这个去进行操作。

3. 方法

1.通过自连接的方式来进行查询全部表,然后就能获得分级的表,然后返回数据。
2.根据code直接查询出全部的表进行逻辑操作,通过递归,构造树形结构(超级厉害)
所以我们直接介绍第二种:

3.1 创建实体类

首先,你可能需要修改 Area 实体类,以便于支持递归结构。添加一个 children 属性来存储子节点:

package com.example.demo.model;

import java.util.ArrayList;
import java.util.List;

public class Area {
    
    private String code; // 行政区划编码
    private String name; // 行政区划名称
    private String parentCode; // 上级行政区划编码
    private List<Area> children = new ArrayList<>(); // 子级行政区划列表

    // Getters and Setters
}

3.2 数据访问层

在数据访问层中,提供一个方法来根据父级编码获取所有子级数据:

package com.example.demo.repository;

import com.example.demo.model.Area;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface AreaRepository extends JpaRepository<Area, String> {
    List<Area> findByParentCode(String parentCode);
}

3.3 实现递归方法

在服务层中实现递归方法来构建完整的层级结构:

package com.example.demo.service;

import com.example.demo.model.Area;
import com.example.demo.repository.AreaRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;

@Service
public class AreaService {

    @Autowired
    private AreaRepository areaRepository;

    // 递归方法来构建层级结构
    public List<Area> getAllAreas() {
        List<Area> allAreas = areaRepository.findAll();
        return buildHierarchy(allAreas, null);
    }

    // 构建层级结构的方法
    private List<Area> buildHierarchy(List<Area> allAreas, String parentCode) {
        List<Area> result = new ArrayList<>();
        for (Area area : allAreas) {
            if ((parentCode == null && area.getParentCode() == null) || (parentCode != null && parentCode.equals(area.getParentCode()))) {
                // 找到子级,递归构建子级树
                area.setChildren(buildHierarchy(allAreas, area.getCode()));
                result.add(area);
            }
        }
        return result;
    }
}

3.4 控制器实现

在控制器中调用服务层的方法,并返回构建好的层级结构数据:

package com.example.demo.controller;

import com.example.demo.model.Area;
import com.example.demo.service.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
@RequestMapping("/api/areas")
public class AreaController {

    @Autowired
    private AreaService areaService;

    @GetMapping
    public List<Area> getAllAreas() {
        return areaService.getAllAreas();
    }
}

3.5 前端处理

前端接收到的数据将是一个嵌套的树形结构,你可以用来构建下拉框或其他需要显示层级结构的控件。例如,使用 JavaScript 来处理并渲染树形结构数据:

// 假设你使用 jQuery
$(document).ready(function() {
    $.get('/api/areas', function(data) {
        // 处理和渲染树形结构
        renderTree(data);
    });
});

function renderTree(data) {
    // 递归渲染树形结构
    function renderNode(node) {
        let html = '<option value="' + node.code + '">' + node.name + '</option>';
        if (node.children && node.children.length > 0) {
            node.children.forEach(child => {
                html += renderNode(child);
            });
        }
        return html;
    }
    
    let html = '<select>' + data.map(renderNode).join('') + '</select>';
    $('#treeContainer').html(html);
}

二、多表联查(给我干红温了)

1. 出现了问题

在我写sql的时候,开始对应着每个表之间对应的字段开始写join on语句,但还是查不出数据,原来,我们需要保证我们的每个字段都有数据,才会返回查询, 所以我去修改我需要表的数据,发现是公共表,我他们写入数据不一致,导致的,这就是开发的时候用服务器连数据库的弊端,我直接把服务器的表复制到我本地,开始开发。还有,xml里面一直报错:
在这里插入图片描述

2 sql语句的书写

注意: 我们使用join on一定要对应好字段,才能保证数据的一致性。
sql:

SELECT  t1.term_sn,t1.out_term_type_name,t1.om_term_info_id,t3.bill_type,t3.ship_notice_no,t3.ship_time,
        t4.custom_name,t3.take_address,t3.branch_name,t3.bank_contacts,t3.bank_tel,t4.sales_uid,t1.ship_state,
        t1.out_region_id,t6.user_name,t1.creat_time
from om_term_info t1
         join out_term_type t2 on t1.out_term_type_name= t2.name
         join out_term_ship t3 on t1.om_term_info_id=t3.om_term_info_id
         join out_custom_info t4 on  t3.custom_no =t4.custom_no
         join out_region t5 on t1.out_region_id=t5.code
         join  sys_user t6 on t1.user_id=t6.user_id;

3 mapper.xml 中:

我们返回数据的时候,需要定义一个<resultMap,然后注意id和type,对应不好很容易出错。还有就是表字段和属性的对应,要细心。

<?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.HomePageMapper">
    <resultMap id="HomePageResult" type="com.hengyin.ship.domain.Homepage">
        <id column="term_sn" property="termSn" jdbcType="VARCHAR"/>
        <result column="out_term_type_name" property="outTermTypeName" jdbcType="VARCHAR"/>
        <result column="om_term_info_id" property="omTermInfoId" jdbcType="BIGINT"/>
        <result column="bill_type" property="billType" jdbcType="VARCHAR"/>
        <result column="ship_notice_no" property="shipNoticeNo" jdbcType="VARCHAR"/>
        <result column="ship_time" property="shipTime" jdbcType="TIMESTAMP"/>
        <result column="custom_name" property="customName" jdbcType="VARCHAR"/>
        <result column="take_address" property="takeAddress" jdbcType="VARCHAR"/>
        <result column="branch_name" property="branchName" jdbcType="VARCHAR"/>
        <result column="bank_contacts" property="bankContacts" jdbcType="VARCHAR"/>
        <result column="bank_tel" property="bankTel" jdbcType="VARCHAR"/>
        <result column="sales_uid" property="salesUid" jdbcType="BIGINT"/>
        <result column="ship_state" property="shipState" jdbcType="BIGINT"/>
        <result column="out_region_id" property="outRegionId" jdbcType="BIGINT"/>
        <result column="user_name" property="userName" jdbcType="VARCHAR"/>
        <result column="creat_time" property="createTime" jdbcType="TIMESTAMP"/>
    </resultMap>

<!--    <select id="slectHomePage" resultType="com.hengyin.ship.domain.Homepage">-->
    <select id="slectHomePage" resultMap="HomePageResult">
        SELECT  t1.term_sn, t1.out_term_type_name, t1.om_term_info_id, t3.bill_type,
                t3.ship_notice_no, t3.ship_time, t4.custom_name, t3.take_address,
                t3.branch_name, t3.bank_contacts, t3.bank_tel, t4.sales_uid,
                t1.ship_state, t1.out_region_id, t6.user_name, t1.creat_time
        FROM om_term_info t1
                 JOIN out_term_type t2 ON t1.out_term_type_name = t2.name
                 JOIN out_term_ship t3 ON t1.om_term_info_id = t3.om_term_info_id
                 JOIN out_custom_info t4 ON t3.custom_no = t4.custom_no
                 JOIN out_region t5 ON t1.out_region_id = t5.code
                 JOIN sys_user t6 ON t1.user_id = t6.user_id;
    </select>
</mapper>

4 解决前面报的错:

提示我们limit 10的错误 ,我找半天也没找到我哪里写limit10,最有趣的是,我第一次问gpt,他告诉我让我加上limit10,然后还报错,又发给他,他又说我加了limit 10 哈哈哈哈哈哈哈。
最后的原因是我忘记了再controller中我加入了分页查询的工具类导致的,下次要思维活跃一点。

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

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

相关文章

Java性能优化-switch性能优化-用String还是int做比较

场景 Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化&#xff1a; Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化_java热点函数-CSDN博客 参考以上性能测试工具的使用。 下面针对Java中对switch-case比较时…

LLM 合成数据生成完整指南

大型语言模型是强大的工具&#xff0c;不仅可以生成类似人类的文本&#xff0c;还可以创建高质量的合成数据。这种能力正在改变我们进行 AI 开发的方式&#xff0c;特别是在现实世界数据稀缺、昂贵或隐私敏感的情况下。在本综合指南中&#xff0c;我们将探索 LLM 驱动的合成数据…

访问控制的定义与原理

访问控制(Access Control)是一种重要的安全机制&#xff0c;用于限制对程序中的数据、函数、类以及计算机系统中资源(如文件、数据库、网络设备等)的访问权限。其主要目的是保护系统中的敏感信息和资源&#xff0c;防止未经授权的访问和操作&#xff0c;确保系统的安全性、完整…

无向图的双连通分量——AcWing 395. 冗余路径

无向图的双连通分量 定义 在无向图中&#xff0c;一个双连通分量&#xff08;Biconnected Component, BCC&#xff09;是指这样的子图&#xff1a;删除其中任意一个顶点都不会使这个子图分离成两个或更多个不相连的子图。换句话说&#xff0c;双连通分量是无割点的极大连通子…

lua 脚本语言 : 基础到高级语法

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

[Python学习篇] Python异常

什么是异常&#xff1f; 异常&#xff08;Exception&#xff09;是指在程序执行过程中发生的错误事件&#xff0c;它会中断程序的正常执行流程。异常可以由程序中的错误引发&#xff0c;也可以通过主动抛出异常来处理特殊情况。Python 使用异常处理机制来捕获和处理这些错误&am…

初识c++(构造函数,析构函数,拷贝构造函数,赋值运算符重载)

一、类的默认函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。 #include<iostream> using namespace std; class Date { public:Date(){_year 1;_month 1;_day 1;cout << _year << "/" <&…

日常的学习

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 7.11 resAndroidManifest 笔记 <> <> selector shape resources main下的AndroidMainifest.xml文件 application …

sql注入时间盲注

基于时间的盲注 也叫延时注入。通过观察页面&#xff0c;既没有回显数据库内容&#xff0c;又没有报错信息也没有布尔类型状态&#xff0c;那么我们可以考虑用“绝招”--延时注入。延时注入就是根据页面的响应时间来判断是否存在注入&#xff0c;一点一点注入出数据库的信息。我…

【进阶】利用python内置模块自动化发送邮件及邮件附件

目录 自动化发送邮件 流程&#xff1a; 步骤&#xff1a; 【重点】 【MIMEText--发送文本类型的邮件】 【MIMEImage-发送附件为图片的邮件】 【MIMEBase--发送附件为html报告的邮件】 自动化发送邮件 以qq邮箱为例&#xff0c;提前打开POP3/IMAP/SMTP/Exchange/CardDAV 服…

【web]-信息收集-空白页面

打开是一张图 查看源码&#xff0c;发现就一个链接是有用信息&#xff0c;用目录扫描工具&#xff0c;没有发现有价值的信息。 F12&#xff0c;查看请求和相应信息&#xff0c;在响应头中发现了信息。 还有一个小技巧&#xff1a;点击手机图标&#xff0c;可以切换到手机模式中…

Web浏览器485通讯读取RFID卡号js JavaScript

本示例使用设备&#xff1a;485通讯液显带键盘RFID打菲计件读卡器工位机串口可二次开发编程-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> …

计组_总线

2024.06.21&#xff1a;计算机组成原理总线学习笔记 第23节 总线 3.1 总线的基本概念&#xff08;联想数据通路&#xff09;3.2 总线的分类3.2.1 片内总线&#xff08;CPU芯片内部的总线&#xff09;3.2.2 系统总线3.2.3 通信总线&#xff08;跨系统&#xff0c;408一般不考&am…

四个“一体化”——构建数智融合时代下的一站式大数据平台

随着智能化技术的飞速发展&#xff0c;尤其是以生成式AI为代表的技术快速应用&#xff0c;推动了数据与智能的深化融合&#xff0c;给数据基础设施带来了新的变革和挑战。如何简化日益复杂的系统架构&#xff0c;提高数据处理效率&#xff0c;降低开发运维成本&#xff0c;促进…

十、(正点原子)Linux阻塞和非阻塞IO

阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式&#xff0c;在编写驱动的时候一定要考虑到阻塞和非阻塞。这里的“IO”并不是我们学习 STM32 或者其他单片机的时候所说的“GPIO”(也就是引脚)。这里的 IO 指的是 Input/Output&#xff0c;也就是输入/输出&…

matlab支持向量机使用错误

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

使用Qt和mitmproxy开发一个抓取网页短视频的万能工具

目录 实现原理 mitmproxy介绍 功能简介 安装 脚本示例 如何使用 解释 注意事项 QT工具实现 其他资源 实现原理 使用WebView组件造一工具,工具可输入网页地址并显示网页内容及播放视频。把工具的代理设置指向mitmproxy的端口服务。配合使用mitmproxy的MITM技术,监…

MySql性能调优03-[SQL优化]

SQL优化 MySQL优化SQL优化-不要写select *SQL优化-小表驱动大表&#xff0c;而不是大表驱动小表SQL优化-连接查询代替子查询SQL优化-提升group by的效率 MySQL优化 trace工具 set session optimizer_traceenabledon,end_markers_in_json on; -- 开启trace select * From emplo…

指针详解(2)

指针详解(2) 对数组名的理解 在C语言里数组名还表示着数组首元素地址。 int arr[5] {1, 2, 3, 4, 5}; int* p &arr[0]; int* p arr;以上这两种&#xff0c;对指针p进行赋值的操作均是等价的&#xff0c;都将数组首元素的地址赋给指针p。 不妨&#xff0c;我们可以测…

【C++进阶学习】第六弹——set和map——体会用C++来构建二叉搜索树

set和map基础&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 前言&#xff1a; 在上篇的学习中&#xff0c;我们已经学习了如何使用C语言来实现二叉搜索树&#xff0c;在C中&#xff0c;我们是有现成的封装好的类模板来实现二叉搜索树…