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

使用现代date调用存储过程的正确方法是什么(大约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); 

declaredParameters的目的是什么,当我已经注册到我的csc实现? 换句话说,为什么我需要传递一个csc时,Spring可以简单地在内部执行con.prepareCall(sql) ? 基本上,我不能通过他们中的任何一个,而不是他们两个?

或者,是否有更好的方法来调用存储过程(使用Spring JDBC模板)比我到目前为止所遇到的?

注:您可能会发现许多似乎有相似标题的问题,但与这一问题不一样。

在Spring中有很多方法可以调用存储过程。

如果使用CallableStatementCreator声明参数,则将使用Java的CallableStatement标准接口,即注册参数并分别设置它们。 使用SqlParameter抽象将使您的代码更清洁。

我build议你看看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); 

我通常更喜欢扩展基于Spring的StoredProcedure类来执行存储过程。

  1. 您需要创build您的类构造函数,并需要调用StoredProcedure类构造函数。 这个超类构造函数接受DataSource和过程名称。

    示例代码:

     public class ProcedureExecutor extends StoredProcedure { public ProcedureExecutor(DataSource ds, String funcNameorSPName) { super(ds, funcNameorSPName); declareParameter(new SqlOutParameter("v_Return", Types.VARCHAR, null, new SqlReturnType() { public Object getTypeValue(CallableStatement cs, int paramIndex, int sqlType, String typeName) throws SQLException { final String str = cs.getString(paramIndex); return str; } })); declareParameter(new SqlParameter("your parameter", Types.VARCHAR)); //set below param true if you want to call database function setFunction(true); compile(); } 
  2. 重写存储过程调用的执行方法如下

     public Map<String, Object> execute(String someParams) { final Map<String, Object> inParams = new HashMap<String, Object>(8); inParams.put("my param", "some value"); Map outMap = execute(inParams); System.out.println("outMap:" + outMap); return outMap; } 

希望这可以帮助你。

这里是从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(); 

在这里,我们在外部pipe理资源closures

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"); 

参考

另一种调用存储过程的方法是:

 sql="execute Procedure_Name ?"; Object search[]={Id}; List<ClientInvestigateDTO> client=jdbcTemplateObject.query(sql,search,new ClientInvestigateMapper()); 

在这个例子中,“ClientInvestigateDTO”是POJO类,“ClientInvestigateMapper”是映射器类。“客户端”存储调用存储过程的所有结果。