2017-03-01 198 views
1
String SQL = "INSERT INTO Employee (name, age, salary) VALUES (:name,:age,:salary)"; 
Map namedParameters = new HashMap(); 
namedParameters.put("name", name); 
namedParameters.put("age", age); 
namedParameters.put("salary", salary); 
namedParameterJdbcTemplate.update(SQL, namedParameters); 

String SQL = "UPDATE Employee SET age = :age WHERE empid = :empid"; 
SqlParameterSource namedParameters = new MapSqlParameterSource(); 
namedParameters.addValue("age", age); 
namedParameters.addValue("empid", empid); 
namedParameterJdbcTemplate.update(SQL, namedParameters); 

似乎Map和SqlParameterSource都是一樣的。但爲什麼API開發者添加了這些API?是否有任何特定的情況下使用Map或SqlParameterSource,使執行速度更快?請解釋清楚。提前致謝。何時在namedParameterJdbcTemplate中使用Map和SqlParameterSource?

回答

2

使用Map對於簡單的情況很好,但是通過Map使用SqlParamaterSource有兩個好處。

第一種是簡單的構建模式,允許您添加多個行內聯(namedParameters.addValue()。addValue()。addValue()等))。

第二個更強大。 jdbcTemplate將自動確定您的映射值的sqlType,而SqlParamaterSource允許您明確使用您所選擇的sqlType。這可能是一個問題,取決於您的數據庫,索引和參數。

一個例子是帶有Oracle數據庫的Integers和Longs。 jdbc模板會將這些對象添加到您的查詢中,使用周圍的引號「'使它們在數據庫查詢中處於有效字符串。如果您的數據庫中有一個前導0的數字,它將不會被找到,因爲'0XXXX'不會匹配'XXXX'。如果您傳入正確的sqlType,jdbc模板將執行不帶引號的數字比較,所以XXXX將等於XXXX。

0

當我的佔位符值的數據類型不同,這(MapSqlParameterSource)真的幫了我:

String SQL = "UPDATE Employee SET joindate = :joinDate WHERE empid = :empid"; 

MapSqlParameterSource namedParameters = new MapSqlParameterSource(); 

    namedParameters.addValue("date", joinDate, Types.Date); 
    namedParameters.addValue("empid", empid, Types.Integer); 
    namedParameterJdbcTemplate.update(SQL, namedParameters); 
相關問題