BlogJava 聯系 聚合 管理  

          Blog Stats

          隨筆檔案

          exams


          java世界

          世界Java

          在使用JDBC連接數據庫的時,我們會采用executeQuery(String sql)獲得一個結果集。當數據庫結構變化或者獲得其他數據庫表結果集的時候我們需要將ResultSet結果集根據不同的數據結構重新遍歷。
          如何才能建立一個與數據庫結構無關的JDBC連接呢?我們可以通過使用ResultSetMetaData()方法獲得表結構。然后使用Object[]數組遍歷結果集。當我們要取得相應的結果時,我們可以使用Iterator迭代器。只要遍歷迭代器就可以取出結果。
          下面是我寫的一個方法:
            1import java.math.BigDecimal;
            2import java.sql.Connection;
            3import java.sql.DriverManager;
            4import java.sql.ResultSet;
            5import java.sql.ResultSetMetaData;
            6import java.sql.SQLException;
            7import java.sql.Statement;
            8import java.util.ArrayList;
            9import java.util.Iterator;
           10import java.util.List;
           11
           12public class newJdbc {
           13    private String url = "jdbc:oracle:thin:@localhost:  14
           15    private String dbUserName = "scott";
           16
           17    private String dbUserPassword = "tiger";
           18
           19    private Connection conn = null;
           20
           21    private Statement stmt = null;
           22
           23    private ResultSet rs = null;
           24
           25    public newJdbc() {
           26        try {
           27            Class.forName("oracle.jdbc.driver.OracleDriver");
           28        } catch (ClassNotFoundException e) {
           29            e.printStackTrace();
           30        }
           31    }
           32
           33    public Connection getConnection() {
           34        try {
           35            conn = DriverManager.getConnection(url, dbUserName, dbUserPassword);
           36        } catch (SQLException e) {
           37            e.printStackTrace();
           38        }
           39        return conn;
           40    }
           41
           42    public void close(ResultSet rs, Statement stmt, Connection conn) {
           43        if (rs != null) {
           44            try {
           45                rs.close();
           46            } catch (SQLException e) {
           47                e.printStackTrace();
           48            }
           49        }
           50        if (stmt != null) {
           51            try {
           52                stmt.close();
           53            } catch (SQLException e) {
           54                e.printStackTrace();
           55            }
           56        }
           57        if (conn != null) {
           58            try {
           59                conn.close();
           60            } catch (SQLException e) {
           61                e.printStackTrace();
           62            }
           63        }
           64    }
           65
           66    public List query(String sql) {
           67        List list = new ArrayList();
           68
           69        conn = this.getConnection();
           70        try {
           71            stmt = conn.createStatement();
           72            rs = stmt.executeQuery(sql);
           73            //獲取數據庫表結構
           74            ResultSetMetaData rsm = rs.getMetaData();
           75            //取得數據庫的列數
           76            int col = rsm.getColumnCount();
           77            //生成col長度的Object數組
           78            Object[] obj = new Object[col];
           79            //遍歷結果集,將結果存入Object數組
           80            while (rs.next()) {
           81                for (int i = 0; i < col; i++) {
           82                    obj[i] = rs.getObject(i + 1);
           83                }
           84                list.add(obj);
           85            }
           86        } catch (SQLException e) {
           87            e.printStackTrace();
           88        } finally {
           89            this.close(rs, stmt, conn);
           90        }
           91        return list;
           92    }
           93
           94    public void update(String sql) {
           95        try {
           96            conn = this.getConnection();
           97            stmt = conn.createStatement();
           98            stmt.executeUpdate(sql);
           99        } catch (SQLException e) {
          100            e.printStackTrace();
          101        }
          102    }
          103
          104    public static void main(String args[]) {
          105        newJdbc nj = new newJdbc();
          106        String sql = "select * from users";
          107        List list = nj.query(sql);
          108        //返回list的迭代器
          109        Iterator it = list.iterator();
          110        //遍歷迭代器,取出結果  
          1z0-147
          111        while (it.hasNext()) {
          112            Object[] o = (Object[]) it.next();
          113            int id = ((BigDecimal) o[0]).intValue();
          114            System.out.println(id);
          115        }
          116
          117    }
          118}

          posted on 2007-09-07 13:49 java2java 閱讀(1050) 評論(2)  編輯  收藏

          評論

          # re: JDBC之代碼重復使用 2007-09-09 13:57 Jay
          唉,說幾個大問題:connection很昂貴的資源,怎么能運行一次query就自作主張的關掉?query連set parameter都不支持,怎么復用?那個BigDecimal,只有oracle的number類型才能這么轉換吧,別的數據庫呢?
            回復  更多評論
            

          # re: JDBC之代碼重復使用 2007-09-11 09:24 wangsoft
          樓上的有道理,但是connection可以關閉,我們通過連接池就好。這種解決問題是個思路,但是只是開頭,接下來還是要根據metaData生成某些東西(或配置文件或持久化對象),最后走下去就是ibatis和hibernate了,哈哈,愚見而已  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 天镇县| 哈尔滨市| 习水县| 监利县| 邮箱| 荆州市| 嘉鱼县| 开阳县| 凌云县| 西平县| 静乐县| 石屏县| 苍溪县| 绥芬河市| 绥中县| 开平市| 民乐县| 林口县| 临夏市| 双城市| 宣汉县| 南皮县| 梁河县| 正镶白旗| 天峨县| 文昌市| 景宁| 锦州市| 溧阳市| 武宁县| 资溪县| 江永县| 原阳县| 若尔盖县| 全州县| 弋阳县| 石台县| 峨山| 体育| 乌拉特前旗| 阳城县|