PreparedStatement通过类型明确的setter方法按位置绑定参数,索引从1开始,需用setNull显式设空,日期需转换为java.sql类型,批量操作时同位置参数类型必须一致。

PreparedStatement 通过类型明确的 setter 方法绑定参数,每个方法对应一种 Java 类型,数据库驱动会自动转换为对应的 SQL 类型。
按参数位置绑定(推荐)
使用 setXxx(int parameterIndex, Xxx value) 系列方法,索引从 1 开始:
-
字符串:
ps.setString(1, "hello") -
整数:
ps.setInt(2, 123)或ps.setLong(2, 123L) -
浮点数:
ps.setDouble(3, 3.14)、ps.setFloat(3, 3.14f) -
布尔值:
ps.setBoolean(4, true) -
日期时间:
•ps.setDate(5, Date.valueOf("2024-01-01"))(仅日期)
•ps.setTimestamp(6, Timestamp.valueOf("2024-01-01 10:30:00"))(含时分秒) -
空值:
ps.setNull(7, Types.VARCHAR)(需指定 SQL 类型) -
字节数组(BLOB):
ps.setBytes(8, new byte[]{1, 2, 3}) -
大文本(CLOB):
ps.setString(9, "very long text...")(多数驱动支持自动映射)
处理 null 和可空字段
不能直接传 null 给 setXxx 方法(除 setNull 外),否则抛 NullPointerException。正确做法:
- 用
setNull(index, sqlType)显式设空,如:ps.setNull(1, Types.INTEGER) - 常见 SQL 类型常量:Types.VARCHAR、Types.INTEGER、Types.TIMESTAMP、Types.BOOLEAN 等,定义在
java.sql.Types - 若不确定字段类型,可查元数据或参考建表语句(如 VARCHAR → Types.VARCHAR,BIGINT → Types.BIGINT)
处理日期和时间的注意事项
Java 8+ 推荐使用 java.time 类型,但 PreparedStatement 原生只接受旧版 java.sql.* 类型,需做转换:
立即学习“Java免费学习笔记(深入)”;
-
LocalDateTime → Timestamp:Timestamp.valueOf(localDateTime) -
LocalDate → Date:Date.valueOf(localDate) -
Instant → Timestamp:Timestamp.from(instant) - 避免用
new java.util.Date()或Calendar,易出时区问题
批量插入时的类型一致性
调用 addBatch() 前,每次都要重新设置所有参数,且同位置参数类型必须保持一致:
- 错误示例:
ps.setInt(1, 100); ps.addBatch(); ps.setString(1, "abc"); ps.addBatch();→ 运行时报错 - 正确做法:每轮 batch 都用相同类型调用对应 setXxx,如始终用
setInt(1, ...) - 若字段允许混合类型(如 JSON 字段存字符串/数字),应统一用
setString并确保数据库能解析


















