[mybatis] foreach를 이용한 다중 insert

2020. 9. 7. 12:15 JAVA/Java

mybatis에서 다중 insert를 해야 될 일이 생겼다. List 형태의 객체를 이용해서 insert를 해야 하는데 두가지 방법이 있다.

한가지는 단일 insert mapper를 구현하고 insert mapper를 List를 이용해 반복해서 insert한다.

또 다른 방법이 이제 부터 설명할 foreach를 이용한 다중 insert이다.

두가지 모두 예제를 통해서 설명해 보겠다.


1. UserDto 클래스

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
public class UserDto {
     
    private long seq;
    private String username;
    private int age;
     
    public long getSeq() {
        return seq;
    }
    public void setSeq(long seq) {
        this.seq = seq;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }   
}


UserDto 클래스를 아래와 같은 List로 만들고 Map 객체에 담았다고 가정하자.

1
2
3
4
5
6
7
8
9
10
11
UserDto dto1 = new UserDto();
dto1.setUsername("홍길동");
dto1.setAge(25);
UserDto dto2 = new UserDto();
dto2.setUsername("woniper");
dto2.setAge(26);
List<userdto> list = new ArrayList<userdto>();
list.add(dto1);
list.add(dto2);
Map<String, Object> map = HashMap<String, Object>();
map.put("list", list);

2. List형태의 객체를 반복해서 단일 insert 처리

1
2
3
4
5
6
7
8
9
10
11
12
public class UserMapper {
     
    @Autowired private SqlSession mapper;
     
    public void insetUser(Map<string, object=""> map) {
        List<userdto> list = (ArrayList<userdto>)map.get("list");
        for(UserDto dto : list) {
            mapper.insert("user.insert", dto);
        }
    }
}
</userdto></userdto></string,>
1
2
3
<insert id="insert" parametertype="com.woniper.UserDto">
      insert into user(username, age) values(#{username}, #{age})
</insert>

3. <foreach> 태그를 이용한 다중 insert

1
2
3
4
5
6
7
8
public class UserMapper {
     
    @Autowired private SqlSession mapper;
     
    public void insetUser(Map<string, object> map) {
        mapper.insert("user.insert", map);
    }
}
1
2
3
4
5
6
7
<insert id="insert" parametertype="java.util.Map">
        insert into user(username, age)
        values
        <foreach collection="list" item="item" separator=" , ">
            (#{item.username}, #{item.age})
        </foreach>
 </insert>


- <foreach> 태그 속성 설명

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

item : collection을 사용할 변수 명

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

출처 : https://blog.woniper.net/194?category=531455

'JAVA > Java' 카테고리의 다른 글

Collections 프레임워크  (0) 2021.03.19
JVM 아키텍처  (0) 2021.03.19
[Java] 문자열 비교 equals/equalsIgnoreCase/compareTo  (0) 2021.03.16
java isNumeric, isDigits, isNumber  (0) 2020.10.27
java inner class  (0) 2020.09.07
AbstractList.add(E)는 쓸 수 없어!  (0) 2020.09.07
naver 검색 API 예제  (0) 2020.09.07
java8 stream match  (0) 2020.09.07