1 importjava.sql.Connection;2 importjava.sql.DriverManager;3 importjava.sql.ResultSet;4 importjava.sql.SQLException;5 importjava.sql.Statement;6
7 public classOraclDao {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 voidcloseConnection() {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) throwsSQLException {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 returnrs;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 voidmain(String[] args) {68 String url = "jdbc:oracle:thin:@localhost:" + 1521 + ":orcl";69 OraclDao oraclDao = newOraclDao();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的区别。