Java开发者复习MySQL应聚焦工程实战:从saveUser()反推主键选择、事务控制、SQL安全与索引优化;按建表、增删改、查询、上线分阶段掌握高频场景;穿透JDBC连接池、ResultSet、PreparedStatement等细节;规避时区、GROUP BY误用、外键缺失等典型坑。

Java 开发者复习 MySQL,不是重学语法,而是聚焦“用得上、容易错、面试常考、上线出问题”的关键点。核心是把数据库能力嵌入到工程链路中,而不是孤立背命令。
一、从 Java 视角反推 MySQL 必须掌握的边界
你写一个 saveUser() 方法,背后至少涉及:
- 表结构是否支持并发插入(主键用
AUTO_INCREMENT还是 UUID?为什么) - 事务怎么控制(Spring 中
@Transactional默认传播行为、隔离级别对读一致性的影响) - SQL 是否安全(
WHERE id = ?而不是拼接字符串,防 SQL 注入) - 查询会不会慢(
SELECT * FROM users WHERE email = 'x@y.com'没建索引,线上查 5 秒)
所以复习起点不是“MySQL 有哪些语句”,而是:“Java 应用哪一步会卡在数据库?卡在哪?”
二、高频实战场景驱动的复习主线
按真实开发节奏组织内容,比按 SQL 分类更有效:
立即学习“Java免费学习笔记(深入)”;
-
建表阶段:主键选
INT还是BIGINT?NOT NULL和DEFAULT怎么配合使用?为什么TEXT字段不能加普通索引? -
增删改阶段:批量插入用
INSERT ... VALUES (),(),()还是PreparedStatement.addBatch()?DELETE FROM t WHERE id = ?忘加WHERE会怎样? -
查询阶段:单表查用
WHERE + 索引字段;多表关联优先考虑LEFT JOIN还是子查询?GROUP BY后SELECT只能写分组字段或聚合函数——这是硬约束,不是风格问题。 -
上线后阶段:慢查询日志怎么看?
EXPLAIN输出里type=ALL代表全表扫描,key=null说明没走索引。
三、JDBC 层必须穿透的细节
不只写 conn.createStatement().executeQuery(sql) 就完事,要懂:
- 连接池(如 HikariCP)为什么要设
maximumPoolSize?设太大反而拖垮 DB -
ResultSet不关会泄露连接,PreparedStatement不复用会丢失预编译优势 -
setAutoCommit(false)后忘了commit()或rollback(),事务就一直挂着 - MySQL 驱动 URL 加
?useSSL=false&serverTimezone=Asia/Shanghai是为了时区和证书兼容,不是可选项
四、避坑清单比语法手册更有价值
这些错误几乎每个 Java 后端都踩过:
- 用
datetime存时间,但 JavaLocalDateTime和数据库时区不一致 → 改用timestamp或统一转 UTC -
GROUP BY写成SELECT name, MAX(age) FROM user GROUP BY name,但误以为能同时取到“年龄最大的那个人的 ID” → 实际需用窗口函数或关联子查询 - 外键在开发环境开着,上线却关了(InnoDB 引擎支持,但有些团队为性能禁用)→ 表关联逻辑全靠代码维护,易出错
- 备份只导数据没导表结构,恢复时
source xxx.sql报错Table doesn't exist


















