Spring/Skill

[MyBatis] upsert (insert + update) mapper 작성법

31daylee 2024. 3. 18. 14:16
728x90

📌 Upsert 란? 


Upsert는 insert와 update , 삽입과 변경을 동시에 하는 것을 지칭하는 말이다. 

MyBatis에서 upsert를 하기 위해서는 <insert> 문으로 작성을 해야하며, 일정 규칙을 따라야 한다.

 

  • <insert>를 사용한다.
  • INSERT INTO 테이블명 ( ) 의 괄호문에 컬럼명을 꼭 기재해야 한다.
  • ON DUPLICATE KEY UPDATE 라는 문법통해 Update(수정) 진행한다.
  • ON DUPLICATE KEY UPDATE 문을 사용하기 위해서 PK(Primary Key) 가 반드시 존재해야 한다.
  • PK, Uniq 의 값을 기준으로 insert 혹은 update문이 진행되는 구조라 모든 컬럼명이 존재해야 한다.

 

 

 

📌 Upsert  작성법


MyBatis에서 Upsert 작성하기 

<insert id="사용아이디" parameterType="타입">
		INSERT INTO 테이블명
			(PK컬럼1
			, 컬럼2
			, 컬럼3
			)
		VALUES
			(#{PK값}
			,#{컬럼2값}
			,#{컬럼3값}
			)
		ON DUPLICATE KEY UPDATE  
			컬럼2 = VALUES(컬럼2값)
			,컬럼3 = VALUES(컬럼3값)
</insert>

ON DUPLICATE KEY UPDATE 이후 PK관련 컬럼과 값은 존재하지 않는다. 

PK의 여부(혹은 Uniq)에 따라 존재하면 Update의 구문이 실행되며, 존재하지 않는 경우에는 생성 쿼리문을 실행하게 된다. 

 

 

 

관련 샘플 코드 

<insert id="upsertUser" parameterType="map">
		INSERT INTO USER
			(user_id
			, user_num
			, user_name
			, user_engname
			, email_1
			)
		VALUES
			(#{user_id}
			,#{user_num}
			,#{user_name}
			,#{user_engname}
			,#{email_1}
			)
		ON DUPLICATE KEY UPDATE 
			user_name = VALUES(user_name)
			,user_engname = VALUES(user_engname)
			,email_1 = VALUES(email_1)
</insert>

 

 

 

 

 

 

 

 

 

 

 

 

<참고자료>

https://velog.io/@zzarbttoo/MybatisON-DUPLICATE-KEY-UPDATE%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-UPSERT-%ED%95%B4%EB%B3%B4%EA%B8%B0UPDATE-INSERT

 

[Mybatis]ON DUPLICATE KEY UPDATE를 이용해 UPSERT 해보기(UPDATE + INSERT)

회사 업무를 할 때 mybatis 를 이용해 쿼리를 다뤘었다 그 때 테이블을 주기적으로 update + insert 할 일이 있었다! 맨 처음에는 table을 전체 drop 하고 다시 데이터를 insert 하는 방법을 생각했으나 드롭

velog.io

 

728x90