Как правильно вызывать хранимые процедуры с использованием современного (около 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
? Другими словами, зачем мне передавать csc
, когда Spring может просто выполнять con.prepareCall (sql)
внутри? В принципе, нельзя ли передать любой из них вместо них обоих?
Или есть способ вызова хранимых процедур (с использованием Spring JDBC Template) намного лучше, чем то, что я встречал до сих пор?
] Примечание: Вы можете найти много вопросов с похожим заголовком, но не такими, как этот.