myBatis 에서 paramterMap을 더이상 사용하지 말자고 했기 때문에.. 이전처럼 프로시저를 호출하는 것은 무리가 있다.
Procedure 관련 체크해야할 변경사항은.. 일단 parameterMap이 사라진것.. 그리고 <procedure > 가 사라지고 type 으로 판단하게 된것이다.
parameterMap이 사라지고 MyBatis에서는 inlineStatement를 사용하라고 이야기 하고있다. 이것은 #{var}안에 직접 파라미터를 넣어서 사용하는 방법이다. 이방법에 따라서 이전 소스를 myBatis 버전으로 컨버팅 해보자.
iBatis 소스
<PARAMETERMAP id=blParam class=map>
<PARAMETER mode="IN" javaType="java.lang.String" jdbcType="VARCHAR" property="p_latitude" />
<PARAMETER mode="IN" javaType="java.lang.String" jdbcType="VARCHAR" property="p_longitude" />
<PARAMETER mode="OUT" javaType="long" jdbcType="DECIMAL" property="p_utmx" />
<PARAMETER mode="OUT" javaType="long" jdbcType="DECIMAL" property="p_utmy" />
</PARAMETERMAP>
<PROCEDURE id=bl_to_utm parameterMap="blParam">
{call PROC_BL_TO_UTM(?,?,?,?)}
</PROCEDURE>
<procedure > 태그를 사용해서 프로시저를 정의 하고 들어오는 변수는 parameterMap에 정의해놓았다.
java 소스
Map<STRING, Object> map = new HashMap<STRING,OBJECT>();
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 소스
<UPDATE id=testProc parameterType="vo.ProcVO" statementType="CALLABLE">
{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})}
</UPDATE>
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);