何时在namedParameterJdbcTemplate中使用Map和SqlParameterSource?

时间:2017-03-01 05:29:25

标签: spring-jdbc

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

2 个答案:

答案 0 :(得分:5)

使用Map对于简单的情况很好,但在Map上使用SqlParamaterSource有两个好处。

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

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

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

答案 1 :(得分:1)

当我的占位符值具有不同的数据类型时,这个(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);