虽然现在出现了很多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开发。新闻热点
疑难解答