DBUtils用法详解

jdbc码是java译码的一个部分,它给已写的编码带来了数量惊人的重复。另外,jdbc码几乎会经常性的带来一些低级错误。写出好的jdbc编码并不难,但是很痛苦。
dbutils组件是一个精密而简单的组件,它并不做什么复杂的事而仅仅只是使很多的jdbc任务对开发者来说变得稍容易一点。尽管这时候很多持久框架和包都可以用来使数据持久变得更容易,然而jdbc仍然是大多数java和java2企业版(j2ee)开发者赖以生存的工具。因此,任何能让使用jdbc工作更容易的东西都是好消息。
dbutils可以
免费下载,它不依赖于任何其它的通用组件而只是依赖下面这些:

  • java development kit (jdk) 1.2 (or later)
  • jdbc 2.0 (or later)

 dbutils文档并不是最好的,但是足以使你的工作正常进行。在下一节,你会看到dbutils中最有用的类以及一些关于它们的用法的例子。你应该能够很容易地使用这些编码和例子,然后能够马上在你自己的项目中开始使用dbutils。我将会集中精力于两个类(org.apache.commons.dbutils.dbutils  和org.apache.commons.dbutils.queryrunner)和一个接口(org.apache.commons.dbutils.resultsethandler).在我给你们一些关于它们的用法的例子之前,让我们深入dbutils里面来仔细看看它给我们提供了些什么。

dbutils

dbutils是一个为做一些诸如关闭连接、装载jdbc驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。

这个类里的重要方法有:

  • close:dbutils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是null,如果不是的话,它们就关闭连接、声明和结果集(resultset)。
  • closequietly: closequietly这一方法不仅能在连接、声明或者结果集(resultset)为null情况下避免关闭,还能隐藏一些在程序中抛出的sqleeception。如果你不想捕捉这些异常的话,这对你是非常有用的。在重载closequietly方法时,特别有用的一个方法是closequietly(connection conn,statement stmt,resultset rs),这是因为在大多数情况下,连接、声明和结果集(resultset)是你要用的三样东西,而且在最后的块你必须关闭它们。使用这一方法,你最后的块就可以只需要调用这一方法即可。
  • commitandclosequietly(connection conn):这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些sql异常。
  • loaddriver(string driveclassname): 这一方法装载并注册jdbc驱动程序,如果成功就返回true。使用这种方法,你不需要去捕捉这个异常classnotfoundexception。使用loaddrive方法,编码就变得更容易理解,你也就得到了一个很好的boolean返回值,这个返回值会告诉你驱动类是不是已经加载成功了。
resultsethandler
 
Click here to find out more!  

正如它的名字所提示的,这一接口执行处理一个jaca.sql.resultset,将数据转变并处理为任何一种形式,这样有益于其应用而且使用起来更容易。这一组件提供了arrayhandler, arraylisthandler, beanhandler, beanlisthandler, maphandler, maplisthandler, and scalarhandler等执行程序。 

resultsethandler接口提供了一个单独的方法:object handle (java.sql.resultset .rs)。因此任何resultsethandler 的执行需要一个结果集(resultset)作为参数传入,然后才能处理这个结果集,再返回一个对象。因为返回类型是java.lang.object,所以除了不能返回一个原始的java类型之外,其它的返回类型并没有什么限制。如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。

qreryrunner

这个类使执行sql查询简单化了,它与resultsethandler串联在一起有效地履行着一些平常的任务,它能够大大减少你所要写的编码。queryrunner类提供了两个构造器:其中一个是一个空构造器,另一个则拿一个 javax.sql.datasource 来作为参数。因此,在你不用为一个方法提供一个数据库连接来作为参数的情况下,提供给构造器的数据源(datasource) 被用来获得一个新的连接并将继续进行下去。

这一类中的重要方法包括以下这些:

  • query(connection conn, string sql, object[] params, resultsethandler rsh):这一方法执行一个选择查询,在这个查询中,对象阵列的值被用来作为查询的置换参数。这一方法内在地处理preparedstatement 和resultset  的创建和关闭。resultsethandler对把从 resultset得来的数据转变成一个更容易的或是应用程序特定的格式来使用。
  • query(string sql, object[] params, resultsethandler rsh):这几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造器的数据源(datasource) 或使用的setdatasource 方法中重新获得的。
  • query(connection conn, string sql, resultsethandler rsh):这执行一个不要参数的选择查询。
  • update(connection conn, string sql, object[] params):这一方法被用来执行一个插入、更新或删除操作。对象阵列为声明保存着置换参数。

