news 2026/8/12 21:18:55

MySQL数据库实训:从SQL语法到JDBC连接池的实战避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL数据库实训:从SQL语法到JDBC连接池的实战避坑指南

1. 从“找答案”到“学方法”:我的MySQL数据库学习心路

最近在技术社区和论坛里,经常看到有同学在搜索“头歌MySQL数据库实训答案”,希望能找到一份现成的、带目录的“标准答案”。作为一个在数据库领域摸爬滚打了十多年的老手,我特别能理解这种心情。面对一堆复杂的SQL语句、JDBC连接报错、性能优化难题,谁不想有个“通关秘籍”呢?但我想说的是,直接搜索“答案”并复制粘贴,可能是学习数据库技术最无效、最危险的一条路。数据库操作,尤其是生产环境下的操作,牵一发而动全身,一个错误的UPDATE或DELETE语句,如果没有理解其背后的逻辑,可能会造成灾难性的数据丢失。今天,我不提供任何一份“标准答案”,而是想结合我自己的经验和那些热搜词里透露出的普遍困惑,和大家聊聊如何真正地“搞定”MySQL数据库实训,把每一次练习都变成扎实的成长。

“头歌”这类实训平台,其核心价值在于提供了一个从理论到实践的桥梁。它模拟了真实开发中会遇到的各种场景:从最基本的CREATE TABLEINSERT,到复杂的多表连接查询、子查询、事务控制,再到用JDBC在Java程序中操作数据库。热搜词里高频出现的“JDBC连接MySQL代码”、“mysql workbench使用教程”、“springboot jdbc”,恰恰说明了大家卡壳的常见环节。这些都不是靠背答案能解决的,它们需要你理解客户端(你的Java程序)与服务端(MySQL数据库)如何通信、连接池为何重要、时区设置不一致会导致什么诡异问题(“mysql的时区”、“jdbc的时区有什么作用”)。所以,与其寻找一份可能过时或不完全匹配的答案目录,不如掌握一套属于自己的、可复用的学习和排错方法论。这篇文章,我将围绕一个完整的数据库应用开发流程,拆解那些看似是“答案”背后的“原理”和“避坑点”,让你下次面对实训题目时,能胸有成竹,自己写出优雅且正确的代码。

2. 实训基石:理解MySQL安装、配置与核心概念

很多同学一上来就直奔SQL语句,忽略了环境本身,这就好比还没学会走路就想跑。热搜词里“mysql安装教程”、“mysql安装配置教程”、“linux 安装mysql”的热度,恰恰说明了这是第一道普遍的门槛。

2.1 安装选型与关键配置:避开第一个坑

安装MySQL,现在主流有两种方式:一种是下载官方安装包(“mysql下载官网”),另一种是使用Docker容器化部署(“人大金仓数据库docker”里也提到了Docker,思路相通)。对于学习和实训,我强烈推荐使用Docker,因为它能给你一个干净、隔离、且易于重置的环境。一条命令docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag就能启动一个MySQL服务器。这里的tag建议选择8.0版本,这是目前长期支持且应用最广的版本。

安装之后,80%的初期问题出在配置上。首要问题是字符集。MySQL默认的字符集在过去可能是latin1,这会导致中文乱码。务必在配置文件(如my.cnfmy.ini)或连接字符串中,将字符集设置为utf8mb4,这是真正的、完整的UTF-8编码,支持所有emoji和生僻字。

