为什么我们使用MapSqlParameterSource

时间:2014-07-14 17:17:01

标签: spring spring-jdbc

我是春天世界的新手,在上面的代码我理解查询,但我不明白为什么 "新的MapSqlParameterSource("用户名",用户名)"是用吗?

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

使用它的目的是什么?

提前致谢

2 个答案:

答案 0 :(得分:3)

这是因为有些开发人员不喜欢使用“?”在一个sql语句中,因此Spring提供了相同的方法,Hibernate / JPA如何使用:参数,通过 MapSqlParameterSource

我建议您对 RowMapper 进行研究。

答案 1 :(得分:2)

如果您有一个代表数据的地图 - 特别是来自非数据库来源(文件,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", "user1@example.com");
Map<String, Object> user2 = new HashMap<String, Object>();
user2.put("cn", "user2");
user2.put("mail", "user2@example.com");

现在NamedJdbcTemplate可以轻松设置你的sql绑定值 - 我发现当从我使用Map的非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);

要点: 使用Map作为数据结构来表示文件中的行,另一个数据库源,一次性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;
'''