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

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

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

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    利用Jakarta Commons組件beanutils、dbutils簡化JDBC數據庫操作(轉)

    關鍵字:beanutils、dbutils、JDBC 數據庫
    摘要:本文簡單介紹了Jakarta Commons旗下beanutils、dbutils在基于JDBC API數據庫存取操作中的運用。
        雖然現在出現了很多ORM框架,可是還是有很多朋友也許還在使用JDBC,就像我現在一樣,除了學習的時候在使用Hibernate、Spring類似這些優秀的框架,工作時一直都在使用JDBC。本文就簡單介紹一下利用Jakarta Commons旗下beanutils、dbutils簡化JDBC 數據庫操作,以拋磚引玉,希望對像我一樣在使用JDBC的朋友有所幫助。
        下面就分兩部分簡單介紹beanutils、dbutils在基于JDBC API數據庫存取操作中的運用。第一部分顯介紹beanutils在JDBC數據庫存取操作中的運用,第二部分介紹dbutils在JDBC 數據庫存取操作中的運用,最后看看他們的優缺點,談談本人在項目運用過程中對他們的一點心得體會,僅供參考,其中有錯誤的地方希望大蝦不吝賜教,大家多多交流共同進步。
    一、Jakarta Commons beanutils
        Beanutils是操作Bean的銳利武器,其提過的 BeanUtils工具類可以簡單方便的讀取或設置Bean的屬性,利用Dyna系列,還可以在運行期創建Bean,符合懶人的習慣,正如 LazyDynaBean,LazyDynaClass一樣,呵呵。這些用法已經有很多文章提及,也可以參考apache的官方文檔。
        對于直接利用JDBC API訪問數據庫時(這里針對的是返回結果集ResultSet的查詢select),大多數都是采用兩種方式,一種是取出返回的結果集的數據存于Map中,另一種方式是Bean里。針對第二種方式,Beanutils里提供了ResultSetDynaClass結合 DynaBean以及RowSetDynaClass結合DynaBean來簡化操作。下面用以個簡單的例子展示一下beanutils的這兩個類在 JDBC數據庫操作中的運用。
        請在本機建立數據庫publish,我用的是MySQL,在publish數據庫中建立表book,腳本如下:
    1CREATE TABLE book(
    2  id int(11NOT NULL auto_increment,
    3  title varchar(50character set latin1 NOT NULL,
    4  authors varchar(50character set latin1 default NULL
    5  PRIMARY KEY  (id)
    6


         然后用你喜歡的編輯器建立一個類BeanutilsJDBCTest,我們先用ResultSetDynaClass來處理,然后再用 RowSetDynaClass來實現同樣的類,之后看看他們之間有什么不同,用ResultSetDynaClass處理的源代碼如下所示:
         然后用你喜歡的編輯器建立一個類BeanutilsJDBCTest,我們先用ResultSetDynaClass來處理,然后再用 RowSetDynaClass來實現同樣的類,之后看看他們之間有什么不同,用ResultSetDynaClass處理的源代碼如下所示:
     1package cn.qtone.test;
     2
     3import java.sql.Connection;
     4import java.sql.DriverManager;
     5import java.sql.ResultSet;
     6import java.sql.Statement;
     7import java.util.Iterator; 
     8import org.apache.commons.beanutils.DynaBean;
     9import org.apache.commons.beanutils.PropertyUtils;
    10import org.apache.commons.beanutils.ResultSetDynaClass; 
    11public class BeanutilsJDBCTest{
    12       public static void main(String[] args) {
    13              Connection con = null;
    14              Statement st = null;
    15              ResultSet rs = null;
    16              try {
    17                     Class.forName("com.mysql.jdbc.Driver");
    18                     String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
    19                     con = DriverManager.getConnection(url, "root""hyys");
    20                     st = con.createStatement();
    21                     rs = st.executeQuery("select * from book");
    22                     ResultSetDynaClass rsDynaClass = new ResultSetDynaClass(rs);
    23                     Iterator itr = rsDynaClass.iterator();
    24                     System.out.println("title-------------authors");
    25                     while (itr.hasNext()) {
    26                            DynaBean dBean = (DynaBean) itr.next();
    27                            System.out.println(PropertyUtils.getSimpleProperty(dBean,"title")+ "-------"+ PropertyUtils.getSimpleProperty(dBean, "authors"));
    28
    29                     }

    30              }
     catch (Exception e) {
    31                     e.printStackTrace();
    32              }
     finally {
    33                     try {
    34                            if (rs != null{
    35                                   rs.close();
    36                            }

    37                            if (st != null{
    38                                   st.close();
    39                            }

    40                            if (con != null{
    41                                   con.close();
    42                            }

    43                     }
     catch (Exception e) {
    44                            e.printStackTrace();
    45                     }

    46              }

    47       }

    48}
     
    49

    用RowSetDynaClass處理的源代碼如下所示: 

     1package cn.qtone.test; 
     2
     3import java.sql.Connection;
     4import java.sql.DriverManager;
     5import java.sql.ResultSet;
     6import java.sql.Statement;
     7import java.util.Iterator;
     8import java.util.List; 
     9import org.apache.commons.beanutils.DynaBean;
    10import org.apache.commons.beanutils.PropertyUtils;
    11import org.apache.commons.beanutils.RowSetDynaClass; 
    12
    13public class BeanutilsJDBCTest{
    14       public static void main(String[] args) {
    15              List rsDynaClass = rsTest();
    16              System.out.println("title ------------- authors ");
    17              Iterator itr = rsDynaClass.iterator();
    18              while (itr.hasNext()) {
    19                     DynaBean dBean = (DynaBean) itr.next();
    20                     try {
    21                            System.out.println(PropertyUtils.getSimpleProperty(dBean,"name")  + "-----"+ PropertyUtils.getSimpleProperty(dBean, "mobile"));
    22                     }
     catch (Exception e) {
    23                            // TODO 自動生成 catch 塊
    24                            e.printStackTrace();
    25                     }

    26              }

    27       }
     
    28       private static List rsTest() {
    29              Connection con = null;
    30              Statement st = null;
    31              ResultSet rs = null;
    32              try {
    33                     Class.forName("com.mysql.jdbc.Driver");
    34                     String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
    35                     con = DriverManager.getConnection(url, "root""hyys");
    36                     st = con.createStatement();
    37                     rs = st.executeQuery("select * from book");
    38                     RowSetDynaClass rsdc = new RowSetDynaClass(rs);
    39                     return rsdc.getRows();
    40              }
     catch (Exception e) {
    41                     e.printStackTrace();
    42              }
     finally {
    43                     try {
    44                            if (rs != null{
    45                                   rs.close();
    46                            }

    47                            if (st != null{
    48                                   st.close();
    49                            }

    50                            if (con != null{
    51                                   con.close();
    52                            }

    53                     }
     catch (Exception e) {
    54                            e.printStackTrace();
    55                     }

    56              }

    57              return null;
    58       }

    59}
     



         這兩個方法輸出的結果應該是一樣的。但是很顯然第二種方式比第一種方式要好,它把數據訪問部分抽取出來放到一個方法中,顯得簡單清晰。
          其實在利用ResultSetDynaClass時,必須在ResultSet等數據庫資源關閉之前,處理好那些數據,你不能在資源關閉之后使用 DynaBean,否則就會拋出異常,異常就是說不能在ResultSet之后存取數據(具體的異常名我也忘了),當然你也可以采用以前的方式一個一個的把數據放到Map里,如果你一定要那樣做,建議還是別用Beanutils,因為這沒帶給你什么好處。總之利用ResultSetDynaClass你的程序的擴展性非常部好。
        從第二中方式可以看出,利用RowSetDynaClass可以很好的解決上述 ResultSetDynaClass遇到的問題,RowSetDynaClass的getRows()方法,把每一行封裝在一個DynaBean對象里,然后,把說有的行放到一個List里,之后你就可以對返回的List里的每一個DynaBean進行處理,此外對于DynaBean你還可以采用標準的get/set方式處理,當然你也可以用PropertyUtils. getSimpleProperty(Object bean,  String name)進行處理。
        從上面的分析中,你應該可以決定你應該使用ResultSetDynaClass還是RowSetDynaClass了。

    二、Jakarta Commons dbutils:
         用JDBC API時最令人討厭的就是異常處理,也很煩瑣,而且很容易出錯,本人曾考慮過利用模板進行處理,后來看到了dbutils,之后就采用那個 dbutils,采用模板的方式各位朋友可以參考Spring,Spring的JdbcTemplate不靈活而強大,呵呵,說句閑話,實在太佩服 Rod Johnson了,Rod Johnson真的很令人尊敬。
        Dbutils的QueryRunner把大多數與關閉資源相關的封裝起來,另外,你也可以使用DbUtils進行關閉,當然DbUtils提供的功能當然不止這些,它提過了幾個常用的靜態方法,除了上述的關閉資源外, DbUtils. commitAndClose(Connection conn)還提供事務提及等操作。
    還是以一個例子來說說吧,畢竟我不是搞業務的,小嘴巴吧嗒吧噠不起來啊,呵呵。
        為了和采用Beanutils更好的進行對比,這個例子還是實現同樣的功能,數據庫同樣采用前一篇文章中提到的publish。
    同樣的,用你喜歡的編輯器建立一個類DbutilsJDBCTest,示例代碼如下所示:

     1package cn.qtone.test;
     2import java.sql.Connection;
     3import java.sql.DriverManager;
     4import java.sql.SQLException;
     5import java.util.List;
     6import java.util.Map;
     7import org.apache.commons.dbutils.DbUtils;
     8import org.apache.commons.dbutils.QueryRunner;
     9import org.apache.commons.dbutils.handlers.MapListHandler;
    10public class DbutilsJDBCTest{
    11    public static void main(String[] args) {
    12        Connection conn = null;
    13        String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
    14        String jdbcDriver = "com.mysql.jdbc.Driver";
    15        try {
    16            DbUtils.loadDriver(jdbcDriver);
    17            // Username "root". Password "root"
    18            conn = DriverManager.getConnection(jdbcURL, "root""root");
    19            QueryRunner qRunner = new QueryRunner();
    20            System.out.println("***Using MapListHandler***");
    21            //以下部分代碼采用Map存儲方式,可以采用Bean的方式代替進行處理
    22            List lMap = (List) qRunner.query(conn,
    23                    "select title,authors  from books"new MapListHandler());
    24            //以下是處理代碼,可以抽取出來
    25System.out.println("title ------------- authors ");
    26                for (int i = 0; i < lMap.size(); i++{
    27                        Map vals = (Map) lMap.get(i);
    28                        System.out.println(vals.get("title")+"-------------"+ vals.get("authors"));
    29                }

    30        }
     catch (SQLException ex) {
    31            ex.printStackTrace();
    32        }
     finally {
    33            DbUtils.closeQuietly(conn);
    34        }

    35    }

    36}



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

    如果使用Bean而不是用Map,那么,你也許需要建立一個Bean,如下:

     1package cn.qtone.test;
     2public class Book {
     3    public int id;
     4    public String title;
     5    public String authors ;
     6    public StudentBean() {
     7    }

     8    public String getAuthors() {
     9        return authors;
    10    }

    11    public void setAuthors(String authors) {
    12        this.authors = authors;
    13    }

    14    public int getId() {
    15        return id;
    16    }

    17    public void setId(int id) {
    18        this.id = id;
    19    }

    20    public String getTitle() {
    21        return title;
    22    }

    23    public void setTitle(String title) {
    24        this.title = title;
    25    }

    26}



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

     1package cn.qtone.test;
     2
     3import java.sql.Connection;
     4import java.sql.DriverManager;
     5import java.sql.SQLException;
     6import java.util.List;
     7import java.util.Map;
     8import org.apache.commons.dbutils.DbUtils;
     9import org.apache.commons.dbutils.QueryRunner;
    10import org.apache.commons.dbutils.handlers.BeanListHandler;
    11
    12public class DbutilsJDBCTest{
    13    public static void main(String[] args) {
    14        Connection conn = null;
    15        String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
    16        String jdbcDriver = "com.mysql.jdbc.Driver";
    17        try {
    18            DbUtils.loadDriver(jdbcDriver);
    19            // Username "root". Password "root"
    20            conn = DriverManager.getConnection(jdbcURL, "root""root");
    21            QueryRunner qRunner = new QueryRunner();
    22            System.out.println("***Using BeanListHandler ***");
    23            //以下部分代碼采用Map存儲方式,可以采用Bean的方式代替進行處理
    24List lBeans = (List) qRunner.query(conn," select title,authors from books "new BeanListHandler(Book.class));
    25    //以下是處理代碼,可以抽取出來
    26System.out.println("title ------------- authors ");
    27    for (int i = 0; i < lBeans.size(); i++{
    28            Book vals = (Book) lBeans.get(i);    
    29          System.out.println(vals.getTitle ()+"-------------"+ vals. getAuthors ());
    30                }

    31        }
     catch (SQLException ex) {
    32            ex.printStackTrace();
    33        }
     finally {
    34            DbUtils.closeQuietly(conn);
    35        }

    36    }

    37}


         這兩種法輸出的結果應該是一樣的。兩種處理方式都差不多,但我更愿意采用第一種,因為第一種少寫一個bean,而且我測試過采用Map的方式即第一種方式性能要好的多,采用Bean性能比較低可能是因為采用反射的緣故,采用反射的東東性能和不采用反射的還是有點差距。也是這個原因,不推薦采用 LazyDynaClass和LazyDynaBean,因為采用這二者是在運行期動態創建Bean類和Bean屬性,然后再創建Bean對象的,其性能可想而知了(不過我沒有測試過啊,所以我說這個話可說是沒有根據的,感興趣的朋友自己測試一下,記得告訴我結果哦,呵呵),除了 MapListHandler以及BeanListHandler之外,DButils還提供了其他的Handler,如果這些不能滿足你的需求,你也可以自己實現一個Handler。
        最后,也是最大的體會,也許是最大的收獲吧,那就是:對于每一個項目,在根據每一個需求獲取相應解決方案時,先尋找開源組件,看是否已經有滿足某些功能需求的開源組件,如果沒有,再考慮自主開發或者向第三方購買,否則盡量采用開源組件.
        請盡量享用開源的魅力,盡情的擁抱開源吧。
        好了,終于寫完了,有什么問題請聯系我,大家互相交流交流。

    posted on 2007-12-09 21:30 都市淘沙者 閱讀(792) 評論(1)  編輯  收藏 所屬分類: Hibernate/ORM

    評論

    # re: 利用Jakarta Commons組件beanutils、dbutils簡化JDBC數據庫操作(轉) 2008-11-28 16:48 網絡時空

    這篇文章寫得太好了!不過,要是將query傳遞多個參數的情況,也加進去的話,就是一篇很好的文章了  回復  更多評論   

    主站蜘蛛池模板: 成年女人毛片免费观看97| 亚洲视频在线一区| 一级女人18毛片免费| 岛国精品一区免费视频在线观看| 精品久久亚洲中文无码| 亚洲AV人无码激艳猛片| 成人亚洲性情网站WWW在线观看| 免费黄色app网站| 国产福利在线观看免费第一福利| 毛片在线全部免费观看| av成人免费电影| 美女视频黄.免费网址| 亚洲欧洲无码一区二区三区| 亚洲高清中文字幕综合网| 亚洲国产精品无码久久一区二区| 亚洲福利精品一区二区三区| 日韩激情淫片免费看| 成人性生交大片免费看无遮挡| 足恋玩丝袜脚视频免费网站| 免费观看久久精彩视频| baoyu116.永久免费视频| 久久性生大片免费观看性| 一级黄色片免费观看| 免费无遮挡无遮羞在线看| 亚洲欧美第一成人网站7777| 国产成人精品日本亚洲专区6| 亚洲成aⅴ人片在线观| 亚洲手机中文字幕| 亚洲人成电影网站| 亚洲男人天堂2018av| 亚洲中文字幕久久精品无码2021| 亚洲精品日韩专区silk| 亚洲国产综合91精品麻豆| 亚洲国产一区二区三区青草影视| 久久精品亚洲中文字幕无码网站| 久久亚洲精品中文字幕三区| 亚洲Av永久无码精品三区在线 | 亚洲成aⅴ人片久青草影院| 国产精品色午夜视频免费看| 国产免费人人看大香伊| 四虎影视永久免费观看地址|