이전 블로그 에서 jdbcTemplate 을 이용해 bulk insert 를 다뤘다.
관련된 개념들과 다른 블로그에서 알게 된 내용들을 추가적으로 작성해보려고 한다.
String query1 = "insert into temp1() values (?,?,?);
String query2 = "insert into temp2() values(?,?,(select LAST_INSERT_ID()));
String sql = query1+query2;
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, ~~~);
}
@Override
public int getBatchSize() { return query1.size(); }
}
public void batchInsert(List<data> datas) {
String sql = "insert into table(" +
"column1, " +
"column2, " +
"column3" +
") values (:column1, :column2, :column3)";
SqlParameterSource[] sqlParameterSources = SqlParameterSourceUtils.createBatch(datas);
namedParameterJdbcTemplate.batchUpdate(sql, sqlParameterSources);
}
createBatch
, batchUpdate
를 이용해 모든 파라미터 값을 리스트로 한 번에 전달할 수 있다.
프레임워크 내부에서 BatchPreparedStatementSetter
를 사용해서 리스트 값을 반복 처리한다.
named 파라미터를 사용한다면 SqlParameterSource
의 배열을 제공해야 하며, 엔트리 하나가 배치의 한 사이클을 처리한다. SqlParameterSource
배열은 간편하게 SqlParameterSourceUtils.createBatch
메소드로 만들 수 있고 Map
에 담긴 파라미터나 List
에 담긴 파라미터를 전달할 수 있다.
insert into test values ('mary'),('jane'),('lisa');
select LAST_INSERT_ID(); => 1