복붙노트

[SPRING] 저장 프로 시저를 호출하기위한 Spring JDBC 템플릿

SPRING

저장 프로 시저를 호출하기위한 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 구현에 등록 할 때 declaredParameters의 목적은 무엇입니까? 다시 말해, 봄이 단순히 내부에서 con.prepareCall (sql)을 수행 할 수있을 때 왜 나는 csc를 전달해야합니까? 기본적으로, 둘 중 하나 대신 둘 중 하나를 통과시킬 수 있습니까?

아니면, 지금까지 접했던 것보다 (Spring JDBC Template을 사용하여) 저장 프로 시저를 호출하는 더 좋은 방법이 있습니까?

참고 : 유사한 제목을 가지고있는 것처럼 보일 수 있지만이 질문과 다른 질문은 많이있을 수 있습니다.

해결법

  1. ==============================

    1.Spring에서 저장 프로 시저를 호출하는 방법에는 여러 가지가 있습니다.

    Spring에서 저장 프로 시저를 호출하는 방법에는 여러 가지가 있습니다.

    CallableStatementCreator를 사용하여 매개 변수를 선언하면 CallableStatement의 Java 표준 인터페이스를 사용합니다. 즉, 매개 변수를 등록하고 별도로 설정합니다. 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);
    
  2. ==============================

    2.java에서 저장 프로 시저를 호출하는 방법은 다음과 같습니다.

    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. StoredProcedure 클래스의 org.springframework.jdbc.object를 사용하십시오.

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

    참고

  3. ==============================

    3.나는 일반적으로 저장 프로 시저를 실행하기 위해 Spring 기반 StoredProcedure 클래스를 확장하는 것을 선호한다.

    나는 일반적으로 저장 프로 시저를 실행하기 위해 Spring 기반 StoredProcedure 클래스를 확장하는 것을 선호한다.

    희망이 당신을 도와줍니다.

  4. ==============================

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

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

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

    이 예제에서 'ClientInvestigateDTO'는 POJO 클래스이고 'ClientInvestigateMapper'는 매퍼 클래스입니다. '클라이언트'는 저장 프로 시저를 호출 할 때 얻은 모든 결과를 저장합니다.

  5. from https://stackoverflow.com/questions/9361538/spring-jdbc-template-for-calling-stored-procedures by cc-by-sa and MIT license