优雅天平

享受喧嚣 安于平静
posts(18) comments(167) trackbacks(0)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案(18)

  • 2006年4月 (1)
  • 2006年3月 (1)
  • 2005年12月 (3)
  • 2005年10月 (2)
  • 2005年9月 (1)
  • 2005年7月 (2)
  • 2005年6月 (3)
  • 2005年3月 (2)
  • 2005年2月 (3)

文章分类(62)

  •  eclipse(2)
  •  Guitar(11)
  •  J2EE相关(5)
  •  JAVA基础(7)
  •  Solaris相关(1)
  •  WAP相关(1)
  •  web services(12)
  •  web页面基础(4)
  •  开源相关(16)
  •  数据库/仓库(2)
  •  模式相关(1)

文章档案(61)

  • 2006年2月 (1)
  • 2006年1月 (3)
  • 2005年12月 (32)
  • 2005年11月 (8)
  • 2005年9月 (6)
  • 2005年8月 (1)
  • 2005年6月 (6)
  • 2005年5月 (1)
  • 2005年3月 (1)
  • 2005年2月 (2)

相册

  • 大事记
  • 我的照片

blog

  • 小江西
  • 铁手剑谱的blog-strust
  • 陶永胜书法艺术中心

站点搜藏

  • Matrix-与Java共舞
  • OpenSource
  • 中国java开发网

搜索

  •  

积分与排名

  • 积分 - 142179
  • 排名 - 438

最新评论

  • 1. re: JFreeChart完全攻略示例各种方法和属性[未登录]
  • sdfg
  • --111
  • 2. re: JFreeChart完全攻略示例各种方法和属性
  • 分数线烦不烦很舒服发个号发给合适的给他发所提供合适的土壤规范不能是纳税人他呢过生日能接受洒脱人呢是vae回复身体然后呢托管人粉红丝带让他反感 受托人复活币善待他人回事
  • --倒萨倒
  • 3. re: Jcreator注册码[未登录]
  • 有谁有jcreator 5.0 pro的注册码呀?跪求
  • --liu
  • 4. re: 开启log4j的记录源代码行号的配置,会对系统性能产生影响!
  • 怎么说呢?理解的有点片面。。。jdk1.4之前的话的确对性能影响比较大,自从1.4开始引入了StackTraceElement之后,对性能影响不是那么大。。。
  • --黄大仙
  • 5. re: 请问MYECLIPSE在哪里输入注册码呀?[未登录]
  • 对我这个初学者有帮助,嘿嘿。
  • --Flyer

阅读排行榜

  • 1. Jcreator注册码(22630)
  • 2. java日期相减问题(20239)
  • 3. Myeclipse注册码(13938)
  • 4. jbuilder 2006 破解文件(13684)
  • 5. 修改 Oracle9i 8080端口问题(2884)

评论排行榜

  • 1. jbuilder 2006 破解文件(58)
  • 2. Jcreator注册码(50)
  • 3. Myeclipse注册码(18)
  • 4. JBuilder2005光标问题更好的解决方法(6)
  • 5. B/S结构程序等待查询结果超时问题(5)

View Post

实施Jakarta Commons-DbUtils

作者: Builder.com
Monday, April 26 2004 4:43 PM

JDBC码是Java译码的一个部分,它给已写的编码带来了数量惊人的重复。另外,JDBC码几乎会经常性的带来一些低级错误。写出好的JDBC编码并不难,但是很痛苦。

Click here to find out more!


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编码。(你可能要改变在例子中所规定的用户名和密码,这是以你的具体的数据库配置为基础的。)

这个编码遵从以下步骤:

Click here to find out more!

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的项目中去使用。

DBUtils的JUnit例子:

//使用dbutils1.0版本

import java.util.*;
import java.util.logging.*;
import java.sql.*;
import org.apache.commons.dbutils.*;
import org.apache.commons.dbutils.handlers.*;

public class TestDBUnits {
 
 public static void main(String[]args) throws Exception {
  TestDBUnits test = new TestDBUnits();
  
  for(int i = 0 ; i < 1 ; i++) {   
   test.testQuery1();
   test.testQuery2();
   test.testUpdate();
  }
 }
 
 public void testQuery1(){
  try {
   QueryRunner qr = new QueryRunner() ;
   ResultSetHandler rsh = new ArrayListHandler();   
   String strsql = "select * from test1";   
   ArrayList result = (ArrayList)qr.query(getConnection() ,strsql ,rsh);
   //System.out.print("");
  } catch(Exception ex) {
   ex.printStackTrace(System.out);
  }
 }
 
 public void testQuery2(){
  try {
   QueryRunner qr = new QueryRunner() ;
   ResultSetHandler rsh = new MapListHandler();   
   String strsql = "select * from test1";   
   ArrayList result = (ArrayList)qr.query(getConnection() ,strsql ,rsh);
   for(int i = 0 ; i < result.size() ; i++) {
    Map map = (Map)result.get(i);
    //System.out.println(map);    
   }
   //System.out.print("");
  } catch(Exception ex) {
   ex.printStackTrace(System.out);
  }
 }
 
 public void testUpdate(){
  try {
   QueryRunner qr = new QueryRunner() ;
   ResultSetHandler rsh = new ArrayListHandler();
   String strsql = "insert test1(page ,writable ,content)values('ttt','ttt','faskldfjklasdjklfjasdklj')";
   qr.update(getConnection() ,strsql);
   //System.out.print("");
  } catch(Exception ex) {
   ex.printStackTrace(System.out);
  }
 }
 
 private  Connection getConnection() throws InstantiationException,
   IllegalAccessException, ClassNotFoundException, SQLException {
  
  String strDriver = "org.gjt.mm.mysql.Driver";
  String strUrl = "jdbc:mysql://localhost:3306/test";
  String strUser = "root";
  String strPass = "";
   
  Class.forName(strDriver).newInstance();  
  return DriverManager.getConnection(strUrl, strUser, strPass);
 }
}

posted on 2005-11-30 10:18 Victor 阅读(1274) 评论(0)  编辑  收藏 所属分类: 开源相关

新用户注册  刷新评论列表  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问   管理
相关文章:
  • JFreeChart完全攻略示例各种方法和属性
  • 开启log4j的记录源代码行号的配置,会对系统性能产生影响!
  • Java开源Blog实现,Roller 2.0 的安装手记! (转)
  • Jakarta-Common-BeanUtils研究心得(2)[转载]
  • Jakarta-Common-BeanUtils研究心得(1)[转载]
  • 实施Jakarta Commons-DbUtils
  • 实现图形JSF组件
  • 用Spring改进J2EE编程
  • NetUI页面流:Struts的发展
  • Ajax简介(转自EBA)
 
 
Powered by:
BlogJava
Copyright © Victor