차근차근/Spring

mybatis Oracle Procedure 호출하기

예쁜꽃이피었으면 2021. 12. 13. 10:05

ibatis에서는 <procedure>라는 태그가 있었는데 mybatis에는 없다고 한다.

하지만 update, insert, select 아무 태그에서나 프로시저를 호출할 수 있다.

 

프로시저 선언

CREATE OR REPLACE PROCEDURE PROCEDURE_NAME
(
    c_resurt OUT P_OUT_CURSOR.CURSORTYPE,
    v_year  in   varchar2,
    v_term  in   varchar2,
    v_no    in   varchar2
)
AS ...


출처: https://stove99.tistory.com/78 [스토브 훌로구]

 

프로시저 호출

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="test">
    <resultMap id="test" type="hashmap"></resultMap>
     
    <select id="test" statementType="CALLABLE">
        {
            CALL PROCEDURE_NAME(
                #{result, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=test},
                #{year},
                #{term},
                #{no}
            )
        }
    </select>
</mapper>


출처: https://stove99.tistory.com/78 [스토브 훌로구]

필수

1. resultMap을 hashmap 타입으로 하나 선언해 줘야 한다.(id는 다른 xml파일에 있는 resultMap id와 중복되면 안된다.)

2. select 엘리먼트의 statementType을 CALLBLE로 설정해줘야 함.

3. 프로시저 파라미터 중 IN타입은 잡다구리한 것을 설정할 필요가 없지만 , OUT타입은 위와같이 선언해주고 resultMap에는 위에서 설정한 resultMap의 id를 적어줘야 한다.

* DaoImpl에서 호출할 때 보통 쿼리인 경우는 selectOne()메소드의 호출결과로 쿼리결과를 리턴받지만 프로시저에서 OUT타입 변수로 결과를 리턴할 경우 selectOne()의 결과로 아무것도 리턴되지 않는다. 대신 호출할 때 넘겨준 파라메터에 결과를 담아서 넘겨준다.

그래서 리스트로 결과를 받기위해서 굳이 selectList로 호출을 안해도 되고 그냥 selectOne만 쓰면된다.

쿼리 결과가 list인 경우 result에 ArrayList안에 HashMap들이 들어가 있는 형태로 결과를 넣어준다. 

 

 

 

이런 코드를 처음봤다... 굉장히 오래전 부터 사용하던 방식같은데

statementType="CALLABLE"  로 지정하면
프로시저에서 out로 지정한 값들이 test를 요청할때 사용한 파라미터 map에 담긴다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="test">
    <resultMap id="test" type="hashmap"></resultMap>
     <!-- 입력은 대소문자 구문 -->
     <!-- '{'과 call사이 탭 허용 안함. 띄어쓰기는 가능 -->
    <select id="test" statementType="CALLABLE">
        {
            CALL PROCEDURE_NAME(
                #{result, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=test},
                #{year},
                #{term},
                #{no}
            )
        }
    </select>
</mapper>

 


https://mybatis.org/mybatis-3/ko/sqlmap-xml.html

statementType
STATEMENT, PREPARED 또는 CALLABLE 중 하나를 선택할 수 있다. 
마이바티스에게 Statement, PreparedStatement 또는 CallableStatement를 사용하게 한다. 
디폴트는 PREPARED이다.


mode
IN,OUT,INOUT파라미터를 명시하기 위해 사용한다.
파라미터가 OUT / INIOUT이라면 파라미터의 실제 값은 변경될 것이다.
mode=OUT(또는 INOUT)이고, jdbcType=CURSOR라면 파라미터의 타입에 ResultSet를 매핑하기 위해 resultMap을 명시해야 한다.




jdbcType
지원되는 타입 목록에서 설명하는 JDBC 타입. 
JDBC타입은 insert, update 또는 delete 하는 null 입력이 가능한 칼럼에서만 필요하다. 
JDBC의 요구사항이지 마이바티스의 요구사항이 아니다. 
JDBC로 직접 코딩을 하다보면 null이 가능한 값에 이 타입을 지정할 필요가 있을 것이다.

지원되는 JDBC 타입

상세한 설명전에 마이바티스는 jdbcType열거를 통해 다음의 JDBC 타입들을 지원한다.

BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED
TINYINT REAL VARCHAR BINARY BLOB NVARCHAR
SMALLINT DOUBLE LONGVARCHAR VARBINARY CLOB NCHAR
INTEGER NUMERIC DATE LONGVARBINARY BOOLEAN NCLOB
BIGINT DECIMAL TIME NULL CURSOR ARRAY


[참조]

https://mybatis.org/mybatis-3/ko/sqlmap-xml.html   

 

MyBatis – 마이바티스 3 | 매퍼 XML 파일

Mapper XML 파일 마이바티스의 가장 큰 장점은 매핑구문이다. 이건 간혹 마법을 부리는 것처럼 보일 수 있다. SQL Map XML 파일은 상대적으로 간단하다. 더군다나 동일한 기능의 JDBC 코드와 비교하면

mybatis.org

https://offbyone.tistory.com/42

 

MyBatis에서 Oracle Procedure 및 Anonymous Block 실행하기

스프링 프레임워크, MyBatis, Oracle 환경에서 Oracle 의 저장 프로시저(Stored Procedure)를 호출하는 방법을 알아보겠습니다. 또한, PL/SQL 익명 블럭(Anonymous Block)을 호출 하는 예제도 보겠습니다. 익명 블..

offbyone.tistory.com

https://stove99.tistory.com/78

 

mybatis Oracle Procedure 호출하기

개인적으로 getter, setter 클래스를 만드는걸 싫어함으로 그냥 map, list 로 결과를 받는 예제를 맹글어 보겠다. 대충 요렇게 선언된 PROCEDURE_NAME 이라는 프로시져가 있다고 가정하면~ CREATE OR REPLACE PROC

stove99.tistory.com

https://developer-java.tistory.com/20

 

[오라클 프로시져(Stored Procedure)]

//***************************************** -- 프로시져(Stored Procedure)  - PL/SQL에서 가장 대표적인 구조인 스토어드 프로시져는 개발자가 자주 실행해야 하는 업무 흐름(sql)을 미리 작성하여 데이터베..

developer-java.tistory.com

 

 

 

 

반응형

'차근차근 > Spring' 카테고리의 다른 글

spring return "redirect:/주소"와 return "view이름" 차이  (0) 2021.12.16
스프링 파일 경로  (0) 2021.12.15
Annotation  (0) 2021.12.09
2.용어정리(6)-SPA  (0) 2021.12.09
2.용어정리(5)-싱글톤패턴  (0) 2021.12.09