现在让我们来看一个例子,在这里你可以从一个数据库中获得一些数据。比如说,我正在使用mysql 数据库.你还需要下载mysql jdbc驱动程序。我正在使用的mysql数据库在本地主机,端口号为3306上运行。这个数据库地名字叫做test。你将要用到的student表的结构如下:
columns    type
-------    ----
studid     int
name      varchar

在列表a中,你将会从student表中得到一些信息,而且你可以按照你自己的额外需要修改这些信息。尽管你在使用jdbc,但要注意你几乎没写jdbc编码。(你可能要改变在例子中所规定的用户名和密码,这是以你的具体的数据库配置为基础的。)

这个编码遵从以下步骤:

 

1.加载jdbc驱动程序类,并用drivermanager来得到一个数据库连接。
2.例示 queryrunner 类。
3.使用连接、sql查询、参数和resultsethandler来作为输入的查询方法。你使用一个类org.apache.commons.dbutils.handlers.maplisthandler,一个类 maplisthandler来获得一个结果集(resultset)并返回一个jaca.util.map的实例java.util.list。因此结果集(resultset) 的每一行都变成了一个java.util.map,所有这些java.util.map的实例绑在一起放在一个java.util.list 中。

4. 反复得到列表(list)的值就是通过在列表(list)中获得每一个map的值。

5.用queryrunner 来执行一个没有参数的方法。在这里你要用beanlisthandler ,它是一个非常有用的resultsethandler ,因为你可以把resultset 转变成一个指定的bean的列表中。这时你可以指定一个bean类到bean studentbean中,如同在列表b中所显示的那样。

6. 你通过反复从列表(list)中得到多个bean,然后就可从每一个studentbean实例中获取值。

注释:在列表b中,studentbean 类中的studid 必须是int,这是因为表student的studid列的类型是int。坚持这个类型的匹配是我们需要遵从的唯一规则。 

因为在这种情况下,studentbean 类的属性和表student 的字段是完好的对映着的,只要将stuentbean 类作为一个参数就是一个技巧。字段值用和字段名一样的名字插入到类的属性中。然而,如果你想要更多地控制bean的创建,则类beanlisthandler提供了第二个构造器:beanlisthandler(java.lang.class type, rowprocessor convert). 接口rowprocessor的执行把结果集(resultset)的各行转化成一个对象组。在 studentbean这一案例中,rowprocessor中的basicrowprocessor 的执行被利用上了,它能够执行这项任务。然而,你可以写一个新的执行并把它提供给beanlisthandler的构造器。 

当然,执行这一编码的输出取决于你从表student中获得哪些数据。对我来说,我得到了以下这些输出:
***using maplisthandler***
  id >>1
  name >>one
  id >>2
  name >>two
***using beanlisthandler***
  id >>1
  name >>one
  id >>2
  name >>two
  id >>3
  name >>three

除了到目前为止你已经看了的类以外,另外一些你需要研究的类是:

  • org.apache.commons.dbutils.queryloader:queryloader是一个从一个文件加载查询到一个map的简单的类。然后,当需要的时候,你从 map 中选择一些查询。在没有专门去接触代码的情况下,一个文件中的having查询也可以改变得尽可能的简单。
  • org.apache.commons.dbutils.wrappers.sqlnullcheckedresultset:这个类对使用一个系统方法来解决null值问题是很有用的。用一个 sqinullcheckedresultset 的实例来限制一个常规的结果集(resultset) ,然后详细地说明在遇null值的情况下应该做些什么。
  • org.apache.commons.dbutils.wrappers.stringtrimmedresultset:用类stringtrimmedresultset 来约束一个结果集,这样一来,你就可以修整所有getstring()和getobject()方法返回的字符串。

dbutils 组件很好也很小巧,很值得在所有用到jdbc的项目中去使用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值