java.sql.SQLException: 無效的列類型
at oracle.jdbc.driver.OraclePreparedStatement.setNull(...)
at oracle.jdbc.driver.OraclePreparedStatement.setObject(...)
實體類字段為 java.util.Date,直接調用 ps.setDate(index, date) 或 ps.setObject(index, date)。Oracle 驅動要求 setDate 參數必須是 java.sql.Date(或 java.sql.Timestamp),java.util.Date 會觸發類型檢查失敗。
// 工具方法:安全轉換
public static java.sql.Date toSqlDate(java.util.Date utilDate) {
return utilDate == null ? null : new java.sql.Date(utilDate.getTime());
}
// 使用示例
ps.setDate(index++, toSqlDate(account.getPauseDate()));
ps.setDate(index++, toSqlDate(account.getCloseDate()));
ps.setDate(index++, toSqlDate(account.getBirthdate()));
ps.setDate(index++, toSqlDate(account.getLastLoginTime()));
int idx = 1;
ps.setObject(idx++, account.getRecommenderId()); // Integer
ps.setString(idx++, account.getLoginName()); // String
ps.setString(idx++, account.getLoginPassword());
ps.setDate(idx++, toSqlDate(account.getPauseDate())); // DATE
ps.setDate(idx++, toSqlDate(account.getCloseDate()));
ps.setString(idx++, account.getRealName());
// ... 其他字段
ps.setDate(idx++, toSqlDate(account.getLastLoginTime()));
ps.setString(idx++, account.getLastLoginIp());
ps.executeUpdate();
封裝 ParameterBinder 工具類,根據字段類型自動調用 setNull、setString、setDate、setTimestamp,消除手動索引錯誤:
binder.bind(ps, 1, account.getPauseDate()); // 內部自動 toSqlDate + setDate/null
JDBC URL 建議使用標準格式:
jdbc:oracle:thin:@//localhost:1521/orcl // 服務名模式
// 或
jdbc:oracle:thin:@localhost:1521:orcl // SID 模式
兩種均可,服務名模式支援 RAC 故障轉移。