2025-04-25
λ°μ΄ν°λ² μ΄μ€μμλ κ° λ μ½λλ₯Ό μλ³νκΈ° μν΄ κΈ°λ³Έ ν€(Primary Key) κ° νμν©λλ€.
MyBatisμμλ INSERT μ μλ λλ μλμΌλ‘ ν€λ₯Ό μμ±νμ¬ κ°μ²΄μ μ£Όμ ν μ μλλ‘ λ€μν μ λ΅μ μ 곡ν©λλ€.
λ°©μ | μ€λͺ |
---|---|
AUTO_INCREMENT | DBκ° μλμΌλ‘ ν€ κ°μ μμ± |
Sequence | Oracle λ±μμ μνμ€λ₯Ό μ΄μ©ν ν€ μμ± |
μλ μμ± | κ°λ°μκ° μ§μ λ‘μ§μΌλ‘ ν€ κ°μ μμ± |
π‘ Tip
λ°μ΄ν°λ² μ΄μ€κ° μ 곡νλ μλ μμ± κΈ°λ₯μ μ°μ νμ©νλ κ²μ΄ κ°μ₯ μμ ν©λλ€.
@Insert("INSERT INTO tbl_memo (text) VALUES (#{text})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(MemoDto dto);
<insert id="insertXml" useGeneratedKeys="true" keyProperty="id">
INSERT INTO tbl_memo (text) VALUES (#{text})
</insert>
β μ€λͺ
useGeneratedKeys = true
: DBμ AUTO_INCREMENT κΈ°λ₯ μ¬μ©.keyProperty
: μμ±λ ν€κ° μ£Όμ
λ DTOμ νλλͺ
.β οΈ μ£Όμ:
useGeneratedKeys
λ MySQL, MariaDB λ± AUTO_INCREMENTλ₯Ό μ§μνλ DBμμλ§ λμν©λλ€.
DBκ° μλμΌλ‘ ν€λ₯Ό μμ±νμ§ μλ κ²½μ°, κ°λ°μκ° μ§μ ν€ μμ± λ‘μ§μ μ μν μ μμ΅λλ€.
@SelectKey(statement = "SELECT MAX(id) + 1 FROM tbl_memo", keyProperty = "id", before = false, resultType = int.class)
@Insert("INSERT INTO tbl_memo (id, text) VALUES (#{id}, #{text})")
int insert(MemoDto dto);
μμ± | μ€λͺ |
---|---|
statement | ν€ μμ± SQL |
keyProperty | DTOμ μ£Όμ ν νλλͺ |
before | true : INSERT μ΄μ μ€νfalse : μ΄ν μ€ν |
resultType | λ°ν νμ |
π‘ μ€μ κ°μ΄λ
- μνμ€ μ¬μ© μ β
before = true
- MAX(id) + 1 λ°©μ β
before = false
<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>
<insert id="insertXml" parameterType="MemoDto">
<selectKey keyProperty="id" order="BEFORE" resultType="int">
SELECT sequence_name.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO tbl_memo (id, text) VALUES (#{id}, #{text})
</insert>
β οΈ Oracle λ± μνμ€λ₯Ό μ¬μ©νλ DBλ λ°λμ order="BEFORE"λ‘ μ€μ ν΄μΌ ν©λλ€.
κ΅¬λΆ | useGeneratedKeys | @SelectKey / |
---|---|---|
λμ DB | MySQL, MariaDB | Oracle, 컀μ€ν λ‘μ§ |
μλ μμ± μ§μ | O | X |
볡μ‘ν λ‘μ§ | X | O |
λμμ± μμ μ± | O | μ£Όμ νμ |
μ€μ λμ΄λ | μ¬μ | SQL μμ± λ° μ€μ νμ |
π‘ Tip
λ¨μ μλ μμ±μ
useGeneratedKeys
,볡μ‘ν ν€ μμ± λ‘μ§μ΄λ μνμ€κ° νμν κ²½μ°
selectKey
λ₯Ό μ¬μ©ν©λλ€.
@Test
void testInsertWithKey() {
MemoDto dto = new MemoDto(null, "Key Test", "user@domain.com", LocalDateTime.now(), null);
int result = memoMapper.insertXml(dto);
System.out.println("Generated ID: " + dto.getId());
assertEquals(1, result);
assertNotNull(dto.getId());
}
βοΈ μΆλ ₯ μμ
Generated ID: 1050
keyProperty
μ€μ μ΄ μμΌλ©΄ DTOμ κ°μ΄ μ£Όμ
λμ§ μμ.SELECT MAX(id) + 1
λ°©μ μ¬μ© μ λμμ± λ¬Έμ λ°μ κ°λ₯.useGeneratedKeys
μ€μ μ λΉΌλ¨Ήμμ λ λ°μνλ μ€λ₯.BEFORE
, 컀μ€ν
λ‘μ§μ λ³΄ν΅ AFTER
μ¬μ©.