값을 반복하여 쿼리문을 만들 때
값은 java.util.List 또는 배열에 들어가 MAP을 통해서 MyBatis로 전달된다.
<foreach collection="map key" index="인덱스" open="시작기호" item="변수명" separator="구분자" close="닫힘기호">
#{ 변수명 }
</foreach>
동작
open 속성의 값이 한번 출력되고, item속성의 값과 separator속성값이 반복출력되고, close속성의 값이 마지막에 한번 출력된다.
예)
입력된 부서번호(하나)<숫자>와 직무(여러 개)<문자열>에 해당하는 사원을 조회
1. Map생성
Map<String, Object> map = new HashMap<String, Object>();
//어떤 타입이든 다 받고 싶으면 Object으로 받기
List<String> list = new ArrayList<String>();
list.add('SALESMAN');
list.add('MANAGER');
list.add('CLERK');
map.put("deptno", 10); //map.put("list", Integer.parseInt(request.getParameterValues("deptno")));
map.put("list", list); //map.put("list", request.getParameterValues("job"));
2. Handler에서 Mybatis Framework으로 map 전달
List<EmpDomain>list = SqlSession.selectList("아이디", map);
3. Mybatis Framework이 아이디에 해당하는 node을 찾아서 parsing 수행.
<select id="아이디" resultType="EmpDomain" parameterType="java.util.HashMap">
select 컬럼명
from 테이블명
where deptno = #{ deptno } <=위의 map.put("deptno", 10); 맵의 키("deptno")
and job in <foreach collection="list" <= 위의 map.put("list", list); 입력된 맵의 키("list")
open="(" item="job" separator="," close=")" index="i">
#{ job }
</foreach>
</select>
update시에 사용
동적으로 set이 설정된다.
<update id="아이디" parameterType="..VO">
update 테이블명
<set>
<if test="조건">
변경할 컬럼명=#{이름} ,
</if>
<if test="조건">
변경할 컬럼명=#{이름} , //<set>이 알아서 , 지워줌
</if>
</set>
where 조건
</update>
자주 사용될 쿼리문이나 업무로직을 미리 만들어두고, 필요한 곳에서 호출하여 사용하기 위해.
-MyBatis에서 procedure를 호출할 때 select만을 사용한다.
-statementType속성을 "CALLABLE"로 설정한다.
<select id="아이디" parameterType="VO" statementType="CALLABLE">
{ call 프로시저명 ( #{ getter명, mode=파라미터의 종류, jdbcType=java.sql.Types의 데이터형})}
//getter method가 int를 반환하면 NUMERIC
//getter method가 String를 반환하면 VARCHAR
</select>
존재하는 프로시저
create or replace procedure insert_employee(empno number, ename varchar2, job varchar2, sal number, cnt out number, errMsg out varchar2)
public class ProcVO(){
private int empno, sal, cnt;
private String ename, job, errMsg;
}
<select id="아이디" parameterType="ProcVO" statementType="CALLABLE">
{
call insert_employee(
#{ empno, mode=IN, jdbcType=NUMERIC },
#{ ename, mode=IN, jdbcType=VARCHAR },
#{ job, mode=IN, jdbcType=VARCHAR },
#{ sal, mode=IN, jdbcType=NUMERIC },
//IN parameter : getter method 사용
#{ cnt, mode=OUT, jdbcType=NUMERIC },
#{ errMsg, mode=OUT, jdbcType=VARCHAR }
//OUT parameter : setter method 사용
)
}
</select>