본문 바로가기

Java & iBatis

java+ MyBatis 에서 procedure 호출하기.


2010/11/02 - [Java & iBatis] - Java / iBatis에서 프로시저 호출하기
2010/11/05 - [Java & iBatis] - iBatis에서 myBatis로 개요 및 변경점

이 포스트를 읽기전에 이전글을 안읽었다면 한번 둘러보고 오는편이 좋을 것같아서 링크를 먼저 걸고 시작한다.
iBatis 에서 프로시저 호출하기의 myBatis 버전이다.

myBatis 에서 paramterMap을 더이상 사용하지 말자고 했기 때문에.. 이전처럼 프로시저를 호출하는 것은 무리가 있다.

Procedure 관련 체크해야할 변경사항은.. 일단 parameterMap이 사라진것.. 그리고 <procedure > 가 사라지고 type 으로 판단하게 된것이다.

parameterMap이 사라지고 MyBatis에서는 inlineStatement를 사용하라고 이야기 하고있다.  이것은 #{var}안에 직접 파라미터를 넣어서 사용하는 방법이다. 이방법에 따라서 이전 소스를 myBatis 버전으로 컨버팅 해보자.



iBatis 소스

<parametermap id="blParam" class="map">
<parameter property="p_latitude" jdbctype="VARCHAR" javatype="java.lang.String" mode="IN">
<parameter property="p_longitude" jdbctype="VARCHAR" javatype="java.lang.String" mode="IN">
<parameter property="p_utmx" jdbctype="DECIMAL" javatype="long" mode="OUT">
<parameter property="p_utmy" jdbctype="DECIMAL" javatype="long" mode="OUT">
</parameter></parameter></parameter></parameter></parametermap>
<procedure id="bl_to_utm" parametermap="blParam">
{call PROC_BL_TO_UTM(?,?,?,?)}
</procedure>



<procedure > 태그를 사용해서 프로시저를 정의 하고 들어오는 변수는 parameterMap에 정의해놓았다.

java 소스
Map map = new HashMap();
map.put("p_latitude",vo.getX_latitude());
map.put("p_longitude", vo.getX_longitude());
sqlMapper.update("VocIphone.bl_to_utm", map );
					
System.out.println(map.get("p_utmx").toString());
System.out.println(map.get("p_utmy").toString());


자바쪽에서는 map에 IN 타입 변수를 담아서 쿼리를 실행시키고 map의 OUT 타입 변수에 엑세스 해서 값을 가져온다.



MyBatis 소스

	{call PROC_BL_TO_UTM(#{latitude,mode=IN,jdbcType=VARCHAR},#{longitude,mode=IN,jdbcType=VARCHAR},#{utmx,mode=OUT,jdbcType=DECIMAL},#{utmy,mode=OUT,jdbcType=DECIMAL})}


statementType을 "CALLABLE"로 설정해주면 procedure를 호출하게 된다.  parameterType 에는 클래스 파일을 지정해주고 직접 파라미터 부분에 들어올 타입에 대한 세팅을 하게 된다.

vo.ProcVO.java
public class ProcVO {
	
	private String latitude = "";
	private String longitude = "";
	private String utmx = "";
	private String utmy = "";
	... 이하 getter/setter


이건 그냥 데이터를 옮기기위한 빈즈 파일

실제호출 java
ProcVO proc = new ProcVO();
proc.setLatitude("37.539421");
proc.setLongitude("127.047852");

session.update("myBatis.mappers.UserMapper.testProc", proc);

System.out.println("utmx : "+proc.getUtmx()+" utmy : "+proc.getUtmy());


자바쪽에서는 기존처럼 넘겨주면 된다. map 대신 클래스파일에 데이터를 담아주기만 하면 된다.
결과 코드 역시 자바클래스에서 getter로 받아오면 완료.

parameterMap으로 되어있는 기존의 소스들이 많다면 일일이 클래스를 만들어줘야 하기에 마이그레이션에 애로사항이 좀 있을수 있겠지만. 어차피 관리 측면에서도 빈파일로 관리하는쪽이 좋기 때문에. 이번기회에 싹 정리 하는것이 미래를 위해서는 좀더 낫지 않을까 싶다.

이전에 iBatis 에서 테스트 할때 자바빈파일로 파라미터를 매핑하는경우.. 프로시저가 정상적인 호출이 안되서 map으로 작업했던 거였는데.. iBatis가 원래 그런건지;; 내가 잘못했던 것인지 모르겠다...
정확한 답을 아시는분이 있다면 코멘트로~~~