mybatis practice_240531

Choi Suyeon·2024년 5월 31일

foreach

값을 반복하여 쿼리문을 만들 때
값은 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>

set

update시에 사용
동적으로 set이 설정된다.

  • 문법)
<update id="아이디" parameterType="..VO">
update 테이블명
<set>
	<if test="조건">
    변경할 컬럼명=#{이름} ,
    </if>
    <if test="조건">
    변경할 컬럼명=#{이름} , //<set>이 알아서 , 지워줌
    </if>
</set>
where 조건
</update>

MyBatis에서 Procedure호출

자주 사용될 쿼리문이나 업무로직을 미리 만들어두고, 필요한 곳에서 호출하여 사용하기 위해.

  • procedure 작성법
    create or replace procedure 프로시저명(매개변수 in 데이터형,,,매개변수명 out 데이터형,,,)
    is
    --변수선언, cursor선언, record선언, table.선언
    begin
    --업무로직 처리
    exception
    --예외처리 코드
    end;
    /

-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>

insert

존재하는 프로시저

create or replace procedure insert_employee(empno number, ename varchar2, job varchar2, sal number, cnt out number, errMsg out varchar2)
  • 값을 저장할 수 있는 VO생성
public class ProcVO(){
private int empno, sal, cnt;
private String ename, job, errMsg;
}
  • ,,,Mapper.xml
<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>
  • Handler 사용
    ss.selectOne("아이디", pVO);//insert할 값은 getter method에서 반환된 값으로 insert를 수행하고, out parameter의 값을 setter method가 호출되어 설정

0개의 댓글