Develope/DataBase

[Mybatis/MariaDB] foreach 구문을 이용해서 Insert 대량 삽입하기

고로이 2017. 11. 10. 14:29
반응형

이 키워드로 들어오는 분들이 많아서 추가글 링크도 남긴다.


foreach 처음 사용해봣을때의 글이니 어색하다..




추가작업내용 : 


[MyBatis] 동적 쿼리문 만들기 (List<Map<>> insert, foreach)

https://vivi-world.tistory.com/50



[MyBatis] 객체 (VO, DTO) 안의 리스트를 사용해서 인서트 작업하기

https://vivi-world.tistory.com/40








* 결론


<insert id="insertResultAll" parameterType="java.util.List">
INSERT INTO collect_data_result (
collect_date, collect_time, table_name, target_table, building_id
, flag, type, execute_time, count, remark
)
VALUES
<foreach collection="list" item="item" separator=" , " >
("${item.collect_date}", "${item.collect_time}", "${item.table_name}", "${item.target_table}", "${item.building_id}"
, "${item.flag}", "${item.type}", "${item.execute_time}", "${item.count}", "${item.remark}")
</foreach>
</insert>





그런 느낌이군


for (Object  item : List){

(values)

}



글쓰기 귀찮당


예전 블로그 발췌

--------------------------------------------------





마이바티스의 배치는 


for (int i = 0; i < logList.size(); i++) {

id = session.insert("SqlMap.insert", logList.get(i));
if (i % 10000 == 0) {
session.commit();
System.out.println((i / 10000) + " batch finish");
}

}

이딴식으로 하면 소용이 없다고 한다.


for (int i = 0; i < logList.size() / 10000; i++) {

id = session.insert("SqlMap.insertAll", logList.subList(i * 10000, (i + 1) * 10000));

session.commit();
System.out.println((i / 10000) + " batch finish");

}



일단 요딴식으로 바꿔주긴 햇는데




org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. 


이러한 에러가 난ㄴ다


http://m.it610.com/article/1618936.htm


내가 설마 중국사이트까지 뒤져보게 될 줄이야
<insert id="insertAll" parameterType="java.util.List">
INSERT INTO log (date, server, command, message, diff_time) VALUES
<foreach collection="list" item="item" separator=" , " >
(${item.date}, ${item.server}, ${item.command},
${item.message}, ${item.diff_time})
</foreach>
</insert>

# -> $로 바꾸어주었다.

근데이게 이제 파라매터는 제대로 표시되는데

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '03:23:57, snn-03-01, pam_unix(su-l:session),
session opened for user ambari-q' at line 3


이런 에러가 난다
미치겟군

sql문이 잘못된거라고 하는데


<insert id="insertAll" parameterType="java.util.List">
INSERT INTO log (date, server, command, message, diff_time, close_time) VALUES
<foreach collection="list" item="item" separator=" , " >
("${item.date}", "${item.server}", "${item.command}",
"${item.message}", ${item.diff_time}, "${item.close_time}")
</foreach>
</insert>


큰따움표로 묶어줬더니 잘 된다..ㅎㅎ.....
#으로 하면 SQL DB 실행 시에 데이터로 바인딩하고
$으로 하면 SQL 쿼리문 로드시에 데이터를 바인딩한다


사실 #으로 해도 잘되야하는데 나는 왜저런지 모르겟다.




 

배치시간은 무려 6.74초

20배나 빨라졋다;;






하지만 저렇게 한번에 넣지 않는 이유는
하나라도 잘못넣으면 만건이 다 취소되기 떄문.......

리스크 졸라 크구염...

그래서 validation 해줘야 한다 잘


반응형