PreparedStatement占位符索引强制从1开始,是JDBC规范统一规定,与SQL参数自然顺序一致;误用0会抛SQLException,正确用法为setXxx(1, val)、setXxx(2, val)等。

Java 中 PreparedStatement 的占位符索引**强制从 1 开始**,这是 JDBC 规范明确规定的,不是可配置的选项,也不支持从 0 或其他数字开始。
为什么索引从 1 开始?
这是 JDBC 标准(由 Java 规范要求)统一设计的,目的是与 SQL 语句中参数的自然阅读顺序一致——SQL 里没有“第 0 个参数”的概念。所有符合 JDBC 规范的驱动(MySQL、PostgreSQL、Oracle 等)都严格遵循这一规则。
常见错误:误用 0 起始索引
开发者常因受数组/集合习惯影响,写成 ps.setString(0, "value") 或循环从 i = 0 开始赋值,这会直接抛出 SQLException(如 “Invalid column index” 或 “Parameter index out of range”)。
-
ps.setString(0, "abc")→ 报错 -
ps.setString(1, "abc")→ 正确(第一个 ?) -
ps.setString(2, "def")→ 正确(第二个 ?)
如何安全地设置多个参数?
使用从 1 开始的递增整数,推荐用普通 for 循环(下标 +1),或手动指定索引:
立即学习“Java免费学习笔记(深入)”;
- 按顺序设值:
ps.setString(1, name); ps.setInt(2, age); ps.setDate(3, birth) - 循环设值(若参数列表为 List):
for (int i = 0; i - 注意:
getMetaData().getParameterCount()可获知 ? 的总个数,但索引仍从 1 起
批处理(addBatch)也遵循相同规则
每次调用 setXxx() 设置参数时,索引依然从 1 开始;执行 addBatch() 不改变索引逻辑,只是把当前已设好的参数组加入批次。
- 对每一批次,都要重新用
setXxx(1, ...)、setXxx(2, ...)设置 - 不能因为是批量就改用 0 基索引


















