Coding Planet
MyBatis - ๋์ SQL ๊ตฌํํ๊ธฐ(if / choose / trim/ foreach) ๋ณธ๋ฌธ
๐ฑSPRING
MyBatis - ๋์ SQL ๊ตฌํํ๊ธฐ(if / choose / trim/ foreach)
jhj.sharon 2023. 5. 3. 16:59๋ฐ์ํ
JDBC MVC ํจํด์ผ๋ก DB๋ฅผ ์์ , ํธ์งํ๊ธฐ ์ํด์ sql.xml์ SQL๋ฌธ์ ์ ์ฅํด๋๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋ค๋ง ์ด๋ ๊ฒ ๊ฐ๋ฐ์ ํ ๋, ์ํฉ์ ๋ฐ๋ผ ์๊ตฌํ๋ ์ปฌ๋ผ์ด ๋ค๋ฅด๊ฑฐ๋ ํน์ ์กฐ๊ฑด์ ์ถ๊ฐํ ๋๋ง๋ค ์๋ก์ด sql๋ฌธ์ ๋ง๋ค๊ณ key๊ฐ์ ์ค์ ํด์ค์ผํ๋ค. ๋์ SQL์ ๊ตฌํํ ์๋ ์์ง๋ง ๋งค์ฐ ๋ณต์กํ๋ค.
ํ์ง๋ง ๋ง์ด๋ฐํฐ์ค๋ฅผ ์ด์ฉํ๋ฉด ๋์ SQL์ JSTL์ ์ฌ์ฉํ์ฌ ์ข ๋ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ํ์ ์ธ ๋ฌธ๋ฒ์ ๋ง์ด๋ฐํฐ์ค ํํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ฌ ์๊ฐํ๊ณ ๊ตฌํํ๊ณ ์ ํ๋ค.
1. if
- ์กฐ๊ฑด๋ฌธ if๋ ์กฐ๊ฑด์ WHERE์ ์ผ๋ถ๋ก ํฌํจ๋์ด ์กฐ๊ฑด๋ฌธ ์ฌ์ฉ์ ์ ๋์ฑ์ ์ค ์ ์๋ค.
- ์๋ ์กฐ๊ฑด๋ฌธ์ ๊ฒ์ํ ํ ์ด๋ธ์์ ๊ฒ์๊ธ์ ๋ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ sql๋ฌธ์ด๋ค. ํด๋น sql๋ฌธ์ ์ญ์ ๋์ง ์์ ๋ชจ๋ ๊ฒ์๋ฌผ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์จ๋ค.
- ์ด ๊ตฌ๋ฌธ์ ์ ํ์ ์ผ๋ก ๋ฌธ์์ด์ ๊ฒ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ง์ฝ title๊ฐ์ด ์๋ค๋ฉด ๋ชจ๋ active ์ํ์ ๊ฒ์๊ธ์ด ๋ฆฌํด๋๋ฏ์ด๋ค. ํ์ง๋ง title ๊ฐ์ด ์๋ค๋ฉด ๊ทธ ๊ฐ๊ณผ ๋น์ทํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ฒ ๋ ๊ฒ์ด๋ค.
- writer๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์๋์ ๊ฐ์ด if๋ฌธ์ ์ค๋ณตํ์ฌ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด๋ฌธ์ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
<select id="boardDetail" resultType="board">
SELECT * FROM BOARD WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="writer != null and writer.name != null">
AND writer_name like #{writer.name}
</if>
</select>
2. choose, when, otherwise
- ์๋ฐ์์ switch์ ์ ์ฌํ ๊ธฐ๋ฅ์์ ํ๋ค. ์๋ฐ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก if๋ฌธ์ ๋จ์ํ ์กฐ๊ฑด๋ฌธ์ผ๋ก ์กฐ๊ฑด์์ด ์ฐธ(true)์ด๋ฉด if๋ฌธ ์์ ์๋ ์ฝ๋ ๋ธ๋ก์ด ์คํ๋๊ณ ์กฐ๊ฑด์์ด ๊ฑฐ์ง(false)์ด๋ฉด ์คํ๋์ง ์๋๋ค.
- switch๋ฌธ์ ์ฌ๋ฌ ๊ฐ์ ์กฐ๊ฑด ์ค ํ๋๋ฅผ ์ ํํด์ ์คํํ ๋ ์ฌ์ฉํ๋ค. switch๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ์๋ ํํ์์ ๊ฐ์ ๊ฒ์ฌํด์ ์ผ์นํ๋ case๋ฌธ์ ์ฐพ์ ํด๋นํ๋ ์ฝ๋ ๋ธ๋ก์ ์คํํ๊ณ ์ผ์นํ๋ case๊ฐ ์์ผ๋ฉด default๋ฅผ ์คํํ๋ค.
- ์๋ ์ฝ๋๋ BOARD ํ ์ด๋ธ์์ STATE๊ฐ 'ACTIVE'์ธ ๋ ์ฝ๋๋ฅผ ๊ฒ์ํ๊ณ , ์ ํ์ ์ผ๋ก title ํน์ writer์ ์ด๋ฆ์ผ๋ก ๊ฒ์ํ๋ค.
- ์ ์ฝ๋์์๋ title ๋ณ์๊ฐ null์ด ์๋๋ฉด, ์ฆ ๊ฐ์ด ์๋ค๋ฉด AND title like #{title} ๊ตฌ๋ฌธ์ด ์ถ๊ฐ๋๋ค. ๊ทธ๋ ์ง ์๊ณ writer.name ๋ณ์๊ฐ null์ด ์๋๋ฉด AND writer_name like #{writer.name} ๊ตฌ๋ฌธ์ด ์ถ๊ฐ๋๋ค.
- ๋ ๋ค null์ด๋ฉด AND featured = 1 ๊ตฌ๋ฌธ์ด ์ถ๊ฐ๋ฉ๋๋ค.
- <when>์์๋ switch์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ ์กฐ๊ฑด ์ค ํด๋นํ๋ ํ๋๋ง ์ ํ๋๋ฉฐ ๋จผ์ ์์ ๋์ด์์ ์๋ก ์ฐ์ ์์๊ฐ ๋๋ค. ์ฆ, title ๋ณ์๊ฐ ๊ฐ์ด ์๋ค๋ฉด, AND title like #{title} ๊ตฌ๋ฌธ์ด ์คํ๋๊ณ writer.name ๋ณ์๋ ์ฒซ ๋ฒ์งธ <when> ์์๊ฐ false์ธ ๊ฒฝ์ฐ์๋ง ๊ฒ์ฌ๋๋ค.
<select id="boardDetailSearch" resultType="board">
SELECT * FROM BOARD WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="writer != null and writer.name != null">
AND writer_name like #{writer.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
3. trim, where, set
1) where
<select id="boardDetail" resultType="board">
SELECT * FROM BOARD
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="writer != null and writer.name != null">
AND writer_name like #{writer.name}
</if>
</select>
- ๋ค์์ sql๋ฌธ ์ค ์ด๋ค ์กฐ๊ฑด์๋ ํด๋นํ์ง ์๋๋ค๋ฉด ์ถ๋ ฅ๋๋ sql๋ฌธ์ [SELECT * FROM BOARD WHERE] ์ผ ๊ฒ ์ด๋ค.
- ์ด ๊ฒฝ์ฐ SQL๋ฌธ์ ์ ์์ ์ผ๋ก ์ํ๋์ง ์๋๋ค. ์ด๋ <where> ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ <where>์๋ฆฌ๋จผํธ๋ ํ๊ทธ์ ์ํด ์ปจํ ์ธ ๊ฐ ๋ฆฌํด๋๋ฉด ๋จ์ํ "WHERE"๋ฅผ ์ถ๊ฐํ์ฌ ์ถ๋ ฅํ๋ค. ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ where๋ ์์ฑ๋์ง ์๋๋ค.
- ๋ค๋ง, ์ปจํ ์ธ ๊ฐ “AND”๋ “OR”๋ก ์์ํ๋ค๋ฉด ๊ทธ “AND”๋ “OR”๋ฅผ ์ง์๋ฒ๋ฆฐ๋ค.
<select id="boardDetail" resultType="board">
SELECT * FROM BOARD
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="writer != null and writer.name != null">
AND writer_name like #{writer.name}
</if>
</where>
</select>
2) trim
- <trm>์ <where>์ ๊ณผ ๋ฌ๋ฆฌ where๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ์์๋ฅผ ๋์ ์ผ๋ก ์์ฑํ ๋ ์ฌ์ฉ ๋๋ค. SQL ์ฟผ๋ฆฌ์ ์์, ๋ ๋๋ ์ด๋๋ ์ง ์ฌ์ฉํ ์ ์๋ค.
- ๋ํ ๋ถํ์ํ ๊ณต๋ฐฑ ๋ฌธ์๋ ์ ๊ฑฐํ ์ ์๋ค.
- override ์์ฑ์ ์ค๋ฒ๋ผ์ด๋ํ๋ ํ ์คํธ์ ๋ชฉ๋ก์ ์ ํํ๋ค. ๊ฒฐ๊ณผ๋ override ์์ฑ์ ๋ช ์๋ ๊ฒ๋ค์ ์ง์ฐ๊ณ with ์์ฑ์ ๋ช ์๋ ๊ฒ์ ์ถ๊ฐํ๋ค.
- ๋ฐ๋ผ์, ์๋ ์ฝ๋๋ 'AND' ์ 'OR'์ ์ ๋์ฌ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ง์ฐ๊ณ ์ ๋์ฌ WHERE๋ฅผ ์ถ๋ ฅํ๋ผ๋ ๋ป์ด๋ค. ์ด๋ฅผ ํตํด ์กฐ๊ฑด์ ์ด ๋ถํ์ํ๊ฒ 'AND' ์ 'OR'๋ก ์์ํ์ง ์๊ณ 'WHERE'๋ก ์์ํ๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค.
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
3) set
- ์๋ ์ฟผ๋ฆฌ๋ 'Writer'ํ ์ด๋ธ์์ id๊ฐ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
- <set> ์์๋ ์ ๋ฐ์ดํธํ ์ปฌ๋ผ๊ณผ ๊ฐ์ ์ง์ ํ๋ ๋ธ๋ก์ด๋ค. <set> ์์ ๋ด์๋ <if> ์์๊ฐ ํฌํจ๋์ด ์๊ณ ๊ฐ <if> ์์๋ ํด๋น ์ด์ ๊ฐ์ ๋์ ์ผ๋ก ์ ์ฅํ๋ค.
- ๊ฐ <if> ์์์๋ test ์์ฑ์ด ์์ผ๋ฉฐ, ์ด ์์ฑ์ ํด๋น ์ด์ด ์ ๋ฐ์ดํธ๋์ด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ์กฐ๊ฑด์ ์ฃผ๋๋ฐ ๋ฐ ์ฌ์ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, username์ด null์ด ์๋๋ฉด ํด๋น ์ด์ ์ ๋ฐ์ดํธํ๊ณ , null์ด๋ฉด ์ ๋ฐ์ดํธํ์ง ์๋๋ค.
<update id="updateWriterIfNecessary">
update Writer
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>
4. foreach
- foreach๋ ๋์ SQL์์ collection์ ๋ํ ๋ฐ๋ณต์ฒ๋ฆฌ๋ฅผ ํ ๋ ์ฌ์ฉ๋๋ค.
- ์๋ ์ฟผ๋ฆฌ๋ ID๊ฐ list์ ํฌํจ๋ ๊ฐ ์ค ํ๋์ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ์กฐํํ๋ค. ๊ฐ ์์ฑ์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค.
- list: 'foreach'๊ฐ ๋ฐ๋ณตํ ์ปฌ๋ ์ ์ ์ง์
- item: ๋ฐ๋ณต ์ค ํ์ฌ ํญ๋ชฉ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ง์ ํ๋ค.
- index: ๋ฐ๋ณต ์ค ํ์ฌ ํญ๋ชฉ์ ๋ํ ์ธ๋ฑ์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ง์ ํํ๋ค.
- open, separator, close ์์ฑ์ ๋ฐ๋ณต๋๋ SQL ๊ตฌ๋ฌธ์ ์์, ๊ตฌ๋ถ์ ๋ฐ ๋์ ์ง์ ํ๋ค. ์ ์ฝ๋์์๋ ID in (๋ก ์์ํ๊ณ , ,๋ก ๊ตฌ๋ถํ๋ฉฐ, )๋ก ๋๋๋ SQL ๊ตฌ๋ฌธ์ด ๋ฐ๋ณต๋๋ค.
- nullable: ์ปฌ๋ ์ ์ด null์ธ ๊ฒฝ์ฐ 'foreach'๊ฐ ๋ฌด์๋๋๋ก ํ๋ค.
<select id="selectPostIn" resultType="postList">
SELECT *
FROM POST P
<where>
<foreach item="item" index="index" collection="list"
open="ID in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>
- ์๋ฅผ ๋ค์ด, list๊ฐ {1, 3, 5}๋ผ๋ฉด, ์๋์ ๊ฐ์ SQL๋ฌธ์ด ์คํ๋๋ค.
- ๋ง์ฝ list๊ฐ ๋น์ด์๊ฑฐ๋ null์ด๋ผ๋ฉด, ์๋ฌด๋ฐ ๋ ์ฝ๋๋ ์กฐํ๋์ง ์๋๋ค.
SELECT *
FROM POST P
WHERE ID IN (1, 3, 5)
๋ฐ์ํ
'๐ฑSPRING' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring root-context.xml ๋ฏ์ด๋ณด๊ธฐ (0) | 2023.05.03 |
---|---|
Mybatis-confing.xml ๋ฏ์ด๋ณด๊ธฐ (0) | 2023.05.03 |
Spring @RequestMapping์ด๋? ์์ฑ๋ฐฉ๋ฒ, ์์ (0) | 2023.04.25 |
Apache Maven / Maven์ด๋? (0) | 2023.04.24 |
Spring Framework๋? ํน์ง, ๊ตฌ์ฑ ๋ชจ๋, Spring MVC (0) | 2023.04.24 |
Comments