Java/Spring

Mybatis foreach, selectkey, Auto Increment 구현

B.OCK 2024. 9. 2. 15:20
반응형

 Mybatis 를 사용하여 List 데이터를 Insert 하는 방법이다.

 

데이터는 아래와 같이 List 형 Map 을 사용했다.


[
    {role_id=O0100, right_name=기관관리자, site_code=101},
    {role_id=S9900, right_name=시스템관리자, site_code=101},
    {role_id=M0100, right_name=통합운영관리자, site_code=101}
]

 

 

<insert id="rightInsert" parameterType="java.util.List">
    <selectKey resultType="int" keyProperty="right_seq" order="BEFORE">
        SELECT MAX(right_seq)+1 FROM m_right
    </selectKey>
    INSERT INTO m_right(right_seq, right_name, right_desc, site_code, role_id)
    VALUES
    <foreach collection="list" item="item" index="idx" separator=",">
        (
            #{right_seq} + #{idx}
            , #{item.right_name}
            , #{item.right_name}
            , #{item.site_code}
            , #{item.role_id}
        )
    </foreach>
</insert>

 


parameterType="java.util.List"

List 형태이기 때문에 "java.util.List" 로 설정했다.

만약 List 가 아닌 Map 형태이면 "java.util.HashMap" 으로 설정하면 된다.

 


<selectKey resultType="int" keyProperty="right_seq" order="BEFORE">
    SELECT MAX(right_seq)+1 FROM m_right
</selectKey>

테이블의 Primary Key(기본키) 인 right_seq 최대값을 구하여 +1 을 한 후 right_seq 라는 변수에 집어 넣는다.

여기서 order="BEFORE" 는 INSERT 문을 실행하기 전 selectKey 태그를 실행한다는 뜻이다.

 


<insert id="rightInsert" parameterType="java.util.List">
.......
<foreach collection="list" item="item" index="idx" separator=",">
....
</foreach>

insert 태그의 parameterType 형태에 따라 foreach 의 collection 이 달라진다.

본인은 List 형태이기 때문에 collection="list" 로 설정했다.

 

만약 parameterType 이 Model 객체일 경우 Model 내의 사용할 List 필드값을

collection 에 설정해주면 된다.

Model 내 List 필드명이 modelList 이기 때문에 foreach 의 collection="modelList" 로 된다.

// Model 데이터
@Data
public class ModelTest {
	String name;
    List<HashMap<String, Object>> modelList;
}

//
<insert id="modelTest" parameterType="ModelTest">
	...
    <foreach collection="modelList" item="item" index="idx" separator=",">
    	(
            #{right_seq} + #{idx}
            , #{item.right_name}
            , #{item.right_name}
            , #{item.site_code}
            , #{item.role_id}
        )
    </foreach>
</insert>

 

 

Auto Increment 구현

<selectKey> 를 사용해 테이블의 기본키 최대값 + 1 을 해 최대값을 구했고

<foreach> 의 index 항목과 더해서 Auto Increment 를 구현할 수 있다.

 

<insert id="rightInsert" parameterType="java.util.List">
    <selectKey resultType="int" keyProperty="right_seq" order="BEFORE">
        SELECT MAX(right_seq)+1 FROM m_right
    </selectKey>
    INSERT INTO m_right(right_seq, right_name, right_desc, site_code, role_id)
    VALUES
    <foreach collection="list" item="item" index="idx" separator=",">
        (
            #{right_seq} + #{idx}
            , #{item.right_name}
            , #{item.right_name}
            , #{item.site_code}
            , #{item.role_id}
        )
    </foreach>
</insert>

* #{right_seq} + #{idx} 사용

 

<foreach separator=",">
separator 는 괄호( #{right_seq} + #{idx} ... ) 다음으로 구분될 값을 설정한다.
예)
( #{right_seq} + #{idx} ... ),
( #{right_seq} + #{idx} ... ),
( #{right_seq} + #{idx} ... )

등...

 

 

 

 

 

요약

 

// parameterType="java.util.List" 일 경우 (List)
<foreach collection="list" item="item" separator=",">
...
</foreach>


// parameterType="ModelTest" 일 경우(Model 객체 사용)
// EX) List<HashMap<String, Object>> modelTest;
<foreach collection="modelTest" item="item" separator=",">
...
</foreach>


// parameterType="java.util.HashMap" (Map 형태)
// map.put("modelTest", modelList);
<foreach collection="modelTest" item="item" separator=",">
...
</foreach>

 

 

반응형