๋์ ์ฟผ๋ฆฌ
MyBatis๋ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ค์ํ ํ๊ทธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์กฐ๊ฑด์ ๋ฐ๋ผ SQL ์ฟผ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
์ฃผ์ ๋์ ์ฟผ๋ฆฌ ํ๊ทธ
ํ๊ทธ | ์ค๋ช
|
<if> | ์กฐ๊ฑด์ด ์ฐธ์ผ ๋๋ง SQL ๊ตฌ๋ฌธ ํฌํจ |
<choose> | Java์ switch ๋ฌธ๊ณผ ์ ์ฌ (when, otherwise์ ํจ๊ป ์ฌ์ฉ) |
<when> | choose ๋ด์์ ์กฐ๊ฑด ๋ถ๊ธฐ |
<otherwise> | choose ๋ด์์ ๋ชจ๋ when ์กฐ๊ฑด์ด ๊ฑฐ์ง์ผ ๋ ์คํ |
<where> | WHERE ์ ์ ๋์ ์ผ๋ก ์์ฑํ๊ณ ๋ถํ์ํ AND/OR ์ ๊ฑฐ |
<set> | UPDATE์ SET ์ ์ ๋์ ์ผ๋ก ์์ฑํ๊ณ ๋ถํ์ํ ์ผํ ์ ๊ฑฐ |
<trim> | ์ ๋์ฌ/์ ๋ฏธ์ฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐ |
<foreach> | ์ปฌ๋ ์
์ ์ํํ๋ฉฐ SQL ๊ตฌ๋ฌธ ๋ฐ๋ณต |
<if> ํ๊ทธ
์กฐ๊ฑด์ด ์ฐธ์ผ ๋๋ง SQL ๊ตฌ๋ฌธ์ ํฌํจํฉ๋๋ค.
<select id="select" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
XML
๋ณต์ฌ
<choose>, <when>, <otherwise> ํ๊ทธ
์ฌ๋ฌ ์กฐ๊ฑด ์ค ํ๋๋ง ์ ํํ ๋ ์ฌ์ฉํฉ๋๋ค.
<select id="select" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="email != null">
AND email = #{email}
</when>
<otherwise>
AND status = 'ACTIVE'
</otherwise>
</choose>
</where>
</select>
XML
๋ณต์ฌ
<where> ํ๊ทธ
WHERE ์ ์ ์๋์ผ๋ก ์์ฑํ๊ณ , ์ฒซ ๋ฒ์งธ AND/OR๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
<select id="select" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
XML
๋ณต์ฌ
<set> ํ๊ทธ
UPDATE์ SET ์ ์ ๋์ ์ผ๋ก ์์ฑํ๊ณ , ๋ง์ง๋ง ์ผํ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
<update id="update">
UPDATE users
<set>
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</set>
WHERE id = #{id}
</update>
XML
๋ณต์ฌ
<trim> ํ๊ทธ
์ ๋์ฌ๋ ์ ๋ฏธ์ฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํฉ๋๋ค.
<select id="findUsers" resultType="User">
SELECT * FROM users
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</trim>
</select>
XML
๋ณต์ฌ
<trim> ํ๊ทธ ์์ฑ
์์ฑ | ์ค๋ช
|
prefix | ์์ฑ๋ SQL ์์ ์ถ๊ฐํ ์ ๋์ฌ |
suffix | ์์ฑ๋ SQL ๋ค์ ์ถ๊ฐํ ์ ๋ฏธ์ฌ |
prefixOverrides | ์์ฑ๋ SQL ์์์ ์ ๊ฑฐํ ๋ฌธ์์ด (๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ) |
suffixOverrides | ์์ฑ๋ SQL ๋ค์์ ์ ๊ฑฐํ ๋ฌธ์์ด (๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ) |
<trim> ํ๊ทธ ๋์ ์ค๋ช
<trim> ํ๊ทธ๋ ๋์ ์ผ๋ก ์์ฑ๋๋ SQL ๊ตฌ๋ฌธ์ ์๋ค์ ํน์ ๋ฌธ์์ด์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์ ์์ ๋ถ์:
โข
prefix="WHERE": trim ๋ธ๋ก ๋ด์ฉ์ด ์์ผ๋ฉด ์์ "WHERE"๋ฅผ ์ถ๊ฐํฉ๋๋ค.
โข
prefixOverrides="AND |OR ": ์์ฑ๋ SQL์ ๋งจ ์์ "AND " ๋๋ "OR "๊ฐ ์์ผ๋ฉด ์ ๊ฑฐํฉ๋๋ค.
โข
๋ง์ฝ name๊ณผ age๊ฐ ๋ชจ๋ null์ด ์๋๋ผ๋ฉด, ์ต์ข
SQL์ SELECT * FROM users WHERE name = ? AND age = ?๊ฐ ๋ฉ๋๋ค.
โข
์ฒซ ๋ฒ์งธ ์กฐ๊ฑด์ "AND"๊ฐ prefixOverrides์ ์ํด ์ ๊ฑฐ๋์ด ์ฌ๋ฐ๋ฅธ SQL์ด ์์ฑ๋ฉ๋๋ค.
์ถ๊ฐ ์์ - suffixOverrides ์ฌ์ฉ:
<update id="updateUser">
UPDATE users
<trim prefix="SET" suffixOverrides=",">
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</trim>
WHERE id = #{id}
</update>
XML
๋ณต์ฌ
์ด ์์ ์์๋ ๋ง์ง๋ง ์ผํ๊ฐ ์๋์ผ๋ก ์ ๊ฑฐ๋ฉ๋๋ค. <set> ํ๊ทธ์ ๋์ผํ ํจ๊ณผ๋ฅผ ๋
๋๋ค.
<foreach> ํ๊ทธ
์ปฌ๋ ์
์ ์ํํ๋ฉฐ SQL ๊ตฌ๋ฌธ์ ๋ฐ๋ณตํฉ๋๋ค. IN ์ ์ ์์ฑํ ๋ ์ ์ฉํฉ๋๋ค.
<select id="findUsersByIds" resultType="User">
SELECT * FROM users
WHERE id IN
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>
XML
๋ณต์ฌ
<foreach> ํ๊ทธ ์์ฑ
์์ฑ | ์ค๋ช
|
collection | ๋ฐ๋ณตํ ์ปฌ๋ ์
(list, array, map ๋ฑ) |
item | ํ์ฌ ๋ฐ๋ณต ํญ๋ชฉ์ ์ฐธ์กฐํ ๋ณ์๋ช
|
index | ํ์ฌ ๋ฐ๋ณต์ ์ธ๋ฑ์ค๋ฅผ ์ฐธ์กฐํ ๋ณ์๋ช
|
open | ๋ฐ๋ณต ์์ ์ ์ถ๊ฐํ ๋ฌธ์์ด |
close | ๋ฐ๋ณต ์ข
๋ฃ ์ ์ถ๊ฐํ ๋ฌธ์์ด |
separator | ๊ฐ ํญ๋ชฉ ์ฌ์ด์ ์ถ๊ฐํ ๊ตฌ๋ถ์ |
<bind> ํ๊ทธ
OGNL ํํ์์ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค. LIKE ๊ฒ์ ์ ์ ์ฉํฉ๋๋ค.
<select id="findUsersByName" resultType="User">
<bind name="pattern" value="'%' + name + '%'" />
SELECT * FROM users
WHERE name LIKE #{pattern}
</select>
XML
๋ณต์ฌ
<bind> ํ๊ทธ ๋์ ์ค๋ช
<bind> ํ๊ทธ๋ OGNL(Object-Graph Navigation Language) ํํ์์ ์ฌ์ฉํ์ฌ ์๋ก์ด ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค.
์ ์์ ๋ถ์:
โข
name="pattern": ์์ฑํ ๋ณ์์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
โข
value="'%' + name + '%'": OGNL ํํ์์ ์ฌ์ฉํ์ฌ ๋ณ์์ ๊ฐ์ ์ ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์
๋ ฅ๋ฐ์ name ๊ฐ ์๋ค์ %๋ฅผ ๋ถ์
๋๋ค.
โข
๋ง์ฝ name์ด "ํ๊ธธ๋"์ด๋ผ๋ฉด, pattern ๋ณ์๋ "%ํ๊ธธ๋%"์ด ๋ฉ๋๋ค.
โข
์์ฑ๋ pattern ๋ณ์๋ #{pattern}์ผ๋ก SQL ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
<bind> ํ๊ทธ์ ์ฅ์ :
โข
SQL ์ฟผ๋ฆฌ๋ฅผ ๋ ๊น๋ํ๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
โข
๋ณต์กํ ๋ฌธ์์ด ์กฐ์์ SQL ์ธ๋ถ์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
โข
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ณ์๋ฅผ ์์ฑํ์ฌ ์ฟผ๋ฆฌ ๋ด์์ ์ฌ๋ฌ ๋ฒ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
์ถ๊ฐ ์์ - ๋ ์ง ํ์ ๋ณํ:
<select id="findUsersByDate" resultType="User">
<bind name="startDate" value="startDate + ' 00:00:00'" />
<bind name="endDate" value="endDate + ' 23:59:59'" />
SELECT * FROM users
WHERE created_at BETWEEN #{startDate} AND #{endDate}
</select>
XML
๋ณต์ฌ
์ด ์์ ์์๋ ๋ ์ง ๋ฌธ์์ด์ ์๊ฐ์ ์ถ๊ฐํ์ฌ ๋ฒ์ ๊ฒ์์ ์ํํฉ๋๋ค.
OGNL(Object-Graph Navigation Language) ํํ์์ด๋?
OGNL์ Java ๊ฐ์ฒด์ ์์ฑ์ ํ์ํ๊ณ ์กฐ์ํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ํํ ์ธ์ด์
๋๋ค. MyBatis์์๋ ๋์ SQL์ ์์ฑํ ๋ OGNL์ ์ฌ์ฉํ์ฌ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ฐธ์กฐํ๊ณ ์ฐ์ฐ์ ์ํํฉ๋๋ค.
OGNL์ ์ฃผ์ ๊ธฐ๋ฅ
โข
์์ฑ ์ ๊ทผ: ๊ฐ์ฒด์ ์์ฑ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์: user.name, user.address.city
โข
๋ฉ์๋ ํธ์ถ: ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์: name.length(), name.toUpperCase()
โข
์ฐ์ฐ: ์ฐ์ , ๋
ผ๋ฆฌ, ๋น๊ต ์ฐ์ฐ์ ์ํํ ์ ์์ต๋๋ค. ์: age + 1, age > 18
โข
๋ฌธ์์ด ์กฐ์: ๋ฌธ์์ด์ ๊ฒฐํฉํ๊ฑฐ๋ ์กฐ์ํ ์ ์์ต๋๋ค. ์: '%' + name + '%'
โข
์ปฌ๋ ์
์ ๊ทผ: ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์: list[0], map['key']
MyBatis์์ OGNL ์ฌ์ฉ ์์
1. ์กฐ๊ฑด ์ฒดํฌ:
<if test="name != null and name != ''">
AND name = #{name}
</if>
XML
๋ณต์ฌ
2. ์ปฌ๋ ์
์ฒดํฌ:
<if test="list != null and list.size() > 0">
AND id IN
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</if>
XML
๋ณต์ฌ
3. ๋ฌธ์์ด ์กฐ์:
<bind name="pattern" value="'%' + keyword + '%'" />
SELECT * FROM users WHERE name LIKE #{pattern}
XML
๋ณต์ฌ
4. ๋ณต์กํ ์กฐ๊ฑด:
<if test="age != null and (age >= 18 and age <= 65)">
AND age BETWEEN 18 AND 65
</if>
XML
๋ณต์ฌ
OGNL ์ฃผ์ ์ฐ์ฐ์
์ฐ์ฐ์ | ์ค๋ช
| ์์ |
. | ์์ฑ ์ ๊ทผ | user.name |
==, != | ๋๋ฑ ๋น๊ต | name == 'admin' |
>, <, >=, <= | ํฌ๊ธฐ ๋น๊ต | age > 18 |
and, or, not | ๋
ผ๋ฆฌ ์ฐ์ฐ | name != null and age > 18 |
+, -, *, /, % | ์ฐ์ ์ฐ์ฐ | price * quantity |
[] | ์ปฌ๋ ์
์ ๊ทผ | list[0],map['key'] |
์ฃผ์์ฌํญ
โข
XML์์๋ <์ >๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก &lt;์ &gt;๋ก ํํํ๊ฑฐ๋, <![CDATA[]]>๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
โข
null ์ฒดํฌ๋ฅผ ํ ๋๋ != null์ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
โข
๋ฌธ์์ด ๋น๊ต ์ ์์๋ฐ์ดํ('')๋ฅผ ์ฌ์ฉํฉ๋๋ค.



