現象:實現一個刪除數據庫前10條記錄的練習時,出現了Operation not allowed after ResultSet closed
的錯誤。
原因:由於要先進行查詢操作,在while
中也就是意味着rs
還沒有關閉,因爲使用了next()
函數,這時候再執行刪除操作時,也就是意味着查詢的rs會close
,也就是沒有查詢的rs
,就無法執行rs.next()
。因此就出現了上面的錯誤。
解決:多條操作最好使用多個Statement
對象,將查詢和刪除分開。修改如下:
Statement sQuery = c.createStatement();
Statement sDelete = c.createStatement();
完整實現如下:
package jdbctest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class TestDelete {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try(Connection c = DriverManager.getConnection("jdbc:mysql://192.168.88.120:3306/db_bigdata","root","123456");
Statement sQuery = c.createStatement();
Statement sDelete = c.createStatement();){
c.setAutoCommit(false);
//查詢完還要執行刪除操作,會使得的rs關閉
ResultSet rs = sQuery.executeQuery("select *from hero limit 0,10");
while(rs.next()){
int id = rs.getInt(1);
System.out.printf("試圖刪除id=%d的元素\n",id);
sQuery.execute("delete from hero where id = " + id);
}
System.out.println("是否要刪除?");
Scanner input = new Scanner(System.in);
while(true){
String str = input.next();
if("Y".equals(str)){
c.commit();//手動提交
System.out.println("提交刪除");
break;
}else if("N".equals(str)){
System.out.println("放棄刪除");
break;
}
}
}catch(SQLException e){
e.printStackTrace();
}
}
}