數據庫錯誤:Parameter index out of range (1 > number of parameters, which is 0).
錯誤發生原因其實很簡單,就是當設置參數時,沒有相應的問號與之匹配(或者根本就沒有?號)
與sql語句有關的原因如下:
第一種:?號被單引號包圍。
(正確的應該是?號的兩邊沒有單引號包圍才對)
(如setString(1,“slkdjfkd”);時sql語句為:insert into table1 (c1,c2) values (’?’,’?’))。
此時?會被作為參數傳入,而不會再傳入 setString里面的值。
第二種: sql語句中沒有?號,在后面用到了set語句。
(如:select * from table);此時無需傳值。傳值就會出錯。
第三種:初學者很常見的錯誤:?—? 寫成了中文的問號導致報錯
這兩個問號是不同了,因為一個是中文,一個是英文,如果在sql語句中寫入的是中文,將無法識別。
以上是在網上找到的問題的解答,經過分析我程序的問題屬性第二種。我實際上使用SQL語句是SELECT COUNT(id) FROM app_role LIMIT 20 OFFSET 0,這里面沒有占位符,但我卻傳遞了參數,參數的類型是Map<String,Object>。實際上這個Map中是沒有內容的即Map.size()=0。
我的問題來了,我必須使用Map傳遞參數,在沒有參數時Map的size=0,這種情況該如何處理呢?
這就是JdbcTemplate和NamedParameterJdbcTemplate類在使用上的差別。
首先JdbcTemplate中方法queryForObject:
<T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException;
注意它的次序,它的參數是最后一個,如果在sql語句中沒有?占位符,那么參數args必須是空的,而我卻傳遞了一個Map類型,類型和個數都不適合,於是發生了錯誤
在使用NamedParameterJdbcTemplate的queryForObject方法:
public <T> T queryForObject(String sql, Map<String, ?> paramMap, Class<T> requiredType) throws DataAccessException
注意SQL語句中使用命名參數是通過Map傳遞的,如果sql中沒有命名參數則不需要paramMap中的參數進行替換,這真是一個好的用法,因此當你需要傳遞參數時參數個數不需要自己判斷。於是這個錯誤使用NamedParameterJdbcTemplate的queryForObject方法就解決了。