๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java·๏ปฟServlet·๏ปฟJSP/Library·Framework

MyBatis ๋™์  SQL - <choose>์™€ <set>์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  SQL ๋งŒ๋“ค๊ธฐ

by Leica 2020. 2. 26.
๋ฐ˜์‘ํ˜•
  • ๊ด€๋ จ ๊ธ€

- [JAVA/WEB] ์›น ํ”„๋กœ์ ํŠธ์— MyBatis ์„ธํŒ… ๋ฐ ์ ์šฉํ•˜๊ธฐ

- MyBatis ์„ค์ • ํŒŒ์ผ - SQL Mapper ์ž‘์„ฑ ๋ฐฉ๋ฒ•

- MyBatis ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ ๋ฐฉ๋ฒ•

- MyBatis์™€ Log4J ์—ฐ๋™ํ•˜๊ธฐ


์ œ๋ชฉ

MyBatis์˜ ๋™์  SQL ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ SQL๋ฌธ์œผ๋กœ ์—ฌ๋Ÿฌ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ •๋ ฌ ์กฐ๊ฑด์— ๋”ฐ๋ผ ORDER BY ์ ˆ์„ ๋ฐ”๊ฟ”์•ผ ํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์— ๋”ฐ๋ผ WHERE ์ ˆ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๋™์  SQL ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” SQL๋ฌธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

ํ‘œ - MyBatis ๋™์  SQL ์ข…๋ฅ˜

๋™์  SQL ์—˜๋ฆฌ๋จผํŠธ ์„ค๋ช…
<if test="์กฐ๊ฑด">SQL</if> ์กฐ๊ฑด์ด ์ฐธ์ผ ๊ฒฝ์šฐ SQL๋ฌธ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
<choose>
    <when test="์กฐ๊ฑด1">SQL</when>
    <when test="์กฐ๊ฑด2">SQL</when>
    <otherwise>SQL</otherwise>
<choose>
๊ฒ€์‚ฌํ•  ์กฐ๊ฑด์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉ
์ž๋ฐ”์˜ if-else๋ฌธ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
์ผ์น˜ํ•˜๋Š” ์กฐ๊ฑด์ด ์—†์œผ๋ฉด <otherwise>์˜ SQL์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
<where>
    <if test="์กฐ๊ฑด1">SQL</if>
    <if test="์กฐ๊ฑด2">SQL</if>
</where>
SQL๋ฌธ์˜ WHERE์ ˆ์„ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
<where> ์•ˆ์˜ ์กฐ๊ฑด์‹์—์„œ ์ผ์น˜ํ•˜๋Š” ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด WHERE์ ˆ์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—†์œผ๋ฉด ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
<trim prefix="์ ‘๋‘์–ด" prefixOverrides="๋ฌธ์ž์—ด|๋ฌธ์ž์—ด">
    <if test="์กฐ๊ฑด1">SQL</if>
    <if test="์กฐ๊ฑด2">SQL</if>
</trim>
์กฐ๊ฑด์— ๋”ฐ๋ผ SQL์ด ๋ฐ˜ํ™˜๋˜๋ฉด SQL๋ฌธ์˜ ์•ž๋ถ€๋ถ„์—์„œ prefixOverrides์— ์ง€์ •๋œ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ œ๊ฑฐํ•˜๊ณ  prefix๋กœ ์ง€์ •ํ•œ ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ธ๋‹ค.
<set>
    <if test="์กฐ๊ฑด1">SQL</if>
    <if test="์กฐ๊ฑด2">SQL</if>
</set>
UPDATE๋ฌธ์˜ SET์ ˆ์„ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
<set> ์•ˆ์˜ ์กฐ๊ฑด์‹์—์„œ ์ผ์น˜ํ•˜๋Š” ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด SET์ ˆ์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—†์œผ๋ฉด ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
SET์ ˆ์˜ ํ•ญ๋ชฉ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ฝค๋งˆ(,)๋ฅผ ๋ถ™์ธ๋‹ค.
<foreach
    item="ํ•ญ๋ชฉ"
    index="์ธ๋ฑ์Šค"
    collection="๋ชฉ๋ก"
    open="์‹œ์ž‘๋ฌธ์ž์—ด"
    close="์ข…๋ฃŒ๋ฌธ์ž์—ด"
    separator="๊ตฌ๋ถ„์ž">
</foreach>
๋ชฉ๋กํ˜• ๋ฐ์ดํ„ฐ๋กœ SQL๋ฌธ์„ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
ํŠนํžˆ IN(๊ฐ’, ๊ฐ’, ...) ์กฐ๊ฑด์„ ๋งŒ๋“ค๋•Œ ํŽธ๋ฆฌํ•˜๋‹ค.

