JdbcTemplate batch update example 2016-03-28 01:28
JdbcTemplate provide many batch update functions. When you want update or insert many records you can use batchUpdate. It is more elegant and faster than update(insert) records one by one. In this blog we will show you how to use batchUpdate in JdbcTemplate.
Init database
CREATE TABLE public.tb_user
(
id SERIAL PRIMARY KEY NOT NULL,
username VARCHAR(20) NOT NULL,
comment VARCHAR(500)
);
Entity code
public class User {
private int id;
private String username;
private String comment;
//getter and setter
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", comment='" + comment + '\'' +
'}';
}
}
batchUpdate functions
batchUpdate(String... sql)
public String batchUpdateMultipleSQL() { int[] affects = jdbcTemplate.batchUpdate( "INSERT INTO tb_user (username,comment) VALUES ('username_batch1','comment_batch1')", "INSERT INTO tb_user (username,comment) VALUES ('username_batch2','comment_batch2')"); return "Batch update affect rows: " + Arrays.toString(affects); }
batchUpdate(String sql, BatchPreparedStatementSetter pss)
public String batchUpdateBatchPreparedStatementSetter() { final List<User> userList = new ArrayList<User>(); User user1 = new User("username_batch1", "comment_batch1"); User user2 = new User("username_batch2", "comment_batch2"); User user3 = new User("username_batch3", "comment_batch3"); userList.add(user1); userList.add(user2); userList.add(user3); int[] affects = jdbcTemplate.batchUpdate( "INSERT INTO tb_user (username,comment) VALUES (?,?)", new BatchPreparedStatementSetter() { public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setString(1, userList.get(i).getUsername()); ps.setString(2, userList.get(i).getComment()); } public int getBatchSize() { return userList.size(); } }); return "Batch update affect rows: " + Arrays.toString(affects); }
batchUpdate(String sql, Collection batchArgs, int batchSize, ParameterizedPreparedStatementSetter pss)
public String batchUpdateParameterizedPreparedStatementSetter() { List<User> userList = new ArrayList<User>(); userList.add(new User("username_batch1", "comment_batch1")); userList.add(new User("username_batch2", "comment_batch2")); userList.add(new User("username_batch3", "comment_batch3")); int[][] affects = jdbcTemplate.batchUpdate("INSERT INTO tb_user (username,comment) VALUES (?,?)", userList, userList.size(), new ParameterizedPreparedStatementSetter<User>() { public void setValues(PreparedStatement ps, User user) throws SQLException { ps.setString(1, user.getUsername()); ps.setString(2, user.getComment()); } }); return "Batch update affect rows: " + Arrays.deepToString(affects); }
I found this
batchUpdatefunction return int[][] instead of int[]. After viewing source I got the answer. If you are interested, click here.batchUpdate(String sql, List batchArgs)
public String batchUpdateObjectList() { List<Object[]> parametersList = new ArrayList<Object[]>(); parametersList.add(new Object[]{"username_batch1", "comment_batch1"}); parametersList.add(new Object[]{"username_batch2", "comment_batch2"}); parametersList.add(new Object[]{"username_batch3", "comment_batch3"}); int[] affects = jdbcTemplate.batchUpdate("INSERT INTO tb_user (username,comment) VALUES (?,?)", parametersList); return "Batch update affect rows: " + Arrays.toString(affects); }
batchUpdate(String sql, List batchArgs, int[] argTypes)
public String batchUpdateWithArgType() { List<Object[]> parametersList = new ArrayList<Object[]>(); int[] argTypes = {Types.VARCHAR, Types.VARCHAR}; parametersList.add(new Object[]{"username_batch1", "comment_batch1"}); parametersList.add(new Object[]{"username_batch2", "comment_batch2"}); parametersList.add(new Object[]{"username_batch3", "comment_batch3"}); int[] affects = jdbcTemplate.batchUpdate("INSERT INTO tb_user (username,comment) VALUES (?,?)", parametersList, argTypes); return "Batch update affect rows: " + Arrays.toString(affects); }