首页 > 开发 > 综合 > 正文

用组件beanutils,dbutils简化JDBC操作

2024-07-21 02:14:59
字体:
来源:转载
供稿:网友

    虽然现在出现了很多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开发。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表