[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci

第二个关键配置是时区。热搜词“mysql的时区”和“jdbc的时区有什么作用”被并列提出,这绝对是个超级大坑!MySQL服务端有自己的系统时区,而你的Java应用(通过JDBC连接)运行在JVM上,JVM又有自己的时区。如果这三者不一致,你在数据库中看到的TIMESTAMPDATETIME字段的值,和你在Java程序中用ResultSet.getTimestamp()取出来的值,可能会相差好几个小时。解决方案是主动统一时区。我通常会在JDBC连接URL中显式指定服务器时区:jdbc:mysql://localhost:3306/dbname?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8。这样就能确保时间数据在传输过程中不发生歧义。

2.2 工欲善其事,必先利其器:图形化工具的选择

写SQL不一定非要在黑乎乎的命令行里。一个好的图形化客户端工具能极大提升效率。热搜词里提到了“mysql workbench使用教程”和“dbx数据库工具”。MySQL Workbench是官方出品,功能全面,尤其擅长数据库建模、迁移和性能监控,对于初学者理解表关系很有帮助。而“dbx数据库工具”或类似Navicat、DBeaver这样的第三方工具,则在日常查询、数据编辑、导入导出(“excel导入数据库”)方面更加便捷直观。

我的建议是:初期学习使用MySQL Workbench,因为它更“原汁原味”,能帮你熟悉MySQL自身的生态;进行高频的日常开发和数据操作时,可以选用Navicat或DBeaver提升效率。千万不要小看工具的力量,熟练使用工具的数据筛选、格式化、历史SQL记录功能,能让你把更多精力集中在逻辑本身,而不是记忆表名和字段名上。

2.3 核心概念速览:为写SQL打好基础

在动手写答案之前,必须清晰几个概念,这些是理解所有SQL语句的前提:

  • 数据库 vs 模式(Schema):在MySQL中,CREATE DATABASECREATE SCHEMA是等价的,都是一个逻辑容器,里面装着表、视图、存储过程等对象。你可以把它理解成一个“仓库”。
  • 表(Table):仓库里的“货架”,是实际存储数据的结构,由行(记录)和列(字段)组成。
  • 数据类型:定义每个列能存什么数据。INT(整数)、VARCHAR(255)(可变长度字符串)、DECIMAL(10,2)(精确小数)、DATETIME(日期时间)等。选对类型关乎数据正确性和存储效率。
  • 主键(Primary Key):唯一标识表中每一行的列(或列组合)。它不能为NULL,且必须唯一。通常是id INT AUTO_INCREMENT PRIMARY KEY
  • 外键(Foreign Key):一个表中的字段,它是另一个表的主键。用于建立和强制两个表数据之间的关联,保证参照完整性。这是理解多表查询的钥匙。

理解这些后,你再去看实训中“创建学生表、课程表、选课表”的题目,就知道为什么要这么设计了:学生表和课程表是主表,有各自的主键;选课表是关系表,它的“学号”和“课程号”分别是外键,指向另外两个表。

3. SQL实战精要:从基础命令到复杂查询

这是实训的核心部分,也是大家最需要“答案”的地方。但记住,语法是固定的,思路是灵活的。我们分层次来拆解。

3.1 数据定义与操作:增删改查的基石

1. 创建与管理(DDL)创建数据库和表是最基础的一步。关键点在于字段类型、约束(主键、外键、非空NOT NULL、唯一UNIQUE、默认值DEFAULT)和存储引擎的选择(通常用InnoDB,它支持事务和外键)。

-- 创建数据库,并指定字符集 CREATE DATABASE school_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE school_db; -- 创建学生表 CREATE TABLE student ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender CHAR(1) CHECK (gender IN ('M', 'F')), -- MySQL 8.0+支持CHECK约束 enrollment_date DATE DEFAULT (CURRENT_DATE) ) ENGINE=InnoDB;

注意:在MySQL 8.0以前,CHECK约束会被忽略,通常需要用触发器或应用程序逻辑来实现。这是版本差异带来的一个坑。

2. 数据操作(DML)插入、更新、删除数据。这里最大的坑是忘记WHERE条件,导致全表更新或删除。务必养成先写WHERE,再写SET或直接执行的习惯。

-- 插入数据 INSERT INTO student (name, gender) VALUES ('张三', 'M'), ('李四', 'F'); -- 更新数据:永远先确认WHERE条件! UPDATE student SET name = '王五' WHERE id = 1; -- 正确 -- UPDATE student SET name = '王五'; -- 危险!会更新所有行 -- 删除数据:同样谨慎! DELETE FROM student WHERE id = 2; -- 清空表用 TRUNCATE TABLE student; (更快,且重置AUTO_INCREMENT)

对于批量导入数据(如从Excel),可以使用LOAD DATA INFILE命令或图形化工具的导入功能(对应热搜“excel导入数据库”)。

