用于调用存储过程的 Spring JDBC 模板

新手上路,请多包涵

使用现代(大约 2012 年)Spring JDBC 模板调用存储过程的正确方法是什么?

比如说,我有一个存储过程,它声明了 INOUT 参数,如下所示:

 mypkg.doSomething(
    id OUT int,
    name IN String,
    date IN Date
)

我遇到过基于 CallableStatementCreator 的方法,我们必须显式注册 INOUT 参数。考虑 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 模板)?

注意: 您可能会发现许多题目看似相似但与本题不同的题目。

原文由 adarshr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 753
2 个回答

在 Spring 中有多种调用存储过程的方法。

如果你使用 CallableStatementCreator 声明参数,你将使用 Java 的标准接口 CallableStatement ,即注册出参数并单独设置。使用 SqlParameter 抽象将使您的代码更清晰。

我建议您查看 SimpleJdbcCall 。它可以这样使用:

 SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
    .withSchemaName(schema)
    .withCatalogName(package)
    .withProcedureName(procedure)();
...
jdbcCall.addDeclaredParameter(new SqlParameter(paramName, OracleTypes.NUMBER));
...
jdbcCall.execute(callParams);

对于简单的程序,您可以使用 jdbcTemplateupdate 方法:

 jdbcTemplate.update("call SOME_PROC (?, ?)", param1, param2);

原文由 Infeligo 发布,翻译遵循 CC BY-SA 3.0 许可协议

以下是从java调用存储过程的方法

1. 使用 CallableStatement:

  connection = jdbcTemplate.getDataSource().getConnection();
  CallableStatement callableStatement = connection.prepareCall("{call STORED_PROCEDURE_NAME(?, ?, ?)}");
  callableStatement.setString(1, "FirstName");
  callableStatement.setString(2, " LastName");
  callableStatement.registerOutParameter(3, Types.VARCHAR);
  callableStatement.executeUpdate();

这里我们在外部管理资源关闭

2. 使用 CallableStatementCreator

  List paramList = new ArrayList();
    paramList.add(new SqlParameter(Types.VARCHAR));
    paramList.add(new SqlParameter(Types.VARCHAR));
    paramList.add(new SqlOutParameter("msg", Types.VARCHAR));

    Map<String, Object> resultMap = jdbcTemplate.call(new CallableStatementCreator() {

    @Override
    public CallableStatement createCallableStatement(Connection connection)
    throws SQLException {

    CallableStatement callableStatement = connection.prepareCall("{call STORED_PROCEDURE_NAME(?, ?, ?)}");
    callableStatement.setString(1, "FirstName");
            callableStatement.setString(2, " LastName");
            callableStatement.registerOutParameter(3, Types.VARCHAR);
    return callableStatement;

    }
    }, paramList);

3.使用SimpleJdbcCall:

 SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)

.withProcedureName("STORED_PROCEDURE_NAME");

Map<String, Object> inParamMap = new HashMap<String, Object>();
inParamMap.put("firstName", "FirstNameValue");
inParamMap.put("lastName", "LastNameValue");
SqlParameterSource in = new MapSqlParameterSource(inParamMap);

Map<String, Object> simpleJdbcCallResult = simpleJdbcCall.execute(in);
System.out.println(simpleJdbcCallResult);

4.使用org.springframework.jdbc.object的StoredProcedure类

The Code:
First Create subclass of StoredProcedure: MyStoredProcedure

class MyStoredProcedure extends StoredProcedure {

public MyStoredProcedure(JdbcTemplate jdbcTemplate, String name) {

super(jdbcTemplate, name);
setFunction(false);

}

}

Use MyStoredProcedure to call database stored procedure:

//Pass jdbcTemlate and name of the stored Procedure.
MyStoredProcedure myStoredProcedure = new MyStoredProcedure(jdbcTemplate, "PROC_TEST");

//Sql parameter mapping
SqlParameter fNameParam = new SqlParameter("fName", Types.VARCHAR);
SqlParameter lNameParam = new SqlParameter("lName", Types.VARCHAR);
SqlOutParameter msgParam = new SqlOutParameter("msg", Types.VARCHAR);
SqlParameter[] paramArray = {fNameParam, lNameParam, msgParam};

myStoredProcedure.setParameters(paramArray);
myStoredProcedure.compile();

//Call stored procedure
Map storedProcResult = myStoredProcedure.execute("FirstNameValue", " LastNameValue");

参考

原文由 0190198 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题