ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL, MyBatis foreach문으로 여러건의 데이터 처리 (List)
    study/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">
            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로 설정해야 한다.


    반응형

    'study > DB' 카테고리의 다른 글

    SQLP 준비  (0) 2022.12.31
    SQL 쿼리문에서 WHERE 1=1을 사용하는 이유  (0) 2020.12.24
    DB 쿼리 명령어 공부 1  (0) 2020.12.02
    SQL injection  (0) 2020.09.25

    댓글

Designed by Tistory.