3.2 查询的艺术:SELECT的千变万化

查询是SQL的灵魂。实训题目会层层递进。

1. 基础查询与过滤掌握SELECT,FROM,WHERE,ORDER BY,LIMITWHERE子句中的运算符(=,<>,>,<,BETWEEN,LIKE,IN)和逻辑运算符(AND,OR,NOT)要熟练。LIKE进行模糊查询时,%代表任意多个字符,_代表一个字符。

2. 聚合与分组这是分析数据的核心。COUNT(),SUM(),AVG(),MAX(),MIN()是常用的聚合函数。关键是要理解GROUP BYHAVING的区别:

  • GROUP BY:按指定列分组,然后对每个组进行聚合计算。
  • WHERE:在分组对原始行进行过滤。
  • HAVING:在分组对聚合结果进行过滤。
-- 查询每个性别的学生人数 SELECT gender, COUNT(*) as count FROM student GROUP BY gender; -- 查询平均分大于80分的课程(假设有score表) SELECT course_id, AVG(score) as avg_score FROM score GROUP BY course_id HAVING avg_score > 80; -- HAVING过滤聚合后的结果

3. 多表连接(JOIN)这是难点,也是重点。必须理解几种JOIN的区别:

  • INNER JOIN(内连接):只返回两个表中匹配的行。
  • LEFT JOIN(左连接):返回左表所有行,即使右表没有匹配。右表无匹配则为NULL。
  • RIGHT JOIN(右连接):与左连接相反。
  • FULL OUTER JOIN(全外连接):MySQL不直接支持,需用UNION模拟。

一个经典例子:查询所有学生及其选课信息(没选课的学生也要显示)。

SELECT s.name, c.course_name FROM student s LEFT JOIN selection sc ON s.id = sc.student_id LEFT JOIN course c ON sc.course_id = c.id;

思考过程:学生表(左表)是主表,我们要所有学生,所以用LEFT JOIN连接选课表。选课表再LEFT JOIN课程表,以获取课程名。如果只用INNER JOIN,没选课的学生就会被漏掉。

4. 子查询与集合操作子查询可以放在SELECT,FROM,WHERE后面。EXISTSIN常用于相关子查询。集合操作UNION(去重并集)、UNION ALL(不去重并集)用于合并多个查询结果。

-- 查询没有选任何课程的学生 (使用 NOT EXISTS) SELECT * FROM student s WHERE NOT EXISTS ( SELECT 1 FROM selection sc WHERE sc.student_id = s.id ); -- 查询选修了课程1或课程2的学生 (使用 IN 或 UNION) SELECT DISTINCT student_id FROM selection WHERE course_id IN (1, 2); -- 或 SELECT student_id FROM selection WHERE course_id = 1 UNION SELECT student_id FROM selection WHERE course_id = 2;

关于热搜“mysql的or能去重吗”,这里要澄清:OR是逻辑运算符,用于连接WHERE条件,它本身不去重。去重要靠SELECT DISTINCTUNION(默认去重)。UNION ALL才不去重。

4. 超越SQL:程序如何与数据库对话——JDBC深度解析

当SQL在命令行或工具里跑通后,下一步就是如何在Java程序中使用它。这就是JDBC(Java Database Connectivity),热搜词“jdbc连接mysql代码”、“springboot jdbc”、“jdbc client”都指向这里。这也是实训中容易出错的重灾区。

4.1 JDBC基础连接:从DriverManager到DataSource

最原始的JDBC连接步骤是固定的“七步曲”:1.加载驱动;2.获取连接;3.创建Statement;4.执行SQL;5.处理结果集;6.关闭资源。代码骨架如下:

// 1. 加载驱动 (MySQL 6.0+ 可以省略,通过SPI自动加载) Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 获取连接 (注意时区参数!) String url = "jdbc:mysql://localhost:3306/school_db?serverTimezone=Asia/Shanghai&useSSL=false"; String user = "root"; String password = "yourpassword"; Connection conn = DriverManager.getConnection(url, user, password); // 3. 创建Statement Statement stmt = conn.createStatement(); // 4. 执行查询 String sql = "SELECT * FROM student"; ResultSet rs = stmt.executeQuery(sql); // 5. 处理结果集 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println(id + ": " + name); } // 6. 关闭资源 (务必在finally块中或使用try-with-resources) rs.close(); stmt.close(); conn.close();

