itkui

          年少為何不輕狂!

          JDBC之代碼復用

          在使用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: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            //獲取數據庫表結構
           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        //遍歷迭代器,取出結果
          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之代碼復用 2007-06-09 17:28 search-computer

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

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

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

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

          why not use spring jdbc template  回復  更多評論   

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

          @RoBeRt
          spring沒學過。現在還在學習階段。
          Java框架無不是讓代碼復用。  回復  更多評論   

          # re: JDBC之代碼復用 [未登錄] 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   回復  更多評論   

          # re: JDBC之代碼復用 2007-06-09 21:21 itkui

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

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

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

          從性能和復用性上都比較平均

          是個不錯的選擇  回復  更多評論   

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

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

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

          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 }

          好像不對呀,最后的結果是list中的所有數據都一樣。
          Object[] obj = new Object[col]; 應該放在while 循環里。
            回復  更多評論   

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

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

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

          特別好,有用!  回復  更多評論   

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

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

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

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

          不錯,讓我了解JDBC又多了些。理解了內部機制,寫的東西都明了些。  回復  更多評論   

          導航

          統計

          留言簿(1)

          隨筆檔案(24)

          收藏夾(15)

          好站珍藏

          學習資源

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宿迁市| 黎城县| 清水河县| 东港市| 寿宁县| 诏安县| 亚东县| 银川市| 武胜县| 华宁县| 方正县| 新化县| 盐源县| 高碑店市| 梁平县| 成都市| 虹口区| 巴青县| 绩溪县| 叙永县| 确山县| 湄潭县| 靖江市| 无棣县| 西贡区| 尖扎县| 克什克腾旗| 溧水县| 黔江区| 舟曲县| 高台县| 宜兰县| 阿拉尔市| 恭城| 湘潭市| 敦化市| 九台市| 三亚市| 泸州市| 新民市| 始兴县|