JAVA连接MySQL没有返回集_jdbc操作数据库返回结果集的注意事项

本文分析了一个JAVA程序在使用JDBC连接MySQL时遇到的问题,即在executeSQL方法内部ResultSet有值,但在外部变成null。原因在于ResultSet与连接相关,当Statement或Connection关闭时,ResultSet也会被关闭。解决方案包括将查询结果保存到集合中或者将关闭操作移到外部。同时,文章还提到了ResultSet与其他类型返回值的区别,返回值在finally块中改变不会影响实际返回结果。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值