import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.*; import org.springframework.jdbc.support.JdbcUtils; import org.springframework.jdbc.support.KeyHolder; import java.sql.*; import java.util.List; public class CustomerJdbcTemplate extends JdbcTemplate { public int[] batchUpdate(final String sql,final BatchPreparedStatementSetter pss, final KeyHolder generatedKeyHolder) throws DataAccessException { return (int[]) execute( new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { return conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); } }, new PreparedStatementCallback() { public Object doInPreparedStatement(PreparedStatement ps) throws SQLException { if (logger.isDebugEnabled()) logger.debug("Executing batch SQL update and returning " + "generated keys [" + sql + "]"); try { int batchSize = pss.getBatchSize(); int totalRowsAffected = 0; int[] rowsAffected = new int[batchSize]; List generatedKeys = generatedKeyHolder.getKeyList(); generatedKeys.clear(); ResultSet keys = null; for (int i = 0; i < batchSize; i++) { pss.setValues(ps, i); rowsAffected[i] = ps.executeUpdate(); totalRowsAffected += rowsAffected[i]; try { keys = ps.getGeneratedKeys(); if (keys != null) { RowMapper rowMapper = new ColumnMapRowMapper(); RowMapperResultSetExtractor rse = new RowMapperResultSetExtractor(rowMapper, 1); generatedKeys.addAll((List) rse.extractData(keys)); } } finally { JdbcUtils.closeResultSet(keys); } } if (logger.isDebugEnabled()) logger.debug("SQL batch update affected " + totalRowsAffected + " rows and returned " + generatedKeys.size() + " keys"); return rowsAffected; } finally { if (pss instanceof ParameterDisposer) ((ParameterDisposer) pss).cleanupParameters(); } } }); } }
final List<User> users = new ArrayList(); for (int i = 0; i < 10; i++) { User user = new User(); user.setName("name"+1L); user.setAge(i) users.add(user); } String sql = "insert into user(name,age) values(?,?)"; GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder(); customerJdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { User user = users.get(i); ps.setString(1, user.getName()); ps.setInt(2, user.getAge()); } @Override public int getBatchSize() { return users.size(); } }, generatedKeyHolder); List<Map<String, Object>> objectMap = generatedKeyHolder.getKeyList(); for(Map<String, Object> map : objectMap){ System.out.println(map.get("GENERATED_KEY")); }