jdbc增删改操作统一用executeupdate()并检查返回值,必须用preparedstatement防sql注入、支持预编译,insert后通过return_generated_keys获取自增主键,资源须用try-with-resources确保关闭。

JDBC 处理数据库增删改(INSERT/UPDATE/DELETE)操作,核心是统一使用 executeUpdate() 方法,它返回受影响的行数,能直接反映操作是否生效。关键不在“怎么写”,而在于“怎么写得安全、可维护、不踩坑”。
用 PreparedStatement 替代 Statement
虽然 Statement 可以快速执行拼接好的 SQL(比如 "INSERT INTO student VALUES('张三', 20)"),但生产环境必须用 PreparedStatement:
- 防止 SQL 注入:参数通过
setString(1, "张三")等方式传入,数据库自动转义 - 支持预编译,多次执行同结构 SQL 时性能更好
- 代码清晰:SQL 模板和数据分离,比如
"INSERT INTO student(name, age) VALUES(?, ?)"
检查 executeUpdate() 的返回值
这个整数不是“成功/失败”的布尔值,而是实际被修改的记录条数:
- 返回 1:正常插入一条;返回 0:可能 WHERE 条件没匹配到任何行(UPDATE/DELETE 常见)或主键冲突导致插入失败
- 别只看有没有异常,要主动判断返回值。例如更新用户年龄,返回 0 就该提示“用户不存在”而不是静默结束
获取自增主键(INSERT 场景)
如果表主键是 AUTO_INCREMENT,插入后需要立刻拿到新 ID,不能靠 SELECT MAX(id):
- 创建 PreparedStatement 时加标志:
conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) - 执行
executeUpdate()后,调用getGeneratedKeys()得到 ResultSet,再用rs.getLong(1)取值
资源关闭必须到位
Connection、Statement(或 PreparedStatement)、ResultSet 都是系统资源,不关会导致连接耗尽、内存泄漏:
- 推荐用 try-with-resources:自动按逆序关闭(ResultSet → Statement → Connection)
- 避免手动 close() 写在 finally 里却忘了判 null,也避免异常打断导致后续 close() 不执行
- 即使用了 Druid/Hikari 连接池,逻辑上的 close() 仍不可省——它只是把连接归还给池,不是销毁物理连接
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











