一.直接上源代码(以导入课表数据为例):
// 批量插入新申请(导入默认课表)
public boolean batchInsertNewApply(List<LabIfo> labIfos)
throws SQLException {
Connection conn = JdbcUtils.GetConnection();
PreparedStatement ps = null;
String sql = "insert into lab_ifo(labId,userId,week,day,lesson,applyReason) values(?,?,?,?,?,?)";
try {
//一般JDBC连接数据库之后,默认设置为“自动提交”,即每次SQL操作都commit. 如果需要手动提交,则必须将自动提交功能设置为false.
conn.setAutoCommit(false); //取消自动提交事务
ps = conn.prepareStatement(sql);
for (int i = 0; i < labIfos.size(); ++i) {
LabIfo labIfo = labIfos.get(i);
UserService userService = new UserService();
int userId = userService.userNameToGetUserId(labIfo
.getUserName());
LabService labService = new LabService();
int labId = labService.labNameToGetLabId(labIfo.getLabName());
ps.setInt(1, labId);
ps.setInt(2, userId);
ps.setInt(3, labIfo.getWeek());
ps.setInt(4, labIfo.getDay());
ps.setInt(5, labIfo.getLesson());
ps.setString(6, labIfo.getApplyReason());
ps.addBatch();
// 每1000条数据执行一次插入
if (i % 1000 == 0) {
ps.executeBatch();
conn.commit(); //手动提交事务
}
}
} catch (SQLException e) {
e.printStackTrace();
}
int[] number = ps.executeBatch(); // 把剩余的数据插入
conn.commit(); //手动提交事务
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (number[0] == 0)
return false;
else
return true;
}
二.注意:
1.在JDBC中,事务操作默认是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作。操作成功后,系统将自动调用commit()来提交。我们可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交,减少事务操作,提高效率。
这里我们关闭自动提交:
conn.setAutoCommit(false);
当添加了1000条数据库插入操作之后,手动提交,一次执行:
conn.commit();
2.先添加操作:
ps.addBatch();
然后批量执行操作:
ps.executeBatch();
从而实现批量插入
参考链接:
http://www.cnblogs.com/wpcnblog/archive/2011/06/23/2087768.html
http://www.cnblogs.com/kahreman/archive/2012/08/06/2625827.html