mybatis insert/update ์ฟผ๋ฆฌ์คํํ ๊ฒฐ๊ณผ ๊ฐ์ ธ์ค๊ธฐ
Select
๋ฌธ์ด ์๋ ๋ค๋ฅธ SQL Query
(insert, update ๋ฑ) ๋ฅผ ์คํํ๊ณ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผํ๋ ์ํฉ์ด ์๊ธด๋ค. ์ ํํ ์ ์ํ๋์๋์ ๋ํ ํ์ธ. ์ด๋ป๊ฒ ์ฟผ๋ฆฌ๊ฐ ์ ์ํ๋์๋๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
โป ์ฐธ๊ณ url : http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html
useGeneratedKeys, keyProperty ์ต์
์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋์์ฑํค๋ฅผ ์ง์ํ๋ค๋ฉด(mySql ๊ฐ์) ํด๋น์ต์ ์ ์ด์ฉํด ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด ๋ฐ์์ ์๋ค. ์๋ก๋ค์ด ํ๋ผ๋ฏธํฐ๋ก ์๋ ๋ชจ๋ธ๊ฐ์ฒด๋ฅผ ๋๊ธด๋ค๊ณ ๊ฐ์ ํ๊ณ
public Student {
int id;
String name;
String email;
Date regist_date;
}
์๋ mybatis ๊ตฌ๋ฌธ์ผ๋ก insert๋ฅผ ์๋ํ๊ฒ๋๋ฉด, ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด Student ๊ฐ์ฒด์ id๊ฐ์ insert ํ์๋์ key๊ฐ(id)์ด ๋ค์ด์ค๊ฒ ๋๋ค.
Student student = new Student();
student.setName('bla');
student.setEmail('bla@naver.com');
mapper.insertStudents(student); // ์ฟผ๋ฆฌ์คํ
student.getId(); // ์ถ์ถ ๊ฐ๋ฅ
<insert id="insertStudents" useGeneratedKeys="true" keyProperty="id" parameterType="Student">
insert into Students ( name, email )
values ( #{name}, #{email} )
</insert>
selectKey ์ต์
Oracle ๊ฐ์ ๊ฒฝ์ฐ๋ Auto Increment ๊ฐ ์๊ณ Sequence๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๊ธฐ ๋๋ฌธ์ ์ ์ต์ ์ ์ฌ์ฉํ ์๊ฐ ์๋ค. ํ์ง๋ง ๋ค๋ฅธ ์ฐํ์ ์ธ(?) ๋ฐฉ๋ฒ์ผ๋ก ์์๊ฐ์ ํจ๊ณผ๋ฅผ ๋ณผ์๊ฐ ์๋ค. ํ๋ผ๋ฏธํฐ์ ๋ชจ๋ธ์ด๋ java๊ตฌ๋ฌธ์ ์์ ๋์ผํ๊ณ xml ์ฟผ๋ฆฌ ๋ถ๋ถ๋ง ์๋์ ๊ฐ์ด ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
<insert id="insertStudents" parameterType="Student">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select SEQ_ID.nexyval FROM DUAL
</selectKey>
insert into Students
(id, name , email)
values
(#{id}, #{name}, #{email})
</insert>
์์๊ฐ์ ์ฝ๋์์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๊ธฐ ์ ์ id๊ฐ์ Sequence์ ์ํด ๊ฐ์ ์ ํ ํ๊ฒ ๋๊ณ , ์๋์ ์ผ๋ก ํด๋น ๊ฐ์ Student์ id์ setํ๊ฒ ๋์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ์๊ฐ ์๋ค.
ํญ์ ํ
์ด๋ธ์ key๊ฐ์๋ง ํด๋นํ๋๊ฒ์ด ์๋๋ค. key๊ฐ๊ณผ๋ ์ ํ ์๊ด์๋ ๊ฐ๋ selectKey
๊ตฌ๋ฌธ์ผ๋ก ๋ฆฌํดํ ์๊ฐ ์๋๋ฐ order
์ต์
์ AFTER
๋ก ์ฃผ๊ณ ๋ฆฌํดํ๊ณ ์ ํ๋ ๊ฐ์ ๋ช
์ํด์ฃผ๋ฉด ๋๋ค.
์๋ ์ฝ๋์์๋ ์
๋ ฅํ ์ id๊ฐ์ Sequence์์ ๊ฐ์ ธ์ค๋๊ฒ ์๋๋ผ ์๋์ผ๋ก ๋ฃ์ด์ฃผ๊ณ , ์
๋ ฅํ๋ id์ ๋ง๋ regist_date ๊ฐ์ ๋ฆฌํด๋ฐ์ ์์์์ฒ๋ผ ๋์ผํ๊ฒ ๊ฐ๋ฅผ ๊ฐ์ ธ์ฌ์ ์๋ค.
<insert id="insertStudents" parameterType="Student">
<selectKey keyProperty="regist_date" resultType="java.util.Date" order="AFTER">
select regist_date FROM students WHERE id = #{id}
</selectKey>
insert into Students
(id, name , email, regist_date)
values
(#{id}, #{name}, #{email}, syadate)
</insert>