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

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

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

    javaGrowing

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      92 隨筆 :: 33 文章 :: 49 評論 :: 0 Trackbacks
    二、Jakarta Commons dbutils:
        用JDBC API時最令人討厭的就是異常處理,也很煩瑣,而且很容易出錯,本人曾考慮過利用模板進(jìn)行處理,后來看到了dbutils,之后就采用那個dbutils,采用模板的方式各位朋友可以參考Spring,Spring的JdbcTemplate不靈活而強(qiáng)大,呵呵,說句閑話,實在太佩服Rod Johnson了,Rod Johnson真的很令人尊敬。
        Dbutils的QueryRunner把大多數(shù)與關(guān)閉資源相關(guān)的封裝起來,另外,你也可以使用DbUtils進(jìn)行關(guān)閉,當(dāng)然DbUtils提供的功能當(dāng)然不止這些,它提過了幾個常用的靜態(tài)方法,除了上述的關(guān)閉資源外,DbUtils. commitAndClose(Connection conn)還提供事務(wù)提及等操作。
    還是以一個例子來說說吧,畢竟我不是搞業(yè)務(wù)的,小嘴巴吧嗒吧噠不起來啊,呵呵。
        為了和采用Beanutils更好的進(jìn)行對比,這個例子還是實現(xiàn)同樣的功能,數(shù)據(jù)庫同樣采用前一篇文章中提到的publish。
    同樣的,用你喜歡的編輯器建立一個類DbutilsJDBCTest,示例代碼如下所示:
    package cn.qtone.test;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Map;
    import org.apache.commons.dbutils.DbUtils;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.MapListHandler;
    public class DbutilsJDBCTest{
        public static void main(String[] args) {
            Connection conn = null;
            String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
            String jdbcDriver = "com.mysql.jdbc.Driver";
            try {
                DbUtils.loadDriver(jdbcDriver);
                // Username "root". Password "root"
                conn = DriverManager.getConnection(jdbcURL, "root", "root");
                QueryRunner qRunner = new QueryRunner();
                System.out.println("***Using MapListHandler***");
                //以下部分代碼采用Map存儲方式,可以采用Bean的方式代替進(jìn)行處理
                List lMap = (List) qRunner.query(conn,
                        "select title,authors  from books", new MapListHandler());
                //以下是處理代碼,可以抽取出來
    System.out.println("title ------------- authors ");
                    for (int i = 0; i < lMap.size(); i++) {
                            Map vals = (Map) lMap.get(i);
                            System.out.println(vals.get("title")+"-------------"+ vals.get("authors"));
                    }
            } catch (SQLException ex) {
                ex.printStackTrace();
            } finally {
                DbUtils.closeQuietly(conn);
            }
        }
    }

    怎么樣?是不是比采用Beanutils的ResultSetDynaTrial和RowSetDynaClass好多了?采用Beanutils令人難纏的是關(guān)閉那些資源以及處理那些異常,而這里采用Dbutils顯然代碼量減少了很多。
    上例在處理結(jié)果集時,它把數(shù)據(jù)庫中的每一行映射成一個Map,其中列名作為Key,該列對應(yīng)的值作為Value存放,查詢的所有的數(shù)據(jù)一起放在一個List里,然后進(jìn)行處理,當(dāng)然,一個更明智的處理是直接返回List然后再單獨進(jìn)行處理。
    事實上上例返回的結(jié)果集中的每一行不必放在一個Map里,你可以放在一個Bean里,當(dāng)然如果你真的很懶,你也可以使用Beanutils的LazyDynaClass和LazyDynaBean,不過也許沒有必要那么做,至于原因請看下文。

    如果使用Bean而不是用Map,那么,你也許需要建立一個Bean,如下:
    package cn.qtone.test;
    public class Book {
        public int id;
        public String title;
        public String authors ;
        public StudentBean() {
        }
        public String getAuthors() {
            return authors;
        }
        public void setAuthors(String authors) {
            this.authors = authors;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
    }

    然后簡單修改一下DbutilsJDBCTest 中的部分代碼即可,代替之后的源代碼如下:

    package cn.qtone.test;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Map;
    import org.apache.commons.dbutils.DbUtils;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;

    public class DbutilsJDBCTest{
        public static void main(String[] args) {
            Connection conn = null;
            String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
            String jdbcDriver = "com.mysql.jdbc.Driver";
            try {
                DbUtils.loadDriver(jdbcDriver);
                // Username "root". Password "root"
                conn = DriverManager.getConnection(jdbcURL, "root", "root");
                QueryRunner qRunner = new QueryRunner();
                System.out.println("***Using BeanListHandler ***");
                //以下部分代碼采用Map存儲方式,可以采用Bean的方式代替進(jìn)行處理
    List lBeans = (List) qRunner.query(conn," select title,authors from books ", new BeanListHandler(Book.class));
        //以下是處理代碼,可以抽取出來
    System.out.println("title ------------- authors ");
        for (int i = 0; i < lBeans.size(); i++) {
                Book vals = (Book) lBeans.get(i);    
              System.out.println(vals.getTitle ()+"-------------"+ vals. getAuthors ());
                    }
            } catch (SQLException ex) {
                ex.printStackTrace();
            } finally {
                DbUtils.closeQuietly(conn);
            }
        }
    }
        這兩種法輸出的結(jié)果應(yīng)該是一樣的。兩種處理方式都差不多,但我更愿意采用第一種,因為第一種少寫一個bean,而且我測試過采用Map的方式即第一種方式性能要好的多,采用Bean性能比較低可能是因為采用反射的緣故,采用反射的東東性能和不采用反射的還是有點差距。也是這個原因,不推薦采用LazyDynaClass和LazyDynaBean,因為采用這二者是在運行期動態(tài)創(chuàng)建Bean類和Bean屬性,然后再創(chuàng)建Bean對象的,其性能可想而知了(不過我沒有測試過啊,所以我說這個話可說是沒有根據(jù)的,感興趣的朋友自己測試一下,記得告訴我結(jié)果哦,呵呵),除了MapListHandler以及BeanListHandler之外,DButils還提供了其他的Handler,如果這些不能滿足你的需求,你也可以自己實現(xiàn)一個Handler。
        最后,也是最大的體會,也許是最大的收獲吧,那就是:對于每一個項目,在根據(jù)每一個需求獲取相應(yīng)解決方案時,先尋找開源組件,看是否已經(jīng)有滿足某些功能需求的開源組件,如果沒有,再考慮自主開發(fā)或者向第三方購買,否則盡量采用開源組件.
        請盡量享用開源的魅力,盡情的擁抱開源吧。
        好了,終于寫完了,有什么問題請聯(lián)系我,大家互相交流交流。
    posted on 2005-12-29 22:39 javaGrowing 閱讀(281) 評論(0)  編輯  收藏 所屬分類: jsp學(xué)習(xí)
    主站蜘蛛池模板: 亚洲日日做天天做日日谢| 免费A级毛片无码A∨中文字幕下载 | 一级毛片免费观看不卡视频| 久久亚洲国产最新网站| 国产亚洲精品a在线观看app| 天天干在线免费视频| a毛片视频免费观看影院| 久久久久亚洲AV无码去区首| 亚洲视频免费一区| 国产亚洲AV夜间福利香蕉149 | 欧洲亚洲国产清在高| 国产一区二区免费在线| 中文字幕av无码无卡免费| av永久免费网站在线观看| 看Aⅴ免费毛片手机播放| 亚洲AV无码乱码麻豆精品国产| 亚洲精品高清无码视频| 亚洲AV成人精品日韩一区18p| 青草草色A免费观看在线| 久久精品视频免费播放| 国产成人高清精品免费观看| 亚洲av无码偷拍在线观看| 国产婷婷综合丁香亚洲欧洲| 久久亚洲AV成人无码国产| 亚洲五月综合缴情在线观看| 亚洲人成色7777在线观看不卡| 韩国欧洲一级毛片免费| 韩国免费一级成人毛片| 999任你躁在线精品免费不卡| 中文字幕av无码不卡免费| 一区二区三区视频免费观看| 爱情岛亚洲论坛在线观看 | 国产成人无码免费看片软件 | 性色av免费观看| 国产成人免费午夜在线观看| 日韩精品极品视频在线观看免费 | 中文字幕无码播放免费| 50岁老女人的毛片免费观看| 最近最新高清免费中文字幕| 91香蕉在线观看免费高清| 中文字幕天天躁日日躁狠狠躁免费|