
批处理
很多时候,需要批量执行sql语句!
需求:批量保存信息!
设计:
AdminDao
Public void save(List<Admin list){ // 目前用这种方式
// 循环
// 保存 (批量保存)
}
Public void save(Admin admin ){
// 循环
// 保存
}
技术:
|-- Statement
批处理相关方法
- void addBatch(String sql) 添加批处理
- void clearBatch() 清空批处理
- int[] executeBatch() 执行批处理
实现:
- Admin.java 实体类封装数据
- AdminDao.java 封装所有的与数据库相关的操作
- App.java 测试
代码:
1:实体类封装数据
public class Admin { private String userName;
private String pwd;
}
2:测试批处理操作
public class App {
// 测试批处理操作
@Test
public void testBatch() throws Exception { // 模拟数据
List<Admin> list = new ArrayList<Admin>();
for (int i=1; i<21; i++) {
Admin admin = new Admin();
admin.setUserName("Jack" + i);
admin.setPwd("888" + i);
list.add(admin);
} // 保存
AdminDao dao = new AdminDao();
dao.save(list);
}
}
3:封装所有的与数据库的操作
public class AdminDao { // 全局参数
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs; // 批量保存管理员
public void save(List<Admin> list) {
// SQL
String sql = "INSERT INTO admin(userName,pwd) values(?,?)"; try { // 获取连接
con = JdbcUtil.getConnection();
// 创建stmt
pstmt = con.prepareStatement(sql); // 【预编译SQL语句】 for (int i=0; i<list.size(); i++) {
Admin admin = list.get(i);
// 设置参数
pstmt.setString(1, admin.getUserName());
pstmt.setString(2, admin.getPwd()); // 添加批处理
pstmt.addBatch(); // 【不需要传入SQL】 // 测试:每5条执行一次批处理
if (i % 5 == 0) {
// 批量执行
pstmt.executeBatch();
// 清空批处理
pstmt.clearBatch();
} } // 批量执行
pstmt.executeBatch();
// 清空批处理
pstmt.clearBatch(); } catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.closeAll(con, pstmt, rs);
}
}
}