개발자 끄적끄적

동적 SQL 본문

Mybatis

동적 SQL

햏치 2023. 3. 4. 15:00

<parameterType>
- <select/> 실행시 외부에서 전달되는 데이터 타입을 의미
- 기본형, 객체형을 가질 수 있다
- 사용자 정의 객체인 경우,
  패키지명과 함게 클래스명을 기술하면 된다


[기본형]
<select id='getPwd' resultType='String' parameterType='String'>
 select pwd from member where mid=#{mid}
</select>
String pwd = sqlSession.selectOne("board.getPwd", "hong");

[객체형]
<select id='getPwd' resultType='String' parameterType='board.BoardVo'>
 select subject from member where worker=#{worker} and pwd = #{pwd}
</select>
BoardVo vo = ...
String pwd = sqlSession.selectOne("board.getPwd", vo);






<insert>
- 데이터를 Database에 입력할 때 사용되는 요소
- parameterType은 대부분 자바 VO객체형
- 반환값은 insert된 결과행값을 갖는다
- sqlSession을 다 사용한 뒤 반드시 commit해 주어야 한다

[기본구조]
<insert id='id' parameterType='type' />






<update>
- 데이터를 수정하기 위한 요소

[기본구조]
<update id='id' parameterType='type' />






<delete>
- 데이터를 삭제하기 위한 요소

[기본구조]
<delete id='id' parameterType='type' />






<동적SQL>
- sqlMap에서 상황에 따른 보다 동적인 sql문장을 만들기 위해 사용되는 명령어들

[대표적인 종류]
• if
• choose
• where
• set
• trim
• foreach




<if>
- sql문장 작성시 조건을 명시

[기본구조]
<if test="조건">
 조건이 참인경우
</if>




<choose>
- switch문이나 다중 if문과 그 기능이 유사

[기본구조]
<choose>
 <when test='조건1'>
 실행문1
 </when>
 <when test='조건2'>
 실행문2
 </when>
 ...
 <otherwise>
 만족하는 조건이 없는 경우
 </otherwise>
</choose>






<where>
- where절을 보다 동적으로 만들어 주는 요소

<where 특징>
• <where/>안에서 만족하는 조건이 없다면 where절을 생략
• 만약 <where/>안에서 sql 문장이 and나 or로시작되면 and나 or를 제거

[기본구조]
<where>
...
</where>






<set>
- update절의 set절을 동적으로 만들어 주는 요소

<set 특징>
• <set/>안에 요소가 존재할 경우만 set절을 만들어 준다.
• 불필요한 ','를 삭제해 준다.

[기본구조]
<set>
...
</set>





<trim>
- <where/>나 <set/> 요소보다 다양하게 특정요소를 추가하거나
   제거할 수 있는 요소

[기본구조]
<trim prefix = '앞에 붙일단어' suffixOverrides='제거단어| 제거단어' prefixOverrides='제거단어 | 
제거단어'>
 ...
</trim>
• prefix : where, set과 같이 기술된 내용을 추가
• suffixOverrides : 뒤에 붙은 ',' 와 같이 불필요한 내용을 제거
• prefixOverrides : 앞에 붙은 or, and 와 같은 불필요한 내용을 제거





<foreach>
- 배열이나 Collection구조의 데이터가 parameterType으로 전달되었을 때,
  이를 순회하여 항목을 하나씩 가져올 수 있는 기능
- mytatis가 보여주는 가장 강력한 기능중 하나이다

[기본구조]
<foreach collection='collection' item='item' index='index' open='open' close='close' separator='separator' />
• collection : 자바의 List나 Map 또는 배열 구조의 요소
• item : collection에 정의된 요소를 하나씩 대입 받는 변수. map구조인 경우 value값.
• index : 대입 받은 색인값. map구조인 경우 key값
• open : 반복처리를 시작하기전 추가될 처음 문자열
• close : 반복처리를 마치고 추가될 마지막 문자열
• separator : 반복처리시 item 사이에 끼워질 구분 문자열






ex) 배열 또는 List구조인 경우
<select id='foreach_list' parameterType='bean.DynamicVo' resultMap = 'dynamicMap'>
select * from board
<where>
<if test='worker != null'>
worker in 
<foreach collection='workerList' item='data' index='index'
 open="(" close=")" separator=",">
#{data}
</foreach>
</if>
</where>
</select>

---Java Code---
SqlSession s = BoardFactory.getFactory().openSession();
DynamicVo vo = new DynamicVo();
List<String> workerList = new ArrayList<String>();
workerList.add("manager");
workerList.add("guest");
vo.setWorkerList(workerList);
List<DynamicVo> v = s.selectList("dynamic.foreach_list", vo);

- 만들어진 sql : select * from board where worker in ('manager', 'guest') 







ex) 파라메터 자체가 Map구조인 경우
<select id='foreach_map' parameterType='Map' resultMap='dynamicMap'>
select * from board
<where>
<if test='worker != null'>
worker = #{worker}
</if>
<if test='month != null'>
and to_char(mdate, 'mm') = #{month}
</if>
</where>
</select>

---Java Code---
Map<String, Object> map = new HashMap<String, Object>();
map.put("month", “01”);
map.put("worker", “hong”);
List<DynamicVo> v = s.selectList("dynamic.foreach_map", map);

- #{worker}, #{month}가 Map의 Key값이되고 해당 Value값을 가져온다
- 만들어진 sql : select * from board where worker=’hong’ and to_char(mdate, ‘mm’) = ‘01’






ex) Map구조가 다른 Object의 필드가 될 때
<select id='foreach_map2' parameterType='Map' resultMap='dynamicMap'>
select * from board
<where>
<if test='worker != null'>
worker = #{worker}
</if>
<if test='list != null'>
 and
<foreach collection='list' index='key' item='value'
separator="or" open="(" close=")">
 to_char(mdate, 'mm') = #{value}
</foreach>
</if>
</where>
</select>

---Java Code---
Map<String, Object> map = new HashMap<String, Object>();
List<String> list = new ArrayList<String>();
list.add(“01”);
list.add(“02”);
list.add(“03”);
map.put(“worker”, “hong”);
map.put(“list”, list);
List<DynamicVo> v = s.selectList("dynamic.foreach_map2", map);

- #{worker}, #{list}는 Map 구조가 갖고 있는 key값이다
- <foreach/> 문에서 collection=’list’ 는 모든 키값에 해당하는 값을 하나씩 item=’value’에 담아 반복문을 
순행하게 된다
- 만들어진 sql : select * from board worker=’hong’ and ( to_char(mdata, ‘mm’) = 01 or
 to_char(mdate, ‘mm’)=02 or to_char(mdate, ‘mm’) = 03







ex) Map구조 사용 시 key/value값을 사용한 처리
<foreach collection="attFile" index="key" item="value">
insert into boardattservlet(serial, pserial, 
attfile, oriattfile)
values(seq_boardattservlet.nextval, seq_boardservlet.currval, 
#{key}, #{value})
</foreach>

'Mybatis' 카테고리의 다른 글

Mybatis  (0) 2023.03.04