程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用組件beanutils,dbutils簡化JDBC操作

用組件beanutils,dbutils簡化JDBC操作

編輯:關於JAVA

雖然現在出現了很多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了。

未完待續……

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved