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

  • 相关阅读:
    关于多个EditText的OnTextChange事件陷入死循环的处理
    #define #include #undef的其中一个用法(目的)
    串行移位锁存并行输出可级联器件74HC595
    STM32F10xx CAN BUS相关库文件"stm32f10x_can.c"内的库函数解析
    STM32 之 NVIC(中断向量、优先级) 简述
    STM32F103xx bxCAN(Basic Extended CAN) 滤波机制
    VS上利用C#实现一个简单的串口程序记录
    如何去各型MCU的官网上下载正确的数据手册
    Cotex-M3内核STM32F10XX系列时钟及其配置方法
    Stm32 debug停留在"BKPT 0xAB"或者"SWI 0xAB"的解决办法。
  • 原文地址:https://www.cnblogs.com/qingxinblog/p/4233039.html
Copyright © 2020-2023  润新知