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>