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的区别。
jdbc操作数据库返回结果集的注意事项
标签:
查看更多关于jdbc操作数据库返回结果集的注意事项的详细内容...