MyBatis 동적 SQL
마이바티스의 가장 강력한 기능 중 하나로 동적SQL을 말 할수 있습니다.
예를 들어
1. SELECT * FROM member;
2. SELECT * FROM member where id = 'park'
3. SELECT * FROM member where id = 'park' and pwd='1234'
이 세가지 SQL문은 조건문만 다를 쁜 같은 구조의 SQL문이다. 그렇다면 서로 다른 조건이 10가지 이상이 된다면
조건이 다른 SQL문을 10가지 이상 작성해야 합니다. 하지만 마이바티의 동적SQL 기능을 이용한다면 한 개의 SQL
문으로 구현이 가능 합니다. 즉, 공통 SQL문에 대해 조건 값의 유무에 따라 동적으로 공통 SQL문에 조건절을 추가
하면 됩니다.
마이바티스 동적SQL문의 특징
- SQL문의 조건절에서 사용
- 조건절에 조건을 동적으로 추가
- JSTL과 XML기반으로 동적 SQL문을 작성
마이바티스 동적SQL문 구성 종류
종류 |
if |
choose(when, otherwise) |
trim(where, set) |
foreach |
1. 동적 SQL : <if> 태그
<if>태그 사용 법
<where>
<if test='조건식'>
--추가할 SQL문
</if>
<where>
실제 예시 SQL문
<!--select문 <where>태그를 이용해 sql문의 where절을 동적으로 구성 -->
<select id="searchMember" parameterType="memberVO" resultMap="memResult">
select * from t_member
<where>
<if test="name != '' and name != null">
name = #{name}
</if>
<if test="email != '' and email != null">
email = #{email}
</if>
</where>
</select>
- name이 공백이 아니거나 null이 아니면 조건절에 name 조건식을 추가
- email이 공백이 아니거나 null이 아니면 조건절에 email 조건식을 추가
name과 email 조건이 모두 true이면 조건절에는 아무것도 추가가 되지않습니다. (공백이거나 null일 경우)
2. 동적 SQL : <choose> 태그
<choose> 태그 사용법
<choose>
<when test="조건식1">
구문1
</when>
<when test="조건식2">
구문2
</when>
....
<otherwise>
구문 n+1
</otherwise>
</choose>
실제 예시 SQL문
<!-- <sql> 태그를 이용해 공통 SQL문의 refid를 이용해 사용 -->
<sql id="a">
select * from t_member
</sql>
<!-- <include> 태그를 이용해 공통 SQL문을 재사용 -->
<select id="searchMember" parameterType="memberVO" resultMap="memResult">
<include refid="a"/>
<where>
<choose>
<when test="name !='' and name != null and email != '' and email != null">
name=#{name} and email=#{email}
</when>
<when test="name != '' and name != null ">
name=#{name}
</when>
<when test="email != '' and email != null">
email=#{email}
</when>
</choose>
</where>
</select>
- name과 email의 값이 모두 있으면 where절에 name과 email 조건식을 추가
- name만 값이 있으면 where절에 name 조건식만 추가
- email만 값이 있으면 where절에 email 조건식만 추가
실행 결과는 <if> 태그와 동일 합니다.
3. 동적 SQL : <foreach> 태그
<foreach>태그 사용 법
<foreach item="item" collection="list" index="index" open=" (" close=")" separator=",">
#{item}
</foreach>
<foreach> 태그에 관련된 속성
속성 | 설명 |
collection | 전달받은 인자 값을 의미하며, 배열과 List 계열 인스턴스를 전달 할 수 있습니다. List 인스턴스 전달 시에는 list로 표시하고 배열 전달 시에는 array로 표시 합니다. |
index | foreach 문이 반복될 때마다 1씩 증가시키면서 접근하는 값의 위치를 나타냅니다. 최초 값의 위치는 0 입니다. |
item | 반복문이 실행될 때마다 collection 속성에 지정된 값에 접근하여 차례대로 사용합니다. |
open | 해당 구문이 시작될 때의 지정한 기호를 추가합니다. |
close | 해당 구문이 끝날 때의 지정한 기호를 추가합니다. |
separator | 한 번 이상 반복될 때 반복되는 사이에 지정한 기호를 추가합니다. |
실제 예시 SQL문
<!--foreach문을 이용해 반복해서 list의 값을 표시 -->
<select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
<include refid="a"/>
where name in
<foreach item="item" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
order by joinDate desc
</select>
끝!
#MyBatis 동적 SQL문
'개발 > 스프링' 카테고리의 다른 글
13. 스프링 프레임워크 - 트랜잭션 기능[자바웹을 다루는 기술] (0) | 2022.05.23 |
---|---|
12. 스프링 프레임워크-마이바티스 연동[자바웹을 다루는 기술] (0) | 2022.05.22 |
10. 스프링 프레임워크 - MyBatis[자바웹을 다루는 기술] (0) | 2022.05.19 |
9. 스프링 프레임 워크 - jdbcTemplate 클래스 이용[자바웹을 다루는 기술] (0) | 2022.05.19 |
8. 스프링 프레임워크-데이터베이스 연동[자바웹을 다루는 기술] (0) | 2022.05.17 |