javaGrowing

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            92 隨筆 :: 33 文章 :: 49 評(píng)論 :: 0 Trackbacks
          二、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)行對(duì)比,這個(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存儲(chǔ)方式,可以采用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,該列對(duì)應(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,不過也許沒有必要那么做,至于原因請(qǐng)看下文。

          如果使用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存儲(chǔ)方式,可以采用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,而且我測(cè)試過采用Map的方式即第一種方式性能要好的多,采用Bean性能比較低可能是因?yàn)椴捎梅瓷涞木壒剩捎梅瓷涞臇|東性能和不采用反射的還是有點(diǎn)差距。也是這個(gè)原因,不推薦采用LazyDynaClass和LazyDynaBean,因?yàn)椴捎眠@二者是在運(yùn)行期動(dòng)態(tài)創(chuàng)建Bean類和Bean屬性,然后再創(chuàng)建Bean對(duì)象的,其性能可想而知了(不過我沒有測(cè)試過啊,所以我說這個(gè)話可說是沒有根據(jù)的,感興趣的朋友自己測(cè)試一下,記得告訴我結(jié)果哦,呵呵),除了MapListHandler以及BeanListHandler之外,DButils還提供了其他的Handler,如果這些不能滿足你的需求,你也可以自己實(shí)現(xiàn)一個(gè)Handler。
              最后,也是最大的體會(huì),也許是最大的收獲吧,那就是:對(duì)于每一個(gè)項(xiàng)目,在根據(jù)每一個(gè)需求獲取相應(yīng)解決方案時(shí),先尋找開源組件,看是否已經(jīng)有滿足某些功能需求的開源組件,如果沒有,再考慮自主開發(fā)或者向第三方購買,否則盡量采用開源組件.
              請(qǐng)盡量享用開源的魅力,盡情的擁抱開源吧。
              好了,終于寫完了,有什么問題請(qǐng)聯(lián)系我,大家互相交流交流。
          posted on 2005-12-29 22:39 javaGrowing 閱讀(285) 評(píng)論(0)  編輯  收藏 所屬分類: jsp學(xué)習(xí)
          主站蜘蛛池模板: 淅川县| 许昌市| 北宁市| 杂多县| 孟村| 秭归县| 余庆县| 日照市| 仪陇县| 历史| 丰原市| 华池县| 绥芬河市| 昭平县| 万山特区| 西吉县| 邯郸市| 平定县| 农安县| 图们市| 隆化县| 五家渠市| 临桂县| 南昌县| 奎屯市| 株洲县| 区。| 木兰县| 赫章县| 罗定市| 米脂县| 昆山市| 泸水县| 海兴县| 峡江县| 建始县| 安阳市| 万山特区| 武清区| 安泽县| 抚顺县|