javaGrowing

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            92 隨筆 :: 33 文章 :: 49 評論 :: 0 Trackbacks
          <2005年12月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(12)

          隨筆分類(84)

          隨筆檔案(92)

          文章分類(32)

          文章檔案(33)

          相冊

          收藏夾(1)

          ajax

          java

          java專家論壇

          linux

          Oracle

          PHP

          sap

          xml

          其他

          好站鏈接

          英語學(xué)習(xí)

          軟件下載

          電子書

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          二、Jakarta Commons dbutils:
              用JDBC API時(shí)最令人討厭的就是異常處理,也很煩瑣,而且很容易出錯(cuò),本人曾考慮過利用模板進(jìn)行處理,后來看到了dbutils,之后就采用那個(gè)dbutils,采用模板的方式各位朋友可以參考Spring,Spring的JdbcTemplate不靈活而強(qiáng)大,呵呵,說句閑話,實(shí)在太佩服Rod Johnson了,Rod Johnson真的很令人尊敬。
              Dbutils的QueryRunner把大多數(shù)與關(guān)閉資源相關(guān)的封裝起來,另外,你也可以使用DbUtils進(jìn)行關(guān)閉,當(dāng)然DbUtils提供的功能當(dāng)然不止這些,它提過了幾個(gè)常用的靜態(tài)方法,除了上述的關(guān)閉資源外,DbUtils. commitAndClose(Connection conn)還提供事務(wù)提及等操作。
          還是以一個(gè)例子來說說吧,畢竟我不是搞業(yè)務(wù)的,小嘴巴吧嗒吧噠不起來啊,呵呵。
              為了和采用Beanutils更好的進(jìn)行對比,這個(gè)例子還是實(shí)現(xiàn)同樣的功能,數(shù)據(jù)庫同樣采用前一篇文章中提到的publish。
          同樣的,用你喜歡的編輯器建立一個(gè)類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í),它把數(shù)據(jù)庫中的每一行映射成一個(gè)Map,其中列名作為Key,該列對應(yīng)的值作為Value存放,查詢的所有的數(shù)據(jù)一起放在一個(gè)List里,然后進(jìn)行處理,當(dāng)然,一個(gè)更明智的處理是直接返回List然后再單獨(dú)進(jìn)行處理。
          事實(shí)上上例返回的結(jié)果集中的每一行不必放在一個(gè)Map里,你可以放在一個(gè)Bean里,當(dāng)然如果你真的很懶,你也可以使用Beanutils的LazyDynaClass和LazyDynaBean,不過也許沒有必要那么做,至于原因請看下文。

          如果使用Bean而不是用Map,那么,你也許需要建立一個(gè)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)該是一樣的。兩種處理方式都差不多,但我更愿意采用第一種,因?yàn)榈谝环N少寫一個(gè)bean,而且我測試過采用Map的方式即第一種方式性能要好的多,采用Bean性能比較低可能是因?yàn)椴捎梅瓷涞木壒剩捎梅瓷涞臇|東性能和不采用反射的還是有點(diǎn)差距。也是這個(gè)原因,不推薦采用LazyDynaClass和LazyDynaBean,因?yàn)椴捎眠@二者是在運(yùn)行期動(dòng)態(tài)創(chuàng)建Bean類和Bean屬性,然后再創(chuàng)建Bean對象的,其性能可想而知了(不過我沒有測試過啊,所以我說這個(gè)話可說是沒有根據(jù)的,感興趣的朋友自己測試一下,記得告訴我結(jié)果哦,呵呵),除了MapListHandler以及BeanListHandler之外,DButils還提供了其他的Handler,如果這些不能滿足你的需求,你也可以自己實(shí)現(xiàn)一個(gè)Handler。
              最后,也是最大的體會,也許是最大的收獲吧,那就是:對于每一個(gè)項(xiàng)目,在根據(jù)每一個(gè)需求獲取相應(yīng)解決方案時(shí),先尋找開源組件,看是否已經(jīng)有滿足某些功能需求的開源組件,如果沒有,再考慮自主開發(fā)或者向第三方購買,否則盡量采用開源組件.
              請盡量享用開源的魅力,盡情的擁抱開源吧。
              好了,終于寫完了,有什么問題請聯(lián)系我,大家互相交流交流。
          posted on 2005-12-29 22:39 javaGrowing 閱讀(286) 評論(0)  編輯  收藏 所屬分類: jsp學(xué)習(xí)
          主站蜘蛛池模板: 罗山县| 牟定县| 黄大仙区| 大宁县| 武邑县| 县级市| 嵊州市| 保靖县| 当雄县| 安义县| 禄丰县| 大方县| 巴林左旗| 博罗县| 镇雄县| 靖州| 肥乡县| 昌邑市| 舞阳县| 资兴市| 兴山县| 武穴市| 璧山县| 万宁市| 新郑市| 海口市| 霍林郭勒市| 岳池县| 界首市| 黔江区| 治多县| 贵州省| 景泰县| 东兰县| 普兰店市| 永寿县| 仙居县| 福贡县| 舞钢市| 丘北县| 青阳县|