jdbc操作数据库返回结果集的注意事项
时间:2021-07-01 10:21:17
帮助过:40人阅读
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操作数据库返回结果集的注意事项
标签: