Nice programing

저장 프로 시저 호출을위한 Spring JDBC 템플릿

nicepro 2020. 11. 4. 08:25
반응형

저장 프로 시저 호출을위한 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);

구현 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);

간단한 절차를 위해 jdbcTemplateupdate방법을 사용할 수 있습니다 .

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 기반 클래스 를 확장하는 것을 선호 합니다.

  1. 클래스 생성자를 만들고 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;
             }
    

도움이 되었기를 바랍니다.


저장 프로 시저를 호출하는 또 다른 방법은 다음과 같습니다.

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

반응형