itkui

          年少為何不輕狂!

          JDBC之代碼復(fù)用

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

          119

          posted on 2007-06-09 14:17 itkui 閱讀(1476) 評論(13)  編輯  收藏 所屬分類: Java

          評論

          # re: JDBC之代碼復(fù)用 2007-06-09 17:28 search-computer

          剛寫過一個類似的,呵呵  回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 2007-06-09 17:43 itkui

          @search-computer
          那你考慮的滿周到的呀!
            回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 [未登錄] 2007-06-09 18:48 RoBeRt

          why not use spring jdbc template  回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 2007-06-09 19:05 itkui

          @RoBeRt
          spring沒學(xué)過。現(xiàn)在還在學(xué)習(xí)階段。
          Java框架無不是讓代碼復(fù)用。  回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 [未登錄] 2007-06-09 21:07 RoBeRt

          Too many try catch block make people weary
          We use frameworks not only for they're popular but also to reduce redundancy.
          Frankly speaking yours codes just like a toy.The JDK 6.0 has released a new way to connect the database.You should see it in the document   回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 2007-06-09 21:21 itkui

          @RoBeRt
          謝謝提醒,找個時間好好研究下!
          這個代碼沒有太大的實際意義,
          真正開發(fā)的時候會用hibernate。。。  回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 [未登錄] 2007-06-10 09:49 xmlspy

          使用spring jdbcTemplate 什么問題都解決了

          從性能和復(fù)用性上都比較平均

          是個不錯的選擇  回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 2007-06-10 14:01 阿南

          對,還有對事務(wù)的支持,非常簡單~  回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 2007-06-10 23:01 b_will

          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 }

          好像不對呀,最后的結(jié)果是list中的所有數(shù)據(jù)都一樣。
          Object[] obj = new Object[col]; 應(yīng)該放在while 循環(huán)里。
            回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 2007-06-10 23:14 itkui

          @b_will
          沒錯的,obj[i]是在for循環(huán)里面的,這樣就可以將結(jié)果集全部存入
          obj數(shù)組中!
          不經(jīng)過驗證我是不會帖出來的!
          不過,謝謝你的留意!  回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 [未登錄] 2007-06-13 09:14 tony

          特別好,有用!  回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 2007-06-19 09:31 軒朗=maninred

          關(guān)于數(shù)據(jù)庫的配置可以抽取到properties文件中,還有關(guān)于在結(jié)果集中將結(jié)果放至一個數(shù)字中的方法不是很好,這樣就卻少了類型檢查,在拿出結(jié)果后直接進(jìn)行VO的裝配比較好。

          jdbc這類代碼本來要的就是靈活,效率和細(xì)粒度控制,所以免不了代碼的復(fù)雜性會很高,其實用Spring的jdbcTemplate代碼也不會少很多。在實際開發(fā)中要么用ORM框架,要么就用jdbc直接寫出dao。  回復(fù)  更多評論   

          # re: JDBC之代碼復(fù)用 2007-07-12 16:20 Scott.Pan

          不錯,讓我了解JDBC又多了些。理解了內(nèi)部機(jī)制,寫的東西都明了些。  回復(fù)  更多評論   

          導(dǎo)航

          統(tǒng)計

          留言簿(1)

          隨筆檔案(24)

          收藏夾(15)

          好站珍藏

          學(xué)習(xí)資源

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 象山县| 明星| 土默特右旗| 台南县| 江安县| 保定市| 博白县| 巴塘县| 雷波县| 新野县| 神农架林区| 古蔺县| 上蔡县| 汪清县| 吉木乃县| 正安县| 合肥市| 深州市| 镇雄县| 青岛市| 青铜峡市| 仙游县| 治多县| 寿光市| 屏东县| 辉南县| 布拖县| 潼南县| 河北省| 庆元县| 青州市| 秭归县| 九龙坡区| 安龙县| 灵台县| 康马县| 崇州市| 鹤峰县| 芜湖市| 晋中市| 昆明市|