2014-07-14 135 views
1

我是新來的春天,在上面的代碼我明白查詢,但我不明白爲什麼 「新的MapSqlParameterSource(」用戶名「,用戶名)」?爲什麼我們使用MapSqlParameterSource

public boolean exists(String username) {  
     return jdbc.queryForObject("select count(*) from users where username=:username", 
      new MapSqlParameterSource("username" ,username),Integer.class)>0;          } 

使用它的目的是什麼?

在此先感謝

+0

考慮我怎麼回答正確,你能標記檢查? –

回答

2

這是因爲一些開發商不喜歡使用「?」在一個SQL語句,因此Spring提供了同樣的做法,休眠/ JPA與怎麼做:參數,通過MapSqlParameterSource

我建議你做一個研究關於的RowMapper了。

0

如果你有代表數據的地圖 - 特別是來自非數據庫源(文件,LDAP查詢) - 您可以使用地圖爲您的數據的模型。用戶的

列表

List<Map<String, Object>> users = new ArrayList<Map<String, Object>>(25); 

實例映射條目 - 可能來自遍歷文件,或一些其他數據源:

Map<String, Object> user1 = new HashMap<String, Object>(); 
user1.put("cn", "user1"); 
user1.put("mail", "[email protected]"); 
Map<String, Object> user2 = new HashMap<String, Object>(); 
user2.put("cn", "user2"); 
user2.put("mail", "[email protected]"); 

現在NamedJdbcTemplate可以輕鬆地設置您的SQL綁定值 - 我發現它特別有用,當批處理大量的數據從非db數據庫的數據源,我將使用映射爲數據結構。

SqlParameterSource[] batch = new SqlParameterSource[nyssisUsers.size()]; 
users.eachWithIndex { ldapEntry, index -> 
    MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource(ldapEntry); 
    batch[index] = mapSqlParameterSource 
} 
namedParameterJdbcTemplate.batchUpdate(SAVE_USER_SQL, batch); 

總結: 使用地圖作爲數據結構來表示在文件中的線,另一個數據庫源,一次性ETL操作,從LDAP等的讀出......是非常有用的。由於Map已經有了鍵,所以想要在SQL模板中使用這些鍵是有意義的。對於上面的例子,這可以反過來是一個簡單的插入,合併或更新SQL語句或一個匿名的PL/SQL代碼塊。無論你需要什麼,你正在處理。

SAVE_USER_SQL可能是因爲參與爲:

private static final String SAVE_USER_SQL = ''' 
DECLARE 
    P_CN     VARCHAR2 (100); 
    P_MAIL     VARCHAR2 (75); 
    P_GIVENNAME   VARCHAR2 (255); 
    P_SN     VARCHAR2 (255); 
    P_TITLE    VARCHAR2 (75); 
    P_O     VARCHAR2 (75); 
BEGIN 
    P_CN := trim(lower(:cn)); 
    P_MAIL := trim(lower(:mail)); 
    P_GIVENNAME := initCap(:givenName); 
    P_SN := initCap(:sn); 
    P_TITLE := upperCase(:title); 
    P_O := upperCase(:o); 

    USERS_PKG.SAVE (P_CN, 
        P_MAIL, 
        P_GIVENNAME, 
        P_SN, 
        P_TITLE, 
        P_O); 
END; 
''' 
相關問題