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