javaGrowing

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

                   然后用你喜歡的編輯器建立一個類BeanutilsJDBCTest,我們先用ResultSetDynaClass來處理,然后再用RowSetDynaClass來實現(xiàn)同樣的類,之后看看他們之間有什么不同,用ResultSetDynaClass處理的源代碼如下所示:
                   然后用你喜歡的編輯器建立一個類BeanutilsJDBCTest,我們先用ResultSetDynaClass來處理,然后再用RowSetDynaClass來實現(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 自動生成 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;
                 }

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

          posted on 2005-12-29 22:41 javaGrowing 閱讀(288) 評論(0)  編輯  收藏 所屬分類: jsp學(xué)習(xí)
          主站蜘蛛池模板: 电白县| 车致| 荆门市| 新化县| 南郑县| 井冈山市| 华容县| 雷波县| 梁山县| 团风县| 黄石市| 松阳县| 琼结县| 临泉县| 辽宁省| 金川县| 玉环县| 青海省| 江油市| 通道| 石狮市| 威远县| 牙克石市| 兰考县| 达日县| 兰坪| 多伦县| 蒙城县| 建瓯市| 苏州市| 金坛市| 湘阴县| 汨罗市| 南乐县| 甘肃省| 常宁市| 长沙县| 新巴尔虎左旗| 九江县| 谷城县| 交口县|