1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.sql.Statement; 6 7 public class OraclDao { 8 9 private Connection conn = null; 10 11 public void initConnection(String url, String uid, String pwd) {// 初始化 12 String className = "oracle.jdbc.driver.OracleDriver"; 13 try { 14 Class.forName(className); 15 conn = DriverManager.getConnection(url, uid, pwd); 16 } catch (ClassNotFoundException e) { 17 e.printStackTrace(); 18 } catch (SQLException e) { 19 e.printStackTrace(); 20 } 21 } 22 23 public void closeConnection() { 24 if (conn != null) { 25 try { 26 conn.close(); 27 conn = null; 28 } catch (SQLException e) { 29 e.printStackTrace(); 30 } 31 } 32 } 33 34 public ResultSet executeSQL(String sql) throws SQLException { 35 Statement stmtt = null; 36 ResultSet rs = null; 37 try { 38 stmtt = conn.createStatement(); 39 rs = stmtt.executeQuery(sql); 40 /* 41 * while (rs.next()) { System.out.println("sdfsdf");// TODO } 42 */ 43 return rs; 44 } catch (SQLException e) { 45 e.printStackTrace(); 46 } finally { 47 if (rs != null) { 48 try { 49 rs.close(); 50 rs = null; 51 } catch (SQLException e) { 52 e.printStackTrace(); 53 } 54 } 55 if (stmtt != null) { 56 try { 57 stmtt.close(); 58 stmtt = null; 59 } catch (SQLException e) { 60 e.printStackTrace(); 61 } 62 } 63 // closeConnection(); 64 } 65 } 66 67 public static void main(String[] args) { 68 String url = "jdbc:oracle:thin:@localhost:" + 1521 + ":orcl"; 69 OraclDao oraclDao = new OraclDao(); 70 oraclDao.initConnection(url, "SCOTT", "tiger"); 71 72 try { 73 ResultSet rs = oraclDao.executeSQL("select * from scott.userinfo"); 74 75 while (rs.next()) { 76 System.out.println("sdfsdf");// TODO 77 } 78 } catch (SQLException e) { 79 e.printStackTrace(); 80 } 81 oraclDao.closeConnection(); 82 } 83 }
如上程序,执行main函数,在executeSQL方法里面ResultSet是有值的,但是当返回到外层(main),发现rs是null。经仔细分析,这一奇怪的现象产生的原因是ResultSet是和连接相关的。(即如果关闭了statement、connection或resultset,则resultset就也没有值了)
当生成 ResultSet
对象的 Statement
对象关闭、重新执行或用来从多个结果的序列获取下一个结果时,ResultSet
对象将自动关闭。
本例中,执行executeSQL方法时应该是先执行finally里的,再执行return rs;finally里关闭了resultset和statement,所以返回的resultset的值成为了null。
解决的方法:
1、将查询得到的resultSet中的值保存在arrayList等中,executeSQL方法的返回值类型不要写成ResultSet类型的。
2、finally中的关闭操作往后放,即不写在executeSQL方法里,而是在外层处理过resultset后再关闭。
其他:resultset算是比较特殊的了。如果一个函数返回值是int型,程序中假设返回变量a,a的值是5.在finally块中又将a的值置为-1;则上层接收到的返回值仍然是5.虽然先执行finally块,后执行return语句,也不会改变return的值。此时返回的是5,但a的真实值应该是变为-1了。注意这个和resultSet的区别。
时间: 2024-10-10 08:47:14