본문 바로가기

Java/Spring

mybatis 다중 insert

INSERT INTO

테이블명

(컬럼1, 컬럼2, 컬럼3)

VALUES

(?, ?, ?),

(?, ?, ?),

...

와 같은 방식의 INSERT. 


1
2
3
4
5
6
7
8
9
@Transactional
@Override
public void insert(List<FileVO> filelist) {
        
    if(filelist != null || filelist.size() != 0) {
        for(FileVO file : filelist) {
            mapper.uploadFiles(file);
    }
}
cs


위와 같이 리스트를 순회하면서 단일객체마다 반복해 insert 처리해도 되지만

아래와 같이 XML에서 foreach 구문으로 쿼리 한번에 처리할 수도 있다. 


1
2
3
4
5
6
7
8
9
<insert id="insert" parameterType="java.util.List">
    INSERT INTO
        files
        (id, filename, realname)
    VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.id}, #{item.filename}, #{item.realname})
    </foreach>
</insert>
cs


속도 면에서 훨씬 우월하고, update 시에는 separator를 컴마 대신 세미콜론으로 변경해 사용할 수 있다.

update 시 커넥션 부분에 allowMultiQueries=true 옵션을 추가해야 한다.


<update id="update" parameterType="java.util.List">
    <foreach collection="list" item="item" separator=";">
    UPDATE 
        files
    SET
        id = #{item.id},
        filename = #{item.filename}
        realname = #{item.realname}
    WHERE
        id = #{item.id}
    </foreach>
</update>
 
cs