首页 > 代码库 > jdbc操作数据库返回结果集的注意事项

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");// TODO77             }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的区别。

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