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
https://offbyone.tistory.com/42
https://stove99.tistory.com/78
https://developer-java.tistory.com/20
'차근차근 > 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 |