什么时候在namedParameterJdbcTemplate中使用Map和SqlParameterSource?
When to use Map and SqlParameterSource in namedParameterJdbcTemplate?
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 很好,但是使用 SqlParamaterSource 而不是 Map 有两个好处。
首先是简单的构建器模式,允许您内联添加多个值(namedParameters.addValue().addValue().addValue() 等)。
第二种更厉害。 jdbc模板将自动确定地图值的 sqlType,而 SqlParamaterSource 允许您明确使用您选择的 sqlType。这可能是一个问题,具体取决于您的数据库、索引和参数。
一个例子是 Oracle 数据库的整数和长整数。 jdbc 模板会将这些对象添加到您的查询中,并使用引号 '' 使它们成为数据库查询中的有效字符串。如果您的数据库中有一个以 0 开头的数字,它将找不到,因为“0XXXX”将不匹配 'XXXX'。如果您传入正确的 sqlType,jdbc 模板将进行不带引号的数字比较,因此 XXXX 将等于 XXXX。
当我的占位符值具有不同的数据类型时,这个 (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);
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 很好,但是使用 SqlParamaterSource 而不是 Map 有两个好处。
首先是简单的构建器模式,允许您内联添加多个值(namedParameters.addValue().addValue().addValue() 等)。
第二种更厉害。 jdbc模板将自动确定地图值的 sqlType,而 SqlParamaterSource 允许您明确使用您选择的 sqlType。这可能是一个问题,具体取决于您的数据库、索引和参数。
一个例子是 Oracle 数据库的整数和长整数。 jdbc 模板会将这些对象添加到您的查询中,并使用引号 '' 使它们成为数据库查询中的有效字符串。如果您的数据库中有一个以 0 开头的数字,它将找不到,因为“0XXXX”将不匹配 'XXXX'。如果您传入正确的 sqlType,jdbc 模板将进行不带引号的数字比较,因此 XXXX 将等于 XXXX。
当我的占位符值具有不同的数据类型时,这个 (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);