2011-11-23 112 views
0

在我的項目中,我使用Spring 3.0 JdbcTemplate來實現DAO類。它提供了諸如查詢(...),更新(...)等方便的方法。這些方法接受對象作爲綁定到查詢的參數。在javadoc中,聲明它是由PreparedStatement來猜測相應的SQL類型。所以當使用原語或包裝時,它很簡單。spring jdbc模板自定義類型

但在我的代碼中,我使用特殊的類來表示id。例如UserId。它具有獲取其整數值的公共方法 - getInt()。現在我必須使用

userId.getInt() 

每次我需要將UserId的實例傳遞給JdbcTemplate查詢。如果我忘了寫只是

userId 

我明明得到的SQLException,因爲我的用戶ID對象不能預處理語句(here are the rules to map Object type to corresponding SQL type)被消耗。但是這種類型的錯誤在編譯期間無法被發現(因爲JdbcTemplate接受Object作爲參數),這使得錯誤的引入變得容易。

有什麼辦法可以避免調用.getInt(),只是將我的UserId對象傳入查詢?

回答

1

我想你可以覆蓋org.springframework.jdbc.core.JdbcTemplate.newArgPreparedStatementSetter(Object[])org.springframework.jdbc.core.ArgPreparedStatementSetter的新版本檢查(在doSetValue)對象argValue是否是你的特殊UserId類型。

+0

謝謝! newArgPreparedStatementSetter確實受保護。但是這有一個問題 - ArgPreparedStatementSetter具有包保護的默認修飾符。所以我不能直接擴展它(想知道爲什麼春天團隊不允許這樣做會很方便!) –

+0

ok我最終重寫了我自己的{ArgPreparedStatementSetter}版本,然後擴展{JdbcTemplate}以覆蓋{newArgPreparedStatementSetter}方法 –