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

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

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

    javaGrowing

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      92 隨筆 :: 33 文章 :: 49 評(píng)論 :: 0 Trackbacks
    關(guān)鍵字:beanutils、dbutils、JDBC 數(shù)據(jù)庫(kù)
    摘要:本文簡(jiǎn)單介紹了Jakarta Commons旗下beanutils、dbutils在基于JDBC API數(shù)據(jù)庫(kù)存取操作中的運(yùn)用。
         雖然現(xiàn)在出現(xiàn)了很多ORM框架,可是還是有很多朋友也許還在使用JDBC,就像我現(xiàn)在一樣,除了學(xué)習(xí)的時(shí)候在使用Hibernate、Spring類似這些優(yōu)秀的框架,工作時(shí)一直都在使用JDBC。本文就簡(jiǎn)單介紹一下利用Jakarta Commons旗下beanutils、dbutils簡(jiǎn)化JDBC數(shù)據(jù)庫(kù)操作,以拋磚引玉,希望對(duì)像我一樣在使用JDBC的朋友有所幫助。
        下面就分兩部分簡(jiǎn)單介紹beanutils、dbutils在基于JDBC API數(shù)據(jù)庫(kù)存取操作中的運(yùn)用。第一部分顯介紹beanutils在JDBC數(shù)據(jù)庫(kù)存取操作中的運(yùn)用,第二部分介紹dbutils在JDBC數(shù)據(jù)庫(kù)存取操作中的運(yùn)用,最后看看他們的優(yōu)缺點(diǎn),談?wù)劚救嗽陧?xiàng)目運(yùn)用過(guò)程中對(duì)他們的一點(diǎn)心得體會(huì),僅供參考,其中有錯(cuò)誤的地方希望大蝦不吝賜教,大家多多交流共同進(jìn)步。
    一、Jakarta Commons beanutils
           Beanutils是操作Bean的銳利武器,其提過(guò)的BeanUtils工具類可以簡(jiǎn)單方便的讀取或設(shè)置Bean的屬性,利用Dyna系列,還可以在運(yùn)行期創(chuàng)建Bean,符合懶人的習(xí)慣,正如LazyDynaBean,LazyDynaClass一樣,呵呵。這些用法已經(jīng)有很多文章提及,也可以參考apache的官方文檔。
    對(duì)于直接利用JDBC API訪問(wèn)數(shù)據(jù)庫(kù)時(shí)(這里針對(duì)的是返回結(jié)果集ResultSet的查詢select),大多數(shù)都是采用兩種方式,一種是取出返回的結(jié)果集的數(shù)據(jù)存于Map中,另一種方式是Bean里。針對(duì)第二種方式,Beanutils里提供了ResultSetDynaClass結(jié)合DynaBean以及RowSetDynaClass結(jié)合DynaBean來(lái)簡(jiǎn)化操作。下面用以個(gè)簡(jiǎn)單的例子展示一下beanutils的這兩個(gè)類在JDBC數(shù)據(jù)庫(kù)操作中的運(yùn)用。
    請(qǐng)?jiān)诒緳C(jī)建立數(shù)據(jù)庫(kù)publish,我用的是MySQL,在publish數(shù)據(jù)庫(kù)中建立表book,腳本如下:
    CREATE TABLE book(
      id int(11) NOT NULL auto_increment,
      title varchar(50) character set latin1 NOT NULL,
      authors varchar(50) character set latin1 default NULL, 
      PRIMARY KEY  (id)

             然后用你喜歡的編輯器建立一個(gè)類BeanutilsJDBCTest,我們先用ResultSetDynaClass來(lái)處理,然后再用RowSetDynaClass來(lái)實(shí)現(xiàn)同樣的類,之后看看他們之間有什么不同,用ResultSetDynaClass處理的源代碼如下所示:
             然后用你喜歡的編輯器建立一個(gè)類BeanutilsJDBCTest,我們先用ResultSetDynaClass來(lái)處理,然后再用RowSetDynaClass來(lái)實(shí)現(xiàn)同樣的類,之后看看他們之間有什么不同,用ResultSetDynaClass處理的源代碼如下所示:
    package cn.qtone.test;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Iterator; 
    import org.apache.commons.beanutils.DynaBean;
    import org.apache.commons.beanutils.PropertyUtils;
    import org.apache.commons.beanutils.ResultSetDynaClass; 
    public class BeanutilsJDBCTest{
           public static void main(String[] args) {
                  Connection con = null;
                  Statement st = null;
                  ResultSet rs = null;
                  try {
                         Class.forName("com.mysql.jdbc.Driver");
                         String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
                         con = DriverManager.getConnection(url, "root", "hyys");
                         st = con.createStatement();
                         rs = st.executeQuery("select * from book");
                         ResultSetDynaClass rsDynaClass = new ResultSetDynaClass(rs);
                         Iterator itr = rsDynaClass.iterator();
                         System.out.println("title-------------authors");
                         while (itr.hasNext()) {
                                DynaBean dBean = (DynaBean) itr.next();
                                System.out.println(PropertyUtils.getSimpleProperty(dBean,"title")
                                              + "-------------"+ PropertyUtils.getSimpleProperty(dBean, "authors"));
                         }
                  } catch (Exception e) {
                         e.printStackTrace();
                  } finally {
                         try {
                                if (rs != null) {
                                       rs.close();
                                }
                                if (st != null) {
                                       st.close();
                                }
                                if (con != null) {
                                       con.close();
                                }
                         } catch (Exception e) {
                                e.printStackTrace();
                         }
                  }
           }

    用RowSetDynaClass處理的源代碼如下所示: 
    package cn.qtone.test; 
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Iterator;
    import java.util.List; 
    import org.apache.commons.beanutils.DynaBean;
    import org.apache.commons.beanutils.PropertyUtils;
    import org.apache.commons.beanutils.RowSetDynaClass; 
    public class BeanutilsJDBCTest{
           public static void main(String[] args) {
                  List rsDynaClass = rsTest();
                  System.out.println("title ------------- authors ");
                  Iterator itr = rsDynaClass.iterator();
                  while (itr.hasNext()) {
                         DynaBean dBean = (DynaBean) itr.next();
                         try {
                                System.out.println(PropertyUtils.getSimpleProperty(dBean,"name")
                                              + "-------------"+ PropertyUtils.getSimpleProperty(dBean, "mobile"));
                         } catch (Exception e) {
                                // TODO 自動(dòng)生成 catch 塊
                                e.printStackTrace();
                         }
                  }
           } 
           private static List rsTest() {
                  Connection con = null;
                  Statement st = null;
                  ResultSet rs = null;
                  try {
                         Class.forName("com.mysql.jdbc.Driver");
                         String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
                         con = DriverManager.getConnection(url, "root", "hyys");
                         st = con.createStatement();
                         rs = st.executeQuery("select * from book");
                         RowSetDynaClass rsdc = new RowSetDynaClass(rs);
                         return rsdc.getRows();
                  } catch (Exception e) {
                         e.printStackTrace();
                  } finally {
                         try {
                                if (rs != null) {
                                       rs.close();
                                }
                                if (st != null) {
                                       st.close();
                                }
                                if (con != null) {
                                       con.close();
                                }
                         } catch (Exception e) {
                                e.printStackTrace();
                         }
                  }
                  return null;
           }

    這兩個(gè)方法輸出的結(jié)果應(yīng)該是一樣的。但是很顯然第二種方式比第一種方式要好,它把數(shù)據(jù)訪問(wèn)部分抽取出來(lái)放到一個(gè)方法中,顯得簡(jiǎn)單清晰。
    其實(shí)在利用ResultSetDynaClass時(shí),必須在ResultSet等數(shù)據(jù)庫(kù)資源關(guān)閉之前,處理好那些數(shù)據(jù),你不能在資源關(guān)閉之后使用DynaBean,否則就會(huì)拋出異常,異常就是說(shuō)不能在ResultSet之后存取數(shù)據(jù)(具體的異常名我也忘了),當(dāng)然你也可以采用以前的方式一個(gè)一個(gè)的把數(shù)據(jù)放到Map里,如果你一定要那樣做,建議還是別用Beanutils,因?yàn)檫@沒(méi)帶給你什么好處??傊肦esultSetDynaClass你的程序的擴(kuò)展性非常部好。
    從第二中方式可以看出,利用RowSetDynaClass可以很好的解決上述ResultSetDynaClass遇到的問(wèn)題,RowSetDynaClass的getRows()方法,把每一行封裝在一個(gè)DynaBean對(duì)象里,然后,把說(shuō)有的行放到一個(gè)List里,之后你就可以對(duì)返回的List里的每一個(gè)DynaBean進(jìn)行處理,此外對(duì)于DynaBean你還可以采用標(biāo)準(zhǔn)的get/set方式處理,當(dāng)然你也可以用PropertyUtils. getSimpleProperty(Object bean, String name)進(jìn)行處理。
    從上面的分析中,你應(yīng)該可以決定你應(yīng)該使用ResultSetDynaClass還是RowSetDynaClass了。

    posted on 2005-12-29 22:41 javaGrowing 閱讀(294) 評(píng)論(0)  編輯  收藏 所屬分類: jsp學(xué)習(xí)
    主站蜘蛛池模板: 亚洲精品无码精品mV在线观看| 亚洲AV无码一区东京热久久| 亚洲AV乱码久久精品蜜桃| 亚洲一区在线观看视频| 黄页网站在线免费观看| 午夜影院免费观看| 麻豆国产人免费人成免费视频 | 四虎影视永久免费观看| 亚洲av永久无码精品国产精品| 亚洲色偷偷综合亚洲AV伊人蜜桃| 成人妇女免费播放久久久| 一个人看www在线高清免费看| 国产亚洲成人在线播放va| 亚洲偷偷自拍高清| 99在线视频免费观看| 成年在线网站免费观看无广告| 国产V亚洲V天堂无码| 亚洲精品无码av片| 99在线观看视频免费| 亚洲美女高清一区二区三区| 亚洲国产成人99精品激情在线| 99热在线日韩精品免费| 日韩成全视频观看免费观看高清| 亚洲欧洲免费视频| 一级中文字幕乱码免费| 成人毛片免费观看| 亚洲男人天堂av| 中文字幕在线成人免费看| 国产老女人精品免费视频| 亚洲日韩乱码久久久久久| 美女无遮挡拍拍拍免费视频| 精品国产免费一区二区| 亚洲天堂中文字幕在线观看| 三级网站在线免费观看| 免费在线黄色网址| 亚洲偷自拍另类图片二区| 91av免费观看| 亚洲国产另类久久久精品| 特级aaaaaaaaa毛片免费视频| 四虎永久在线观看免费网站网址 | 国产性生交xxxxx免费|