BlogJava 聯(lián)系 聚合 管理  

          Blog Stats

          隨筆檔案

          exams


          java世界

          世界Java

          在使用JDBC連接數(shù)據(jù)庫(kù)的時(shí),我們會(huì)采用executeQuery(String sql)獲得一個(gè)結(jié)果集。當(dāng)數(shù)據(jù)庫(kù)結(jié)構(gòu)變化或者獲得其他數(shù)據(jù)庫(kù)表結(jié)果集的時(shí)候我們需要將ResultSet結(jié)果集根據(jù)不同的數(shù)據(jù)結(jié)構(gòu)重新遍歷。
          如何才能建立一個(gè)與數(shù)據(jù)庫(kù)結(jié)構(gòu)無(wú)關(guān)的JDBC連接呢?我們可以通過(guò)使用ResultSetMetaData()方法獲得表結(jié)構(gòu)。然后使用Object[]數(shù)組遍歷結(jié)果集。當(dāng)我們要取得相應(yīng)的結(jié)果時(shí),我們可以使用Iterator迭代器。只要遍歷迭代器就可以取出結(jié)果。
          下面是我寫(xiě)的一個(gè)方法:
            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            //獲取數(shù)據(jù)庫(kù)表結(jié)構(gòu)
           74            ResultSetMetaData rsm = rs.getMetaData();
           75            //取得數(shù)據(jù)庫(kù)的列數(shù)
           76            int col = rsm.getColumnCount();
           77            //生成col長(zhǎng)度的Object數(shù)組
           78            Object[] obj = new Object[col];
           79            //遍歷結(jié)果集,將結(jié)果存入Object數(shù)組
           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        //遍歷迭代器,取出結(jié)果  
          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 閱讀(1053) 評(píng)論(2)  編輯  收藏

          評(píng)論

          # re: JDBC之代碼重復(fù)使用 2007-09-09 13:57 Jay
          唉,說(shuō)幾個(gè)大問(wèn)題:connection很昂貴的資源,怎么能運(yùn)行一次query就自作主張的關(guān)掉?query連set parameter都不支持,怎么復(fù)用?那個(gè)BigDecimal,只有oracle的number類(lèi)型才能這么轉(zhuǎn)換吧,別的數(shù)據(jù)庫(kù)呢?
            回復(fù)  更多評(píng)論
            

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


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 丹阳市| 叶城县| 封丘县| 广元市| 绍兴市| 静乐县| 永兴县| 新干县| 平昌县| 乌什县| 长春市| 乐平市| 峡江县| 淮北市| 南昌市| 舞阳县| 民县| 大田县| 新丰县| 许昌市| 东丰县| 辽源市| 区。| 周口市| 逊克县| 雷山县| 汨罗市| 呼和浩特市| 浦江县| 楚雄市| 巨野县| 永仁县| 珲春市| 西充县| 句容市| 辉县市| 绥江县| 穆棱市| 桂林市| 囊谦县| 清河县|