Java中PreparedStatement通过?占位符+setXxx()按1起始索引绑定参数,可防SQL注入、提性能;null值须用setNull()指定JDBC类型;批量操作用addBatch/executeBatch;需try-with-resources确保资源释放。

Java 中用 PreparedStatement 绑定参数,核心是用占位符 ? 代替 SQL 中的动态值,再通过 setXxx() 方法按位置或名称(部分数据库支持)设置实际参数。关键在于避免 SQL 注入、提升性能,且类型必须匹配。
用问号占位符 + 按索引绑定
这是最常用、兼容性最好的方式。SQL 字符串中所有需要动态传入的值都用 ? 占位,然后按从 1 开始的顺序调用对应的 setXxx(int index, ...) 方法。
-
setString(1, "张三")—— 第 1 个 ? 设为字符串 -
setInt(2, 25)—— 第 2 个 ? 设为整数 -
setDate(3, Date.valueOf("2024-01-01"))—— 第 3 个 ? 设为日期 - 注意:索引从 1 开始,不是 0;类型要和字段/参数语义一致(如金额优先用
setBigDecimal)
处理 null 值和特殊类型
不能直接传 null 给 setXxx()(会报空指针),需用 setNull(int index, int sqlType) 明确指定 JDBC 类型。
-
setNull(4, Types.VARCHAR)—— 表示第 4 个 ? 是可为空的字符串 -
setNull(5, Types.INTEGER)—— 第 5 个 ? 是可为空的整数 - 常见
sqlType:可用java.sql.Types中的常量,如VARCHAR、INTEGER、DECIMAL、BOOLEAN等
批量插入时用 addBatch + executeBatch
如果一次执行多条结构相同的 SQL(比如批量保存用户),可在循环中反复调用 setXxx() 设置新值,再调用 addBatch() 缓存,最后统一 executeBatch() 提交。
立即学习“Java免费学习笔记(深入)”;
- 每次
addBatch()前必须重新设置所有参数(因为 PreparedStatement 状态会保留上一次的值) - 建议每 1000 条左右执行一次
executeBatch(),避免内存占用过高 - 执行后记得调用
clearBatch()(非必须但推荐)
注意资源释放和异常处理
PreparedStatement 和 Connection 都是重量级资源,必须显式关闭。推荐用 try-with-resources 自动管理。
- 确保
PreparedStatement在使用后关闭,即使发生异常 - 不要在循环里反复创建 PreparedStatement(应复用),除非 SQL 结构不同
- SQL 语法错误或参数类型不匹配通常在
executeUpdate()或executeQuery()时才抛出,不是在setXxx()时


















