PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(i+1, objArray[i]); // objArray 為 Object[]
// 報錯:不支持 Object 類型
PreparedStatement.setObject(int, Object) 雖接受 Object,但驅動程序需將其映射為具體的 JDBC 類型(INTEGER、VARCHAR 等)。若傳入的對象實際類型(如 Integer、String)與數據庫列類型不匹配,或驅動無法推斷類型,則拋出「不支持 Object 類型」。
if (val instanceof Integer) ps.setInt(idx, (Integer)val);
else if (val instanceof String) ps.setString(idx, (String)val);
else if (val instanceof Date) ps.setTimestamp(idx, new Timestamp(((Date)val).getTime()));
// ...
ps.setString(idx, String.valueOf(val));
Object[],改用泛型集合或自定義參數對象。
// 原代碼
Object[] params = {id, name, age};
for (int i=0; i<params.length; i++) ps.setObject(i+1, params[i]);
// 修正:使用 List
ParameterBinder 工具類集中處理類型轉換。log4jdbc、p6spy)觀察實際執行的 SQL 與參數類型。