使用 preparedstatement 设置 time 参数时,应调用 settime(int parameterindex, time x) 方法。该方法直接接受 java.sql.time 对象作为参数,无需手动转换为字符串或处理时区细节,驱动程序会自动将其映射为数据库的 time 类型。

如何从 java.util.Date 转换并设置 Time 参数
将 java.util.Date 转换为 java.sql.Time 后,通过 setTime 方法即可正确绑定参数。核心步骤是实例化 java.sql.Time 并传入时间戳,随后在预编译语句中指定索引进行赋值。

import java.sql.*;
public class TimeExample {
public static void main(String[] args) throws Exception {
// 模拟获取连接
Connection conn = DriverManager.getConnection("jdbc:h2:mem:test", "sa", "");
// 创建表
Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE test_time (id INT PRIMARY KEY, event_time TIME)");
// 准备语句
String sql = "INSERT INTO test_time (id, event_time) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 1. 获取当前系统时间
java.util.Date utilDate = new java.util.Date();
// 2. 转换为 java.sql.Time
Time sqlTime = new Time(utilDate.getTime());
// 3. 设置参数
pstmt.setInt(1, 1);
pstmt.setTime(2, sqlTime);
// 4. 执行
pstmt.executeUpdate();
// 验证结果
ResultSet rs = pstmt.executeQuery("SELECT * FROM test_time");
if (rs.next()) {
System.out.println("Stored Time: " + rs.getTime("event_time"));
}
// 清理
rs.close();
pstmt.close();
stmt.close();
conn.close();
}
}
运行上述代码,控制台将输出类似 Stored Time: 10:30:45 的结果(具体时分秒取决于运行时刻)。这证明了 java.sql.Time 能准确传递时间部分,忽略日期部分。
如何处理带毫秒精度的 Time 参数
java.sql.Time 构造函数默认只保留到秒级精度,若需保留毫秒,需使用 java.sql.Time 的子类或直接操作底层时间戳。但在大多数 JDBC 驱动中,推荐使用 setTime(Time x, Calendar cal) 重载方法或确保驱动支持高精度。对于标准场景,直接使用 new Time(date.getTime()) 已足够,因为数据库通常存储到秒。

import java.sql.*;
import java.util.Calendar;
import java.util.TimeZone;
public class PrecisionTimeExample {
public static void main(String[] args) throws Exception {
Connection conn = DriverManager.getConnection("jdbc:h2:mem:test", "sa", "");
Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE precision_test (id INT, precise_time TIME(3))");
String sql = "INSERT INTO precision_test (id, precise_time) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
java.util.Date utilDate = new java.util.Date();
// 注意:java.sql.Time 本身不存储毫秒信息用于显示,但 getTime() 包含毫秒
// 若要精确控制,可依赖驱动对 TIME(3) 的支持
Time t = new Time(utilDate.getTime());
pstmt.setInt(1, 1);
pstmt.setTime(2, t);
pstmt.executeUpdate();
ResultSet rs = pstmt.executeQuery("SELECT precise_time FROM precision_test");
if (rs.next()) {
Time result = rs.getTime("precise_time");
System.out.println("Result: " + result);
}
rs.close();
pstmt.close();
stmt.close();
conn.close();
}
}
此示例展示了在处理更高精度需求时的基本结构。实际毫秒精度取决于数据库驱动和数据库类型(如 MySQL 的 TIME(3))。关键点是 setTime 方法签名不变,仅输入对象不同。
基于程序中某个输入、条件或结果的具体问题
当输入为 null 时,setTime 方法会抛出 SQLException 还是允许插入 NULL?答案是:如果数据库列允许 NULL,且你希望插入 NULL,应使用 pstmt.setNull(index, Types.TIME) 而不是 setTime(null)。直接传 null 给 setTime 会导致空指针异常或 SQL 错误,具体取决于驱动实现,但标准做法是使用 setNull。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











