preparedstatement通过setxxx()方法按索引(从1开始)设置参数,xxx对应java类型如setstring、setint;需严格匹配sql中?顺序,日期用setdate/settimestamp等专用方法,空值用setnull指定sql类型。

PreparedStatement 通过一系列 setXxx() 方法来设置不同数据类型的参数,方法名中的 Xxx 对应目标 Java 类型(如 setString、setInt),并根据 SQL 参数位置(从 1 开始)或名称(命名参数需数据库和驱动支持)赋值。
基础类型与常用 setXxx() 方法
每个 JDBC 类型都有对应的方法,通常按 Java 类型命名,多数方法接受参数索引(int)和值:
-
setString(1, "hello")→ 绑定 VARCHAR / TEXT -
setInt(2, 123)→ 绑定 INTEGER -
setLong(3, 9876543210L)→ 绑定 BIGINT -
setDouble(4, 3.14)→ 绑定 DOUBLE 或 DECIMAL(精度可能丢失,推荐用setBigDecimal) -
setBoolean(5, true)→ 绑定 BOOLEAN 或 TINYINT(1) -
setFloat(6, 2.5f)→ 绑定 REAL / FLOAT -
setShort(7, (short)42)→ 绑定 SMALLINT -
setByte(8, (byte)7)→ 绑定 TINYINT
处理日期与时间类型
Java 8 之前使用 java.sql.* 类型;Java 8+ 推荐用 java.time.* 配合 setObject(需 JDBC 4.2+ 驱动),更安全且无时区歧义:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
setDate(1, Date.valueOf("2023-10-01"))→ SQL DATE(仅日期) -
setTime(2, Time.valueOf("14:30:00"))→ SQL TIME(仅时间) -
setTimestamp(3, Timestamp.valueOf("2023-10-01 14:30:00.123"))→ SQL TIMESTAMP(含毫秒) -
setObject(4, LocalDateTime.now(), JDBCType.TIMESTAMP)→ 推荐(JDBC 4.2+) -
setObject(5, Instant.now(), JDBCType.TIMESTAMP_WITH_TIMEZONE)→ 带时区的时间戳
处理空值与特殊类型
不能直接传 null,必须用 setNull() 明确指定 SQL 类型:
-
setNull(1, Types.VARCHAR)→ 相当于setString(1, null),但语义清晰 -
setNull(2, Types.INTEGER)→ 绑定 NULL 到 INT 字段 -
setBytes(3, new byte[]{0x01, 0x02})→ BLOB / VARBINARY -
setBigDecimal(4, new BigDecimal("12345.6789"))→ 精确数值,避免浮点误差 -
setObject(5, myEnum.name(), JDBCType.VARCHAR)→ 枚举转字符串存入
注意事项与最佳实践
类型匹配影响执行效率与正确性,尤其在数据库强类型场景下:
- 避免用
setObject(int, Object)自动推断——行为依赖驱动,可能出错 - 数字类型优先选
setInt/setLong/setBigDecimal,不用setString存数字(易触发隐式转换或 SQL 注入风险) - 日期务必用对应时间类型方法,别用字符串拼接(如
"'2023-10-01'") - Oracle 的
NUMBER(1)布尔字段可用setInt(0/1),PostgreSQL 的BOOLEAN用setBoolean - MySQL 的
TINYINT(1)常被 ORM 当布尔用,但 JDBC 中仍建议用setBoolean(驱动会自动适配)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