但是,直接使用DriverManagerStatement在生产环境或严肃项目中是极不推荐的,因为它存在两个致命问题:1. 性能差:每次获取连接都是新建一个物理连接,开销巨大;2. SQL注入风险:如果用字符串拼接SQL,Statement无法防止SQL注入攻击。

4.2 PreparedStatement:安全与性能的守护者

必须使用PreparedStatement。它预编译SQL,使用?作为占位符,既能防止SQL注入,又能提升重复执行的性能。

String sql = "INSERT INTO student (name, gender) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "赵六"); // 参数索引从1开始 pstmt.setString(2, "M"); pstmt.executeUpdate();

这是必须养成的编码习惯。热搜中“jdbc连接mysql代码”的优秀示例,都应该使用PreparedStatement

4.3 连接池:高并发应用的必需品

“mysql的数据库连接池”是另一个热搜关键点。为什么需要连接池?因为创建和销毁数据库连接是非常昂贵的操作。连接池在应用启动时就创建一定数量的连接放在“池”里,程序使用时从池中借出,用完后归还,而不是关闭。这极大地提升了响应速度和处理能力。

常见的连接池有HikariCP(Spring Boot默认,速度极快)、Druid(功能强大,带监控)。在Spring Boot中配置HikariCP非常简单:

# application.yml spring: datasource: url: jdbc:mysql://localhost:3306/school_db?serverTimezone=Asia/Shanghai username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 10 # 连接池最大连接数 minimum-idle: 5 # 最小空闲连接数 connection-timeout: 30000 # 连接超时时间(毫秒)

然后,你就可以通过@Autowired注入DataSourceJdbcTemplate来操作数据库了,Spring会帮你管理连接池的生命周期。这才是现代Java应用连接数据库的正确方式。

4.4 事务处理:保证数据的一致性

事务是数据库的ACID特性的体现。在JDBC中,默认是自动提交(auto-commit=true)。对于需要多个SQL作为一个原子操作的情况,必须手动管理事务。