item : ํ•œ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ง€์ •
index : ์ธ๋ฑ์Šค ๊ฐ’์„ ๊บผ๋‚ผ๋•Œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ง€์ •
collection : java.util.List ๊ตฌํ˜„์ฒด๋‚˜ ๋ฐฐ์—ด ๊ฐ์ฒด ์ง€์ •
open : ์ตœ์ข… ๋ฐ˜ํ™˜๊ฐ’์˜ ์ ‘๋‘์–ด ์ง€์ •
close : ์ตœ์ข… ๋ฐ˜ํ™˜๊ฐ’์˜ ์ ‘๋ฏธ์–ด ์ง€์ •
separator : ๊ตฌ๋ถ„์ž ๋ฌธ์ž์—ด ์ง€์ •
<bind name="๋ณ€์ˆ˜๋ช…" value="๊ฐ’"/> ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ• ๋•Œ ์‚ฌ์šฉ

 

๐Ÿ“ <when>๊ณผ <if>์˜ test ์†์„ฑ

test ์†์„ฑ์—๋Š” ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๋Š” OGNL(Open-Graph Navigation Language) ๊ธฐ๋ฐ˜ ํ‘œํ˜„์‹์ด ์˜จ๋‹ค.
OGNL์€ ์ž๋ฐ” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์‰ฝ๊ฒŒ ๊บผ๋‚ด๊ณ  ํ• ๋‹นํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋งŒ๋“  ํ‘œํ˜„์‹ ์–ธ์–ด์ด๋‹ค.

 

๋ฐ˜์‘ํ˜•

 

MyBatis ๋™์  SQL - <choose> ์‚ฌ์šฉ ์˜ˆ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<select id="selectList" parameterType="map" resultMap="projectResultMap">
    select PNO, PNAME, STA_DATE, END_DATE, STATE
    from PROJECTS
    order by
    <choose>
        <when test="orderCond == 'TITLE_ASC'">PNAME asc</when>
        <when test="orderCond == 'TITLE_DESC'">PNAME desc</when>
        <when test="orderCond == 'STARTDATE_ASC'">STA_DATE asc</when>
        <when test="orderCond == 'STARTDATE_DESC'">STA_DATE desc</when>
        <when test="orderCond == 'ENDDATE_ASC'">END_DATE asc</when>
        <when test="orderCond == 'ENDDATE_DESC'">END_DATE desc</when>
        <when test="orderCond == 'STATE_ASC'">STATE asc</when>
        <when test="orderCond == 'STATE_DESC'">STATE desc</when>
        <when test="orderCond == 'PNO_ASC'">PNO asc</when>
        <otherwise>PNO desc</otherwise>
    </choose>
</select>
cs

<choose>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ orderCond์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ •๋ ฌ์กฐ๊ฑด์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ์˜ˆ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด orderCond๊ฐ€ 'STATE_ASC'์ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์  SQL๋ฌธ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

select PNO, PNAME, STA_DATE, END_DATE, STATE

from PROJECTS

order by STATE asc

 

MyBatis ๋™์  SQL - <set> ์‚ฌ์šฉ ์˜ˆ

1
2
3
4
5
6
7
8
9
10
11
12
<update id="update" parameterType="map">
    update PROJECTS
    <set>
        <if test="title != null">PNAME=#{title},</if>
        <if test="content != null">CONTENT=#{content},</if>
        <if test="startDate != null">STA_DATE=#{startDate},</if>
        <if test="endDate != null">END_DATE=#{endDate},</if>
        <if test="state != null">STATE=#{state},</if>
        <if test="tags != null">TAGS=#{tags},</if>
    </set>
    where PNO = #{no}
</update>
cs

<set>์„ ์‚ฌ์šฉํ•˜์—ฌ update ํ˜ธ์ถœ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ์ปฌ๋Ÿผ๋งŒ SET์ ˆ์„ ๋งŒ๋“ค๋„๋ก ํ•˜๋Š” ์˜ˆ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด startDate, endDate๋งŒ ์ „๋‹ฌ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์  SQL๋ฌธ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

update PROJECTS

SET STA_DATE = #{startDate},

END_DATE = #{endDate}

where PNO = #{no}


  • ๊ด€๋ จ ๊ธ€

- [JAVA/WEB] ์›น ํ”„๋กœ์ ํŠธ์— MyBatis ์„ธํŒ… ๋ฐ ์ ์šฉํ•˜๊ธฐ

- MyBatis ์„ค์ • ํŒŒ์ผ - SQL Mapper ์ž‘์„ฑ ๋ฐฉ๋ฒ•

- MyBatis ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ ๋ฐฉ๋ฒ•

- MyBatis์™€ Log4J ์—ฐ๋™ํ•˜๊ธฐ

 

References

์—ดํ˜ˆ๊ฐ•์˜ ์ž๋ฐ” ์›น ๊ฐœ๋ฐœ ์›Œํฌ๋ถ(ํ”„๋ฆฌ๋ ‰, 2016, ์—„์ง„์˜)

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€