雖然現在出現了很多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,腳本如下:
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來實現同樣的類,之后看看他們之間有什么不同,用resultsetdynaclass處理的源代碼如下所示:
然后用你喜歡的編輯器建立一個類beanutilsjdbctest,我們先用resultsetdynaclass來處理,然后再用rowsetdynaclass來實現同樣的類,之后看看他們之間有什么不同,用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;
}
}
這兩個方法輸出的結果應該是一樣的。但是很顯然第二種方式比第一種方式要好,它把數據訪問部分抽取出來放到一個方法中,顯得簡單清晰。
其實在利用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了。
雖然現在出現了很多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,腳本如下:
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來實現同樣的類,之后看看他們之間有什么不同,用resultsetdynaclass處理的源代碼如下所示:
然后用你喜歡的編輯器建立一個類beanutilsjdbctest,我們先用resultsetdynaclass來處理,然后再用rowsetdynaclass來實現同樣的類,之后看看他們之間有什么不同,用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;
       }
}
這兩個方法輸出的結果應該是一樣的。但是很顯然第二種方式比第一種方式要好,它把數據訪問部分抽取出來放到一個方法中,顯得簡單清晰。
其實在利用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了。
未完待續……
,歡迎訪問網頁設計愛好者web開發。| 
 
 | 
新聞熱點
疑難解答