jdbc操作数据库返回结果集的注意事项

 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的区别。

原文地址:https://www.cnblogs.com/qingxinblog/p/4233039.html