spring-jdbc – 何时在namedParameterJdbcTemplate中使用Map和SqlParameterSource?

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,这使得执行更快?请清楚解释一下.提前致谢.

最佳答案
对于简单的情况,使用Map很好,但在Map上使用SqlParamaterSource有两个好处.

第一个是简单的构建器模式,允许您添加多个内联值(namedParameters.addValue().addValue().addValue()etc).

第二个更强大. jdbcTemplate将自动确定地图值的sqlType,而SqlParamaterSource允许您显式使用您选择的sqlType.这可能是一个问题,具体取决于您的数据库,索引和参数.

一个例子是带有Oracle数据库的Integers和Longs. jdbc模板将这些对象添加到您的查询中,并使用周围的引号”使它们成为数据库查询中的有效字符串.如果您的数据库中有一个前导0的数字,则无法找到它,因为’0XXXX’与’XXXX’不匹配.如果传入正确的sqlType,jdbc模板将进行不带引号的数字比较,因此XXXX将等于XXXX.

转载注明原文:spring-jdbc – 何时在namedParameterJdbcTemplate中使用Map和SqlParameterSource? - 代码日志