ada*_*shr 70 java spring spring-jdbc jdbctemplate
使用现代(大约2012年)Spring JDBC模板调用存储过程的正确方法是什么?
说,我有一个存储过程声明了两个IN
和OUT
参数,如下所示:
mypkg.doSomething(
id OUT int,
name IN String,
date IN Date
)
Run Code Online (Sandbox Code Playgroud)
我遇到过CallableStatementCreator
必须明确注册IN
和OUT
参数的基础方法.在JdbcTemplate
课堂上考虑以下方法:
public Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters)
Run Code Online (Sandbox Code Playgroud)
当然,我知道我可以像这样使用它:
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);
Run Code Online (Sandbox Code Playgroud)
declaredParameters
当我在csc
实施中注册时,目的是什么?换句话说,为什么我需要传递一个csc
当春天可以简单地在con.prepareCall(sql)
内部做什么?基本上,我不能通过他们中的任何一个而不是他们两个?
或者,有没有比我迄今为止遇到的更好的方法来调用存储过程(使用Spring JDBC Template)?
注意:您可能会发现许多看似具有相似标题的问题,但它们与此问题不同.
Inf*_*igo 86
有许多方法可以在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);
Run Code Online (Sandbox Code Playgroud)
对于简单的程序,您可以使用jdbcTemplate
的update
方法:
jdbcTemplate.update("call SOME_PROC (?, ?)", param1, param2);
Run Code Online (Sandbox Code Playgroud)
Sai*_*ala 29
以下是从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();
Run Code Online (Sandbox Code Playgroud)
在这里,我们从外部管理资源关闭
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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
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");
Run Code Online (Sandbox Code Playgroud)
小智 18
我通常更喜欢扩展基于Spring的StoredProcedure
类来执行存储过程.
您需要创建类构造函数,并需要在其中调用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();
}
Run Code Online (Sandbox Code Playgroud)覆盖存储过程调用的执行方法如下
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;
}
Run Code Online (Sandbox Code Playgroud)希望这对你有所帮助.
归档时间: |
|
查看次数: |
204254 次 |
最近记录: |