<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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)

    好站珍藏

    學習資源

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产成+人+综合+亚洲专| 亚洲愉拍99热成人精品热久久| 18勿入网站免费永久| 59pao成国产成视频永久免费 | 亚洲成AV人片在线观看无| 亚洲欧洲日产国码无码久久99| 亚洲开心婷婷中文字幕| 亚洲成AV人片在线观看WWW| 久久亚洲一区二区| 亚洲高清在线mv| 色偷偷亚洲女人天堂观看欧| 亚洲色欲色欲www在线播放| 亚洲av无码日韩av无码网站冲| 国产成人综合久久精品亚洲| 成人a毛片免费视频观看| jzzjzz免费观看大片免费| 国产无遮挡无码视频免费软件| 性色午夜视频免费男人的天堂| 久久午夜夜伦鲁鲁片免费无码影视| **俄罗斯毛片免费| 最新免费jlzzjlzz在线播放| 国产精品久久久久影院免费| 亚洲Av无码乱码在线znlu| 亚洲人成精品久久久久| 亚洲精品中文字幕无码AV| 亚洲性色AV日韩在线观看| 免费手机在线看片| 怡红院免费的全部视频| 国产一卡二卡四卡免费| 国产精品公开免费视频| 国产亚洲欧洲Aⅴ综合一区| 亚洲免费视频在线观看| 中日韩亚洲人成无码网站| 免费国产va视频永久在线观看| 国偷自产一区二区免费视频| 国产成人精品久久免费动漫| 国产成人无码免费视频97 | 国产成人精品免费视频大全五级| 亚洲日本一区二区三区在线不卡| 亚洲成a人片77777老司机| 亚洲色大成网站www久久九|