【发布时间】:2012-03-10 19:37:32
【问题描述】:
使用现代(大约 2012 年)Spring JDBC 模板调用存储过程的正确方法是什么?
比如说,我有一个存储过程,它同时声明了IN 和OUT 参数,如下所示:
mypkg.doSomething(
id OUT int,
name IN String,
date IN Date
)
我遇到过基于CallableStatementCreator 的方法,我们必须显式注册IN 和OUT 参数。考虑JdbcTemplate 类中的以下方法:
public Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters)
当然,我知道我可以这样使用它:
List<SqlParameter> declaredParameters = new ArrayList<SqlParameter>();
declaredParameters.add(new SqlOutParameter("id", Types.INTEGER));
declaredParameters.add(new SqlParameter("name", Types.VARCHAR));
declaredParameters.add(new SqlParameter("date", Types.DATE));
this.jdbcTemplate.call(new CallableStatementCreator() {
@Override
CallableStatement createCallableStatement(Connection con) throws SQLException {
CallableStatement stmnt = con.createCall("{mypkg.doSomething(?, ?, ?)}");
stmnt.registerOutParameter("id", Types.INTEGER);
stmnt.setString("name", "<name>");
stmnt.setDate("date", <date>);
return stmnt;
}
}, declaredParameters);
当我已经在我的csc 实现中注册它们时,declaredParameters 的目的是什么?换句话说,当spring可以简单地在内部执行con.prepareCall(sql)时,为什么我需要传入csc?基本上,我不能传入其中一个而不是两个吗?
或者,有没有比我目前遇到的更好的方法来调用存储过程(使用 Spring JDBC 模板)?
注意:您可能会发现许多题目看似相似但与本题不同的题目。
【问题讨论】:
-
我可以看到这个问题现在很流行,距离被问到这个问题已经2年多了。如果有人认为在 Spring 4 结束后有更好的方法来调用存储过程,请发布答案或提出修改建议。
标签: java spring spring-jdbc jdbctemplate