상세 컨텐츠

본문 제목

Mybatis, mysql 반복 쿼리 실행 (insert), foreach

Spring

by husks 2016. 8. 18. 15:20

본문

반응형


Mybatis로 개발하던 중 리스트성의 데이터를 입력하는 경우가 발생하였습니다.


java에서 반복문을 실행하려 하였으나 해당 방법을 이용하면 sqlSession 을 반복 사용하게 되어 속도가 저하 됩니다.


그래서 쿼리단에서 반복문(foreach)을 사용하여 입력하는 방식을 사용하였습니다.


데이터를 셋팅하는 부분은 임의로 만들어 냈으며 DAO 부분입니다. (java 부분)


mysql에서는 반복하여 입력할때 아래와 같은 방식으로 등록이 가능합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
insert into calculate_staff(
    company_id,
    name,
    contact,
    contact2,
    email,
    use_yn,
    register_user_id
)values
(
    123,
    '허균_0',
    '1230',
    '12340',
    '0husk@tistory.com',
    'Y',
    'husk'
),
(
    123,
    '허균_1',
    '1231',
    '12341',
    '1husk@tistory.com',
    'Y',
    'husk'
),
(
    123,
    '허균_2',
    '1232',
    '12342',
    '2husk@tistory.com',
    'Y',
    'husk'
)


위 샘플과 같은 방식으로 쿼리를 생성해 줄 것 입니다.


쿼리를 생성할때 Map안에 기본 값 및 list 형식을 섞어 넣은 예제 입니다.



java 소스 입니다. (DAO)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Override
public int regCalculateStaff() {
 
    Map<String, Object> paramMap = new HashMap<String, Object>();
 
    paramMap.put("company_id"123);
    paramMap.put("user_id""husk");
 
    Map<String, Object> staffMap;
 
    List<Map<String, Object>> staffList = new ArrayList<Map<String, Object>>();
 
    for(int i=0;i<3;i++){
 
        staffMap = new HashMap<String, Object>();
 
        staffMap.put("staff_name""허균_"+0);
        staffMap.put("staff_contact""123"+0);
        staffMap.put("staff_contact2""1234"+0);
        staffMap.put("staff_email"0+"husk@tistory.com");
        staffMap.put("staff_use_yn""Y");
 
        staffList.add(staffMap);
 
    }
 
    paramMap.put("staffList", staffList);
 
    return sqlSession.insert("insertCalculateStaff", paramMap);
}




xml 부분입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<insert id="insertCalculateStaff" parameterType="java.util.HashMap">
    <if test="staffList.size != 0">
        insert into calculate_staff(
            company_id,
            name,
            contact,
            contact2,
            email,
            use_yn,
            register_user_id
        )values
        <foreach collection="staffList" item="item" separator=",">
        (
            #{company_id},
            #{item.staff_name},
            #{item.staff_contact},
            #{item.staff_contact2},
            #{item.staff_email},
            #{item.staff_use_yn},
            #{user_id}
        )
        </foreach>
    </if>
</insert>



foreach에서 쓰인 collection 부분은 map의 키로 쓰인 부분을 적어주시면 됩니다.


[foreach]

collection : parameterType으로 넘어온 map안에 list (map에 key값)

item : collection을 사용할 변수 명

seperator : 반복 문자열을 구분 할 문자

반응형

관련글 더보기

댓글 영역