2025-04-25
MyBatis์์ XML ๋งคํผ๋ SQL์ ์ธ๋ถ ํ์ผ(XML)๋ก ๋ถ๋ฆฌํ์ฌ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก,
๋ณต์กํ SQL, ๋์ ์ฟผ๋ฆฌ, ์ ์ง๋ณด์๊ฐ ํ์ํ ํ๋ก์ ํธ์์ ํ์์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๊ตฌ๋ถ | ์ด๋ ธํ ์ด์ ๋ฐฉ์ | XML ๋งคํผ ๋ฐฉ์ |
---|---|---|
๊ฐ๋จํ CRUD | ์ ํฉ | ๊ฐ๋ฅ |
๋ณต์กํ SQL | ์ ํ์ | ์ฐ์ |
๋์ SQL | ๋ถ๊ฐ๋ฅ | ์ง์ |
์ ์ง๋ณด์ | ์ด๋ ค์ | ์ ๋ฆฌ |
์ค์ ํ์ผ | ์ต์ํ | ๋ณ๋ XML ํ์ |
๊ฐ๋ ์ฑ | ์ฝ๋์ ํผํฉ | SQL ๋ถ๋ฆฌ๋ก ๋ช ํ |
๐ก Tip:
์ด๋ ธํ ์ด์ ๋ฐฉ์์ ๋จ์ ์์ ์,
XML ๋งคํผ๋ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ๊ณ ๋ คํ ๋ณต์กํ ์์ ์ ์ ํฉํฉ๋๋ค.
<mapper namespace="com.example.app.domain.mapper.MemoMapper">
<insert id="insertXml" parameterType="MemoDto">
INSERT INTO tbl_memo (id, text) VALUES (#{id}, #{text})
</insert>
<select id="selectAtXml" parameterType="int" resultType="MemoDto">
SELECT * FROM tbl_memo WHERE id = #{id}
</select>
</mapper>
์์ฑ | ์ค๋ช |
---|---|
namespace | Mapper ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐ (ํจํค์ง๋ช ํฌํจ) |
id | ์ธํฐํ์ด์ค ๋ฉ์๋๋ช ๊ณผ ๋งคํ |
parameterType | ์ ๋ฌ ํ๋ผ๋ฏธํฐ ํ์
(๊ธฐ๋ณธํ: int , ์ฐธ์กฐํ: ์ ์ฒด ๊ฒฝ๋ก) |
resultType | ๋ฐํ ํ์ (DTO ํด๋์ค ์ ์ฒด ๊ฒฝ๋ก or Map ๋ฑ) |
โ ๏ธ ์ฃผ์:
parameterType
,resultType
์ ์ ํํ ๊ฒฝ๋ก์ ํ์ ์ ์ง์ ํด์ผ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
<insert id="insertXml" parameterType="MemoDto">
<selectKey keyProperty="id" order="AFTER" resultType="int">
SELECT MAX(id) + 1 FROM tbl_memo
</selectKey>
INSERT INTO tbl_memo (id, text) VALUES (#{id}, #{text})
</insert>
selectKey
๋ฅผ ํ์ฉํ์ฌ ์ปค์คํ
ํค ์์ฑ.useGeneratedKeys="true"
์ต์
์ฌ์ฉ.๐ก ํค ์์ฑ ์ ๋ต์ ๋ค์ ํธ์์ ๋ ์์ธํ ๋ค๋ฃน๋๋ค!
<select id="selectDynamic" parameterType="Map" resultType="MemoDto">
SELECT * FROM tbl_memo
<where>
<if test="text != null">
AND text = #{text}
</if>
<if test="writer != null">
AND writer = #{writer}
</if>
</where>
</select>
โ ํ๊ทธ ์๋ ์ฒ๋ฆฌ
<sql id="memoColumns">
id, text, writer, createAt
</sql>
<select id="selectWithColumns" resultType="MemoDto">
SELECT <include refid="memoColumns"/> FROM tbl_memo
</select>
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:/mappers/*.xml")
);
namespace
โ Mapper ์ธํฐํ์ด์ค ๊ฒฝ๋ก์ ์ผ์นid
์์ฑ๊ฐ๊ณผ ์ผ์น์์:
public interface MemoMapper {
int insertXml(MemoDto dto); // โ XML์ id="insertXml"
}
@Test
void testInsertXml() {
MemoDto dto = new MemoDto(null, "XML Insert Test", "user@domain.com", LocalDateTime.now(), null);
int result = memoMapper.insertXml(dto);
assertEquals(1, result);
}
setMapperLocations
์ค์ ๋๋ฝ"Parameter 'id' not found"
@Param
์ฌ์ฉ