-
MySQL, MyBatis foreach문으로 여러건의 데이터 처리 (List)DB 2022. 4. 5. 20:01반응형
개발을 하다보면 여러 건의 데이터를 한번에 넣어줘야 하는 경우가 있다.
이 때 아래처럼 그냥 서버에서 트랜잭션을 걸고 반복문을 돌려서 처리하는 방법으로 할 수도 있지만,
@Transactional public int insertSometing(List<?> list) { for (Object obj : list) { mapper.insert(obj); } }
반복을 많이 하게 될 수록 DB와 연결하는 데에 자원과 시간을 많이 쓰게 된다.
또한 Transaction, Index 도 반복하는 수가 많을수록 성능이 나빠지는 원인이다.
따라서 DBMS에서는 솔루션을 제공하는데 그게 BULK INSERT 이다.
INSERT INTO your_table VALUES (1,2); INSERT INTO your_table VALUES (3,4); INSERT INTO your_table VALUES (5,6); INSERT INTO your_table VALUES (val1,val2);
예를 들어 위처럼 여러번 실행하는 쿼리를 아래와 같이 사용할 수 있다.
INSERT INTO your_table VALUES (1,2), (3,4), (5,6), ..., (val1, val2);
하지만 매번 쿼리를 직접 날릴 수 없는데, MyBatis에서는 Batch insert를 제공한다.
<insert id="insert" parameterType="java.util.List"> INSERT INTO your_table ( VALUE_ONE , VALUE_TWO , VALUE_THREE ) VALUES <foreach collection="list" item="item" separator=","> ( #{item.valueOne} , #{item.valueTwo} , #{item.valueThree} ) </foreach> </insert>
(MySQL 기준)
이런 식으로 parameterType으로 List 자체를 받은 후 collection="list"로 부여해준다.
item은 말 그대로 list안에 들어있는 각각의 item이라고 생각하면 된다.
sepatator는 foreach문이 반복될때의 구분자이다.
위에서는 (#{item.valueOne}, #{item.valueTwo}, #{item.valueThree}) 부분이 foreach문으로 감싸져있는데 BULK INSERT 쿼리에서 봤던 것 처럼 해당 부분이 값만 바뀌면서 계속 추가된다고 보면 된다.
UPDATE도 아래와 같은 형식으로 작성해주면 된다.
<update id="update" parameterType="java.util.List"> <foreach collection="list" item="item" separator=";"> UPDATE your_table SET VALUE_ONE = #{item.valueOne} , VALUE_TWO = #{item.valueTwo} , VALUE_THREE = #{item.valueThree} WHERE USER_ID = #{userId} </foreach> </update>
jdbc:mysql://localhost:3306/test?allowMultiQueries=true
※ Mybatis에서 다중 쿼리를 사용하려면 jdbc 옵션에서 위처럼 allowMultiQueries 옵션을 true로 설정해야 한다.
반응형'DB' 카테고리의 다른 글
SQL 쿼리문에서 WHERE 1=1을 사용하는 이유 (0) 2020.12.24 DB 쿼리 명령어 공부 1 (0) 2020.12.02 SQL injection (0) 2020.09.25