我是春天世界的新手,在上面的代码我理解查询,但我不明白为什么 "新的MapSqlParameterSource("用户名",用户名)"是用吗?
public boolean exists(String username) {
return jdbc.queryForObject("select count(*) from users where username=:username",
new MapSqlParameterSource("username" ,username),Integer.class)>0; }
使用它的目的是什么?
提前致谢
答案 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;
'''