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

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

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

    itkui

    年少為何不輕狂!

    JDBC之代碼復用

    在使用JDBC連接數(shù)據(jù)庫的時,我們會采用executeQuery(String sql)獲得一個結(jié)果集。當數(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é)果集。當我們要取得相應的結(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之代碼復用 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沒學過。現(xiàn)在還在學習階段。
    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
    謝謝提醒,找個時間好好研究下!
    這個代碼沒有太大的實際意義,
    真正開發(fā)的時候會用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 //遍歷結(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]; 應該放在while 循環(huán)里。
      回復  更多評論   

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

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

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

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

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

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

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

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

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

    導航

    統(tǒng)計

    留言簿(1)

    隨筆檔案(24)

    收藏夾(15)

    好站珍藏

    學習資源

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲人成色77777在线观看| 亚洲国产成人片在线观看无码| 亚洲精品日韩专区silk| 91视频免费观看| 国产亚洲精品激情都市| 黄页网站在线免费观看| 亚洲国产成人精品女人久久久| 精品亚洲福利一区二区| 免费一级国产生活片| 国产成人亚洲精品蜜芽影院| 国产a不卡片精品免费观看| 阿v视频免费在线观看| 亚洲高清最新av网站| 亚洲天堂免费在线视频| 久久久久亚洲爆乳少妇无 | 黄色a级免费网站| 一区二区三区亚洲视频| 在线视频免费国产成人| 久久久久亚洲AV无码永不| 最近中文字幕免费完整 | 亚洲成av人片天堂网无码】| 免费的一级片网站| 色噜噜的亚洲男人的天堂| 久久久久亚洲?V成人无码| 在线看无码的免费网站| 亚洲午夜在线播放| 亚洲成人国产精品| 国产免费区在线观看十分钟| 国产美女无遮挡免费视频| 在线观看国产一区亚洲bd| 亚洲中文字幕不卡无码| 67pao强力打造高清免费| 2020久久精品亚洲热综合一本| 国产精品色午夜免费视频| 美女巨胸喷奶水视频www免费| 亚洲av日韩av高潮潮喷无码| 免费观看无遮挡www的小视频| 亚洲成a人片在线不卡一二三区| 亚洲国产精品综合久久网络| 久久精品免费观看国产| 亚洲熟妇AV日韩熟妇在线|