JdbcTemplate 內建資源管理,開發者無感知。DataAccessException 體系,可選捕獲。sql-error-codes.xml 將 Oracle 錯誤碼映射至語意化異常(如 BadSqlGrammarException、DataIntegrityViolationException)。// 傳統 JDBC:~40 行含資源管理與異常處理
// Spring JdbcTemplate:~15 行
List commissions = new ArrayList();
JdbcTemplate jt = new JdbcTemplate(dataSource);
List rows = jt.queryForList("SELECT comm FROM emp");
for (Map row : rows) {
Number comm = (Number) row.get("COMM");
commissions.add(comm != null ? new Integer(comm.intValue()) : null);
}
queryForList 回傳 List,每筆為一行,自動處理 NULL 值(無需 wasNull())。
// 更新薪資等級
String sql = "UPDATE salgrade SET losal=?, hisal=? WHERE grade=?";
jt.update(sql, new Object[]{lowSal, highSal, grade});
// 內部使用 PreparedStatement,自動綁定參數、關閉資源、轉換異常
jt.queryForObject("SELECT rowid FROM emp WHERE empno=?", ROWID.class) 直接取得 oracle.sql.ROWID。jt.queryForObject("SELECT sysdate FROM dual", Date.class)。jt.execute("DROP TABLE t PURGE")。StoredProcedure 類,宣告參數順序與型別,execute(Map inParams) 回傳 Map 包含 OUT 參數,自動處理 NULL 輸出(回傳 Java null 而非 0)。RowCallbackHandler/PreparedStatementSetter 回調介面,在內部類中處理 java.sql.Struct 或 JPublisher 產生的類,SQLException 由 Spring 統一轉換。ResultSetExtractor、PreparedStatementCreator、BatchPreparedStatementSetter 等,滿足不同抽象層次需求。OracleLobHandler、OracleSequenceMaxValueIncrementer、NativeJdbcExtractor 等 Oracle 專用工具類。Spring JDBC 不強迫全盤採用 Spring 生態,可獨立引入。它以極簡代碼解決 JDBC 核心痛點(資源、異常、廠商錯誤碼),並保留使用 Oracle 專屬特性的彈性。對於不想引入完整 ORM(如 Hibernate/TopLink)但想擺脫 JDBC 樣板代碼的團隊,Spring JDBC 是理想的「輕量級升級」。