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 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