在之前的工作中遇到了需要执行多次SQL的语句,所以查询了一下JdbcTemplate的batchUpdate方法的使用方法。
batchUpdate(String,BatchPreparedStatementSetter方法主要是插入,更新时使用。该方法中的BatchPreparedStatementSetter类需要重写setValues方法(执行一条语句时,进行参数的插入),getBatchSize方法(获取需要插入的数组)
List<Object> o = new ArrayList<Object>();
int[] i = jdbcTemplate.batchUpdate(sql,new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException{
Teacher t = teachers.get(i);
ps.setLong(1, t.getId());
}
@Override
public int getBatchSize() {
return teachers.size();
}
});
源码分析:
由于本人比较菜鸡,有一些点分析的不到位,请见谅,欢迎指出。
@Override
public int[] batchUpdate(String sql, final BatchPreparedStatementSetter pss) throws DataAccessException {
//判断是否为Debug模式
if (logger.isDebugEnabled()) {
//输出SQL语句
logger.debug("Executing SQL batch update [" + sql + "]");
}
//->为JDk8的新特性,Lambda表达式。执行sql语句。
int[] result = execute(sql, (PreparedStatementCallback<int[]>) ps -> {
try {
//获取参数数组大小
int batchSize = pss.getBatchSize();
InterruptibleBatchPreparedStatementSetter ipss =
(pss instanceof InterruptibleBatchPreparedStatementSetter ?
(InterruptibleBatchPreparedStatementSetter) pss : null);
//确定Jdbc的驱动是否支持批处理
if (JdbcUtils.supportsBatchUpdates(ps.getConnection())) {
for (int i = 0; i < batchSize; i++) {
pss.setValues(ps, i);
//isBatchExhausted方法判断批处理是否完成
if (ipss != null && ipss.isBatchExhausted(i)) {
break;
}
//向PreparedStatementCallback类中添加执行代码
ps.addBatch();
}
//执行插入代码代码
return ps.executeBatch();
}
else {
//若是驱动不支持,则设置一个Integer列表,用于返回参数
List<Integer> rowsAffected = new ArrayList<>();
for (int i = 0; i < batchSize; i++) {
pss.setValues(ps, i);
if (ipss != null && ipss.isBatchExhausted(i)) {
break;
}
//执行更新后,向列表中添加放回值
rowsAffected.add(ps.executeUpdate());
}
//将列表转为数组??,有点意思。不用toArray方法
int[] rowsAffectedArray = new int[rowsAffected.size()];
for (int i = 0; i < rowsAffectedArray.length; i++) {
rowsAffectedArray[i] = rowsAffected.get(i);
}
//返回值
return rowsAffectedArray;
}
}
finally {
if (pss instanceof ParameterDisposer) {
((ParameterDisposer) pss).cleanupParameters();
}
}
});
Assert.state(result != null, "No result array");
return result;
}
其他的batch方法类似,就不一一举例。
本文探讨了在Java开发中如何使用JdbcTemplate的batchUpdate方法进行批量数据库操作,特别是批处理插入和更新。重点讲解了BatchPreparedStatementSetter接口的setValues和getBatchSize方法的用法,并对源码进行了简单分析。虽然分析可能存在不足,但提供了理解JdbcTemplate批量操作的基本思路。

3155

被折叠的 条评论
为什么被折叠?