Connection conn = dataSource.getConnection(); try { conn.setAutoCommit(false); // 1. 关闭自动提交 // 2. 执行多个SQL操作 updateAccountA(conn, ...); updateAccountB(conn, ...); conn.commit(); // 3. 提交事务 } catch (SQLException e) { conn.rollback(); // 4. 发生异常,回滚事务 throw e; } finally { conn.setAutoCommit(true); // 恢复默认 conn.close(); }

在Spring框架中,可以使用声明式事务管理(@Transactional注解),让框架帮你处理这些样板代码,更加简洁和安全。

5. 实训进阶与排错指南:当你遇到“异常”时

即使理解了所有原理,实操中依然会踩坑。热搜词“flink的jdbc连接器异常”、“iis8 asp 无法连接access数据库”、“trae连接sqlite数据库mcp配置”虽然场景不同,但本质都是“连接”或“配置”问题。我们聚焦MySQL和JDBC的常见异常。

5.1 连接类异常排查链路

问题现象Communications link failure,Access denied for user,Unknown database等。

排查步骤

  1. 检查数据库服务是否运行systemctl status mysql(Linux) 或在服务列表查看 (Windows)。
  2. 检查连接参数:主机名、端口、数据库名、用户名、密码是否完全正确。特别注意密码是否有特殊字符需要转义。
  3. 检查网络和防火墙:是否能在客户端机器上ping通数据库服务器?防火墙是否开放了3306端口?
  4. 检查用户权限:用于连接的MySQL用户是否具有从指定主机(%或你的客户端IP)访问目标数据库的权限?可以用命令SHOW GRANTS FOR 'username'@'host';查看。
  5. 检查JDBC驱动版本与MySQL版本兼容性:使用过旧的驱动连接新版本MySQL可能会出错。推荐使用MySQL Connector/J 8.0.x。
  6. 检查连接URL参数:时区serverTimezone是否设置?SSL设置useSSL是否与服务器配置匹配(开发环境常设为false)?字符集参数characterEncoding是否设置?

5.2 时区与编码问题深度解析

这是两个最隐蔽的坑。

  • 时区问题:表现为插入的时间比实际时间少8小时(中国时区)。根因:JDBC驱动在未指定时区时,可能会使用JVM默认时区或UTC与服务器交互。解决方案:如前所述,在JDBC URL中强制指定serverTimezone=Asia/Shanghai。同时,确保MySQL服务器操作系统时区、MySQL全局时区(@@global.time_zone)设置正确。
  • 编码问题:表现为中文变成问号?或乱码。根因:连接层、客户端、服务器三处的字符集不统一。解决方案
    1. 数据库、表、字段字符集设为utf8mb4
    2. 在JDBC URL中指定useUnicode=true&characterEncoding=UTF-8(注意,这里参数名是UTF-8,但值对应utf8mb4,驱动会处理)。
    3. 确保你的Java源文件本身也是UTF-8编码。

5.3 SQL执行异常:语法、约束与死锁

  • 语法错误:仔细检查SQL语句,关键词拼写、括号匹配、引号使用(字符串用单引号)。利用MySQL Workbench的语法高亮和格式化功能。
  • 约束违反Duplicate entry(主键或唯一键重复)、Cannot add or update a child row: a foreign key constraint fails(外键约束失败,试图插入或更新一个不存在的父键值)。这类错误需要你检查业务逻辑,确保数据的一致性。
  • 死锁:在高并发更新同一条记录或按不同顺序更新多条记录时可能发生。错误信息会包含Deadlock found when trying to get lock。解决方案通常涉及优化事务逻辑,让多个事务以相同的顺序访问资源,或缩短事务持有锁的时间。

5.4 性能问题初探:为什么我的查询这么慢?

实训后期可能会涉及性能。如果查询慢,可以按以下思路排查:

  1. 使用EXPLAIN分析:在SELECT语句前加上EXPLAIN,查看MySQL的执行计划。关注type列(访问类型,ALL最差,indexrangerefeq_refconst依次变好)、rows列(预估扫描行数)、key列(是否使用了索引)。
  2. 检查索引WHERE条件、JOIN关联字段、ORDER BYGROUP BY的列是否建立了合适的索引?使用SHOW INDEX FROM table_name;查看。但索引不是越多越好,它会降低写操作速度。
  3. 避免SELECT *:只查询需要的列,减少网络传输和内存开销。
  4. 关注慢查询日志:在MySQL配置中开启慢查询日志,定期分析哪些SQL执行时间过长。

6. 从实训到实战:知识体系的延伸与工具链

完成基础实训只是起点。热搜词还透露了大家更广泛的兴趣领域,这些构成了数据库技能的完整拼图。

6.1 设计工具与建模思想

“数据库课程设计”需要的不只是写SQL,更是设计。如何从需求中抽象出实体、属性、关系(E-R图)?如何规范化到第三范式(3NF)以减少数据冗余?这里推荐使用MySQL Workbench的EER Diagram功能进行可视化建模,它能帮你理清思路,并正向生成建表SQL,反向从数据库导入生成模型图。

6.2 运维与生态了解

  • 备份与恢复mysqldump是逻辑备份的经典工具。命令如mysqldump -u root -p school_db > backup.sql。恢复则是mysql -u root -p school_db < backup.sql。对于“db2数据库备份”等其他数据库,概念相通,工具不同。
  • 其他数据库:了解不同的数据库类型很有必要。“达梦数据库”是国产关系型数据库,“向量数据库”用于AI时代的相似性搜索,“崖山数据库是pg吗”这类问题说明大家对PostgreSQL(一个强大的开源关系数据库,功能常比MySQL更丰富)也有关注。拓宽视野,理解各自适用场景。
  • 面试准备:“mysql面试题”、“数据库面试题”、“sharding jdbc 面试题”是热门搜索。面试常问索引原理(B+树)、事务隔离级别(读未提交、读已提交、可重复读、串行化)、锁机制、主从复制、分库分表(Sharding-JDBC就是为此而生)等。这些知识需要你在实训之外系统学习。

6.3 框架集成:Spring Boot与MyBatis

在真实企业开发中,很少直接裸写JDBC。Spring Data JPA(基于Hibernate)或MyBatis(半自动ORM)是更主流的选择。它们封装了JDBC的复杂性,让你更专注于业务逻辑。

  • Spring Data JPA:通过定义实体类(@Entity)和仓库接口(继承JpaRepository),几乎不用写SQL就能完成大部分CRUD操作。适合快速开发、表结构相对简单的项目。
  • MyBatis:你需要编写SQL映射文件(XML)或使用注解,但能获得对SQL的完全控制权,便于优化复杂查询。它解决了JDBC的硬编码和手动设置参数的问题。

无论是JPA还是MyBatis,其底层依然离不开JDBC和连接池。理解了本章前面讲的JDBC核心,你再学习这些框架时会感觉豁然开朗,因为它们只是帮你做了更好的封装和管理。

回过头看,“头歌MySQL数据库实训答案”的终极答案,其实就藏在这一步步的原理理解、一行行的代码实践、一次次的错误排查之中。数据库技术是一门实践性极强的学科,没有捷径。当你不再依赖“目录”和“答案”,而是能够根据需求自己设计表结构,写出高效的SQL,在程序中稳健地处理数据,并能在出问题时快速定位根因,你就真正掌握了这门技能。这份能力,远比任何一份现成的答案都来得珍贵和可靠。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 21:16:43

BepInEx终极指南:3分钟让你的Unity游戏变身模组乐园 [特殊字符]

BepInEx终极指南&#xff1a;3分钟让你的Unity游戏变身模组乐园 &#x1f3ae; 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想象一下&#xff0c;你心爱的Unity游戏突然拥有了无…

作者头像 李华
网站建设 2026/8/12 21:16:11

移动端H5软键盘弹起导致页面布局错乱的系统性解决方案

1. 项目概述&#xff1a;当AI对话遇上移动端软键盘最近在做一个移动端H5的AI对话项目&#xff0c;类似一个嵌入在App或浏览器里的智能客服或聊天助手。功能本身不复杂&#xff0c;但上线前测试时&#xff0c;遇到了一个非常典型且恼人的问题&#xff1a;在安卓和iOS的不同机型、…

作者头像 李华
网站建设 2026/8/12 21:14:27

机器人学习终极指南:从零开始掌握机器人技术完整资源清单

机器人学习终极指南&#xff1a;从零开始掌握机器人技术完整资源清单 【免费下载链接】awesome-robotics A list of awesome Robotics resources 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-robotics 想要进入机器人技术领域却不知从何开始&#xff1f;&…

作者头像 李华
网站建设 2026/8/12 21:12:32

智能代理协作终极指南:如何用CrewAI构建高效AI团队工作流

智能代理协作终极指南&#xff1a;如何用CrewAI构建高效AI团队工作流 【免费下载链接】crewAI Framework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling co…

作者头像 李华
网站建设 2026/8/12 21:12:01

MSPM0 M0内核MCU实现IMU数据融合与姿态解算全流程解析

1. 先搞清楚“超级稳”到底指的是什么看到“MSPM0天猛星M0IMU陀螺仪&#xff08;超级稳&#xff09;”这个标题&#xff0c;很多人的第一反应可能是&#xff1a;这是一个新的传感器模块&#xff0c;还是一个集成了特定算法的开发板&#xff1f;它所谓的“超级稳”&#xff0c;是…

作者头像 李华
网站建设 2026/8/12 21:11:41

纯HTML+CSS打造端午主题网页:从布局到视觉效果的完整实践

1. 项目概述&#xff1a;从零到一&#xff0c;打造一个充满节日氛围的端午网页 最近在整理一些前端基础项目时&#xff0c;突然想到&#xff0c;用最纯粹的HTML和CSS来还原一个传统节日的氛围&#xff0c;其实是一件很有成就感的事情。端午作为我们重要的传统节日&#xff0c;有…

作者头像 李华