저장 프로 시저 호출을위한 Spring JDBC 템플릿
현대 (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);
구현 declaredParameters
에 이미 등록한 목적은 무엇입니까 csc
? 즉, csc
봄이 단순히 con.prepareCall(sql)
내부적으로 할 수있을 때 왜 통과해야 합니까? 기본적으로 둘 다 대신 둘 중 하나를 통과 할 수 없습니까?
아니면 지금까지 본 것보다 저장 프로 시저 (Spring JDBC 템플릿 사용)를 호출하는 더 좋은 방법이 있습니까?
참고 : 제목이 비슷한 것처럼 보이지만이 질문과 동일하지 않은 질문을 많이 찾을 수 있습니다.
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);
간단한 절차를 위해 jdbcTemplate
의 update
방법을 사용할 수 있습니다 .
jdbcTemplate.update("call SOME_PROC (?, ?)", param1, param2);
다음은 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");
일반적으로 StoredProcedure
저장 프로 시저를 실행 하기 위해 Spring 기반 클래스 를 확장하는 것을 선호 합니다.
클래스 생성자를 만들고
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(); }
저장 프로 시저 호출의 실행 방법을 아래와 같이 재정의합니다.
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; }
도움이 되었기를 바랍니다.
저장 프로 시저를 호출하는 또 다른 방법은 다음과 같습니다.
sql="execute Procedure_Name ?";
Object search[]={Id};
List<ClientInvestigateDTO> client=jdbcTemplateObject.query(sql,search,new
ClientInvestigateMapper());
이 예에서 'ClientInvestigateDTO'는 POJO 클래스이고 'ClientInvestigateMapper'는 매퍼 클래스입니다. 'client'는 저장 프로 시저 호출시 얻은 모든 결과를 저장합니다.
참고 URL : https://stackoverflow.com/questions/9361538/spring-jdbc-template-for-calling-stored-procedures
'Nice programing' 카테고리의 다른 글
JSONResult를 문자열로 (0) | 2020.11.04 |
---|---|
Node.js 및 Microsoft SQL Server (0) | 2020.11.04 |
C ++에서 인터페이스를 구현하는 방법? (0) | 2020.11.04 |
중첩 된 객체를 사용할 때 AngularJS에서 재귀 템플릿을 어떻게 만들 수 있습니까? (0) | 2020.11.04 |
내 PowerShell 종료 코드가 항상 "0"인 이유는 무엇입니까? (0) | 2020.11.04 |