如何创建execute方法并在其中调用preparedStmt.executeBatch()
如何把批量执行逻辑抽离到单独的
execute()方法中 看了你的代码,你现在已经在save()里完成了批处理的添加和执行,但想把executeBatch()的调用单独放到execute()方法里对吧?这里给你两种可行的实现方案,还会补充一些关键注意事项:
方案1:把PreparedStatement作为参数传给execute()
这种方式不需要修改类成员,直接将需要执行批处理的语句对象和连接对象传入方法,逻辑清晰且耦合度低:
public void save() { FacesContext context = FacesContext.getCurrentInstance(); context.addMessage(null, new FacesMessage("Sacuvano nov proizvod sa sifrom: " + proizvodID + " Naziv proizvoda: " + naziv)); try { String myDriver = "org.gjt.mm.mysql.Driver"; String myUrl = "jdbc:mysql://localhost/fpis"; Class.forName(myDriver); Connection conn = DriverManager.getConnection(myUrl, "root", "root"); String query = " insert into proizvod values (?, ?, ?, ?, ?)"; PreparedStatement preparedStmt = conn.prepareStatement(query); // 设置参数并添加到批处理 preparedStmt.setInt(1, proizvodID); preparedStmt.setString(2, naziv); preparedStmt.setString(3, opis); preparedStmt.setDouble(4, cena); preparedStmt.setString(5, jedMere); preparedStmt.addBatch(); // 调用单独的execute方法,传入需要的资源 execute(preparedStmt, conn); } catch (Exception e) { System.err.println("Greska!"); System.err.println(e.getMessage()); } } public void execute(PreparedStatement preparedStmt, Connection conn) { try { // 执行批处理并获取结果 int[] batchResults = preparedStmt.executeBatch(); System.out.println("Uspesno izvrseno " + batchResults.length + " upita u batch-u"); // 关闭资源 preparedStmt.close(); conn.close(); } catch (SQLException e) { System.err.println("Greska pri izvrsavanju batch-a!"); System.err.println(e.getMessage()); } }
方案2:将数据库资源设为类成员变量
如果你的类需要多次复用数据库连接或语句对象,可以把它们定义为类成员,这样execute()方法就能直接访问:
// 类成员变量,用于保存数据库资源 private Connection conn; private PreparedStatement preparedStmt; public void save() { FacesContext context = FacesContext.getCurrentInstance(); context.addMessage(null, new FacesMessage("Sacuvano nov proizvod sa sifrom: " + proizvodID + " Naziv proizvoda: " + naziv)); try { String myDriver = "org.gjt.mm.mysql.Driver"; String myUrl = "jdbc:mysql://localhost/fpis"; Class.forName(myDriver); conn = DriverManager.getConnection(myUrl, "root", "root"); String query = " insert into proizvod values (?, ?, ?, ?, ?)"; preparedStmt = conn.prepareStatement(query); // 设置参数并添加到批处理 preparedStmt.setInt(1, proizvodID); preparedStmt.setString(2, naziv); preparedStmt.setString(3, opis); preparedStmt.setDouble(4, cena); preparedStmt.setString(5, jedMere); preparedStmt.addBatch(); // 直接调用execute方法 execute(); } catch (Exception e) { System.err.println("Greska!"); System.err.println(e.getMessage()); // 异常时也要确保关闭资源 closeResources(); } } public void execute() { try { if (preparedStmt != null && conn != null) { int[] batchResults = preparedStmt.executeBatch(); System.out.println("Uspesno izvrseno " + batchResults.length + " upita u batch-u"); closeResources(); } } catch (SQLException e) { System.err.println("Greska pri izvrsavanju batch-a!"); System.err.println(e.getMessage()); closeResources(); } } // 封装资源关闭逻辑,避免重复代码 private void closeResources() { try { if (preparedStmt != null) preparedStmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { System.err.println("Greska pri zatvaranju resursa!"); System.err.println(e.getMessage()); } }
额外重要提示
- 资源泄漏问题:一定要保证在任何情况下(包括抛出异常时)都关闭数据库连接和语句对象,上面的方案都做了处理。更推荐使用Java 7+的
try-with-resources语法,它会自动帮你关闭资源:try (Connection conn = DriverManager.getConnection(myUrl, "root", "root"); PreparedStatement preparedStmt = conn.prepareStatement(query)) { // 在这里执行参数设置、addBatch等操作 preparedStmt.executeBatch(); } catch (SQLException e) { // 处理异常 } - 批处理的适用场景:如果只是插入单条数据,批处理的优势不明显,适合循环添加多条
addBatch()后再批量执行,能大幅提升插入效率。
内容的提问来源于stack exchange,提问作者Jovan Jovanović
相关产品推荐
相关产品推荐

