preparedstatement是带参数的sql执行器,核心为写带?的sql、填参数、执行;解决sql注入和重复编译问题;固定五步流程:获connection、写含?的sql、preparestatement、setxxx填参、executequery/update;重点掌握setstring、setint、setdouble、setdate、setboolean及setnull;进阶支持批量操作和自增主键回取。

直接上手学 PreparedStatement,不用绕弯子。它本质就是带参数的 SQL 执行器,核心就三件事:写带 ? 的 SQL、填参数、执行。学得扎实的关键不在背 API,而在理解「为什么用它」和「什么时候必须用」。
先搞懂它解决什么问题
不用 PreparedStatement,你大概率会这样拼 SQL:
String sql = "SELECT * FROM user WHERE name = '" + name + "' AND age > " + age;这有两大硬伤:
- 如果用户输入 name = "Alice'; DROP TABLE user; --",整个表可能被删掉——这就是 SQL 注入
- 每次执行都要让数据库重新解析、编译整条 SQL,哪怕只是改了个名字,效率低
PreparedStatement 把 SQL 骨架和参数彻底分开,数据库只编译一次骨架,后面只换参数值,既安全又快。
掌握五步固定流程
所有场景都按这个顺序来,形成肌肉记忆:
- 拿到 Connection(用完记得关,推荐 try-with-resources)
- 写 SQL,把可变部分全换成 ?,比如 "INSERT INTO book(title, price) VALUES (?, ?)"
- 调用 conn.prepareStatement(sql) 得到 PreparedStatement 对象
- 用 setString(1, "Java编程")、setDouble(2, 59.9) 按位置填值(序号从 1 开始)
- 查数据用 executeQuery(),增删改用 executeUpdate()
重点练熟参数设置和常见类型
别死记所有 setXxx 方法,先覆盖日常 90% 场景:
- setString(位置, 值):处理文本、日期字符串(如 "2026-10-15")
- setInt / setLong / setDouble(位置, 值):数字类型,注意 null 要用 setNull(位置, Types.INTEGER)
- setDate(位置, new java.sql.Date(...)):传 Date,不是 java.util.Date
- setBoolean(位置, true/false):布尔值直接传
小技巧:参数位置错一位、类型不匹配,运行时报 SQLException,不是编译错误,所以多跑两遍测试数据很必要。
进阶一步:批量操作和主键回取
真正体现 PreparedStatement 价值的两个实战点:
- 批量插入:用 addBatch() 累加多组参数,再用 executeBatch() 一次性提交,比单条快几倍到几十倍
- 获取自增 ID:构造时加参数 Statement.RETURN_GENERATED_KEYS,执行后调 getGeneratedKeys() 取结果集,适合用户注册后立刻返回新 ID
这两个功能普通 Statement 做不到,是 PreparedStatement 不可替代的理由。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











