IT/WEB

[JAVA] Mybatis insert foreach(foreach로 마이바티스 대량 insert 구현)

오달달씨 2022. 5. 17. 14:06
728x90
반응형

엑셀파일을 읽어서 단건으로 주소록을 입력하는 로직이 있었다.

 

해당 로직은 100건 ~ 1000건 정도의 주소록을 입력할 때는 크게 인서트 속도에 문제되지 않았으나

 

5000건에서 1만건이 넘어가는 엑셀파일을 읽고 인서트하는 과정에서 속도 이슈가 발생하였다.

 

속도 이슈를 해결하고자 단건으로 인서트 하고 있는 SQL문을 foreach로 변경하였다.

 

변경 전

XML
<insert id="insertAddress" parameterType="address">
INSERT INTO Address (
address_id, group_id, user_name, min, email, 
company, department, position, phone_company, phone_dep,
phone_dep_pre, fax, home_post_no, home_addr_a, home_addr_b,
company_post_no, company_addr_a, company_addr_b, birth, birth_kind,
anniversary, anniversary_kind, homepage, email_more_a, email_more_b, 
min_more, memo, ctime, inter_code, user_id
) VALUES (
#{address_id}, #{group_id}, #{user_name}, #{min}, #{email},
#{company}, #{department}, #{position}, #{phone_company}, #{phone_dep},
#{phone_dep_pre}, #{fax}, #{home_post_no}, #{home_addr_a}, #{home_addr_b},
#{company_post_no}, #{company_addr_a}, #{company_addr_b}, #{birth}, #{birth_kind},
#{anniversary}, #{anniversary_kind}, #{homepage}, #{email_more_a}, #{email_more_b},
#{min_more}, #{memo}, TO_CHAR(SYSDATE, 'YYYYMMDDHHMISS'), #{inter_code}, #{user_id}
)
</insert>

 

변경 후

XML
<insert id="insertAddressExcel" parameterType="java.util.List">
INSERT INTO Address (
address_id, group_id, user_name, min, email, 
company, department, position, phone_company, phone_dep,
phone_dep_pre, fax, home_post_no, home_addr_a, home_addr_b,
company_post_no, company_addr_a, company_addr_b, birth, birth_kind,
anniversary, anniversary_kind, homepage, email_more_a, email_more_b, 
min_more, memo, ctime, inter_code, user_id
) VALUES 
<foreach collection="list" item="item" separator=" , " >
        (
        "${item.address_id}", "${item.group_id}", "${item.user_name}", "${item.min}", "${item.email}", 
        "${item.company}", "${item.department}", "${item.position}", "${item.phone_company}", "${item.phone_dep}",
"${item.phone_dep_pre}", "${item.fax}", "${item.home_post_no}", "${item.home_addr_a}", "${item.home_addr_b}",
"${item.company_post_no}", "${item.company_addr_a}", "${item.company_addr_b}", "${item.birth}", "${item.birth_kind}",
"${item.anniversary}", "${item.anniversary_kind}", "${item.homepage}", "${item.email_more_a}", "${item.email_more_b}",
"${item.min_more}", "${item.memo}", TO_CHAR(SYSDATE, 'YYYYMMDDHHMISS'), "${item.inter_code}", "${item.user_id}" 
        )
</foreach>
</insert>
반응형
<<<변경전>>>
public int insertAddress(Address param);

addressDao.insertAddress(addr);
<<<변경후>>>
public int insertAddressExcel(List<Address> param);

List addrList = new ArrayList();

addrList.add(addr);
addressDao.insertAddressExcel(addrList);
728x90
반응형