首页 > 代码库 > 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操作数据库返回结果集的注意事项
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。