1.      介绍

commons-dbutils是Apache组织提供的一个开源 JDBC工具类库,能让我们更简单的使用JDBC。它是一个非常小的类包,花几分钟的时间就能掌握它的使用。

2.      下载

进入apache官方网站的commons-dbutils网页:http://commons.apache.org/dbutils/

选择左边导航栏的Download进入下载页面:

Binary:是编译好的jar包;source是源代码包。下载一份Binary到本地。解开后如下图所示:

其中commons-dbutils-1.1.jar就是供使用的jar包;docs是这个组件的帮助文档。下面就通过示例介绍它的使用。

3.      API介绍

commons-dbutils是一个非常小的类包, 无需花费太多时间去阅读它的doc,核心只是两个类org.apache.commons.dbutils.DbUtils、org.apache.commons.dbutils.QueryRunner和一个接口org.apache.commons.dbutils.ResultSetHandler。

3.1.    DbUtils

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

这个类里的重要方法有:

n  public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。

n  public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。如果你不想捕捉这些异常的话,这对你是非常有用的。在重载CloseQuietly方法时,特别有用的一个方法是closeQuietly(Connection
conn,Statement stmt,ResultSet rs),这是因为在大多数情况下,连接、声明和结果集(ResultSet)是你要用的三样东西,而且在最后的块你必须关闭它们。使用这一方法,你最后的块就可以只需要调用这一方法即可。

n  public static void CommitAndCloseQuietly(Connection conn): 这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些SQL异常。

n  public static boolean loadDriver(java.lang.String driverClassName):这一方法装载并注册JDBC驱动程序,如果成功就返回true。使用这种方法,你不需要去捕捉这个异常ClassNotFoundException。

3.2.    QueryRunner类

这个类简单化了执行SQL查询,它与ResultSetHandler组合在一起使用就可能完成大部分的数据库操作,它能够大大减少你所的编码量。

QueryRunner类提供了两个构造方法:一个是默认的构造方法;另一个需要一个 javax.sql.DataSource 来作为参数。因此,在你不用为一个方法提供一个数据库连接的情况下,提供给构造器的DataSource)被用来获得一个新的连接并将继续进行下去。

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

n  public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws
SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法它会内在地处理PreparedStatement 和ResultSet 的创建和关闭。最重要的是参数ResultSetHandler会把从 ResultSet中获得的数据转换成一个更容易的或是应用程序特定的格式供我们使用。

n  public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 这几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得的。

n  public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。

n  public int update(Connection conn, String sql, Object[] params) throws
SQLException:用来执行一个更新(插入、更新或删除)操作。

n  public int update(Connection conn, String sql) throws SQLException:用来执行一个更新操作,不需要置换参数。

3.3.    ResultSetHandler接口

正如它的名字所提示的,这一接口执行处理一个jaca.sql.ResultSet,将数据按要求转换为另一种形式。

ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。因此任何ResultSetHandler 的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。因为返回类型是java.lang.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。。

common-dbutils组件包针对这个接口提供了九个实现类:

n  ArrayHandler:把结果集中的第一行数据转成对象数组。

n  ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。

n  BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

n  BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

n  ColumnListHandler:将结果集中某一列的数据存放到List中。

n  KeyedHandler:将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key把每个Map再存放到一个Map里。

n  MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

n  MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

n  ScalarHandler:将结果集中某一条记录的其中某一列的数据存成Object

如果这九个实现类中没有任何一个提供了你想要的服务,你可以自己写一个实现类。

3.4.    其它类和接口

org.apache.commons.dbutils.QueryLoader类:属性文件加载器,主要用于加载属性文件中的SQL到内存中。

org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet类:这个类是用来对sql语句执行完成之后的的数值进行null的替换。

org.apache.commons.dbutils.wrappers.StringTrimmedResultSet类:  去除ResultSet中字段的左右空格。

org.apache.commons.dbutils.RowProcessor接口: 它提供了把结果集的行数据转换成其它格式的功能。它的实现类是org.apache.commons.dbutils.BasicRowProcessor类。

4.      使用

4.1.    准备数据库表

这边使用MySQL5数据库服务器,数据库名是test,建表语句:

CREATE TABLE `employee` (

`id` int(11) NOT NULL auto_increment,

`name` varchar(50) default NULL,

`age` int(11) default NULL,

`position` varchar(50) default NULL,

PRIMARY KEY  (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据如下:

4.2.    创建java工程

整个工程结构如下图所示

主要的两个类,一个是Employee实体类,另一个是EmployeeDao类。

4.2.1.   Employee

/**

* ClassName: Employee.java

* Author: qiujy

* CreateTime: 2008-8-20

* EMAIL: qjyong@gmail.com

* Copyright 2008 ++YONG All rights reserved.

*/

package org.qiujy.domain;

/** 员工实体类 */

public class Employee {

private int id;

private String name;

private int age;

private String position;

public Employee() {

}

public Employee(int age, String name, String position) {

super();

this.age = age;

this.name = name;

this.position = position;

}

//以下省略所有属性的getter和setter

……

@Override

public String toString() {

return "[id=" + this.id + ",name=" + this.name + ",age=" + age

+ ",position=" + this.position + "]";

}

}

4.2.2.   EmployeeDao

/**

* ClassName: EmployeeDao.java

* Author: qiujy

* CreateTime: 2008-8-20

* EMAIL: qjyong@gmail.com

* Copyright 2008 ++YONG All rights reserved.

*/

package org.qiujy.dao;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.List;

import org.apache.commons.dbutils.DbUtils;

import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.BeanHandler;

import org.apache.commons.dbutils.handlers.BeanListHandler;

import org.qiujy.common.MyDbUtils;

import org.qiujy.domain.Employee;

/** 员工dao */

public class EmployeeDao {

/**

* 新增一个员工实例

* @param empl

* @param conn

* @throws DAOException

*/

public void insertEmployee(Connection conn, Employee empl) throws DAOException {

String sql = "INSERT INTO employee(name,age,position) VALUES(?,?,?)";

try {

QueryRunner qr = new QueryRunner();

Object[] params = {empl.getName(), empl.getAge(),empl.getPosition()};

qr.update(conn, sql, params);

} catch (SQLException e) {

throw new DAOException(e);

}

}

/**

* 根据ID删除一个员工实例

* @param conn

* @param id

* @throws DAOException

*/

public void deleteEmloyeeById(Connection conn, int id) throws DAOException {

String sql = "DELETE FROM employee WHERE id=?";

try {

QueryRunner qr = new QueryRunner();

qr.update(conn, sql, id);

} catch (SQLException e) {

throw new DAOException(e);

}

}

/**

* 更新员工的信息

* @param conn

* @param empl

* @throws DAOException

*/

public void updateEmployee(Connection conn, Employee empl) throws DAOException {

String sql = "UPDATE employee SET name=?,age=?,position=? WHERE id=?";

try {

                            QueryRunner qr = new QueryRunner();

                            Object[] params = { empl.getName(), empl.getAge(),

                                               empl.getPosition(), empl.getId() };

                            qr.update(conn, sql, params);

} catch (SQLException e) {

throw new DAOException(e);

}

}

/**

* 根据ID获取该员工实例

* @param conn

* @param id

* @return

* @throws DAOException

*/

public Employee getEmployeeById(Connection conn, int id) throws DAOException {

Employee empl = null;

String sql = "SELECT id,name,age,position FROM employee WHERE id=?";

try {

QueryRunner qr = new QueryRunner();

                            empl = (Employee) qr.query(conn, sql, id,

                                                                 new BeanHandler(Employee.class));

} catch (SQLException e) {

throw new DAOException(e);

}

return empl;

}

/**

* 获取所有的员工列表

* @param conn

* @return 员工实例列表

* @throws DAOException

*/

@SuppressWarnings("unchecked")

public List<Employee> getEmployeeList(Connection conn) throws DAOException {

List<Employee> list = null;

String sql = "SELECT id,name,age,position FROM employee";

try {

QueryRunner qr = new QueryRunner();

         list = (List<Employee>) qr.query(conn, sql,

                                                                 new BeanListHandler(Employee.class));

} catch (SQLException e) {

throw new DAOException(e);

}

return list;

}

public static void main(String[] args) throws SQLException {

Connection conn = MyDbUtils.getConnection();

List<Employee> list = new EmployeeDao().getEmployeeList(conn);

for(Employee empl : list){

System.out.println(empl);

}

DbUtils.close(conn);

}

}

附,本文档的PDF版和源代码下载地址:http://download.csdn.net/source/579793 

common-dbutils的使用的更多相关文章

  1. Apache Common DbUtils

    前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看.大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的 例如大家常用 ...

  2. Apache DbUtils - JDBC轻量级封装的工具包

    前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看.大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的例如大家常用的 ...

  3. SSH:Struts2.2+Hibernate3.6+Spring3.1分页示例[转]

    参考资料 1 ssh分页(多个例子) http://useryouyou.iteye.com/blog/593954 2 ssh2分页例子 http://459104018-qq-com.iteye. ...

  4. JDBC深度封装的工具类 (具有高度可重用性)

    首先介绍一下Dbutils:    Common Dbutils是操作数据库的组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List. 补充一下,传统操作数据库的类指的是JDBC(java ...

  5. 分层架构下的纯JDBC事务控制简单解决方案【转】

    http://blog.csdn.net/qjyong/article/details/5464835 对目前的JavaEE企业应用开发来说,基本都会采用分层的架构, 这样可以分散关注.松散耦合.逻辑 ...

  6. dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)

    jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...

  7. DbUtils使用例子

    DbUtils: JDBC Utility Component Examples This page provides examples that show how DbUtils may be us ...

  8. Java基础学习笔记二十七 DBUtils和连接池

    DBUtils 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils.DBUtils就是JDBC的简化开发 ...

  9. DBUtils和连接池

    今日内容介绍 1.DBUtils 2.连接池 ###01DButils工具类的介绍个三个核心类 * A: DButils工具类的介绍个三个核心类 * a: 概述 * DBUtils是java编程中的数 ...

  10. 30_数据库_第30天java_jdbc_(DBUtils)_讲义

    今日内容介绍 1.DBUtils 2.连接池 01DButils工具类的介绍个三个核心类 * A: DButils工具类的介绍个三个核心类 * a: 概述 * DBUtils是java编程中的数据库操 ...

随机推荐

  1. 8.30域横向-PTH&PTK&PTT票据传递

    知识点 Kerberos协议具体工作方法,在域中: 客户机将明文密码进行NTLM哈希,然后和时间戳一起加密(使用krbtgt密码hash作为密钥),发送给kdc(域控),kdc对用户进行检测,成功之后 ...

  2. 如何使用ChatGPT自带插件

    OpenAI的插件将ChatGPT连接到第三方应用程序.这些插件使ChatGPT能够与开发者定义的API进行交互,增强ChatGPT的能力,并使其能够执行广泛的操作.插件使ChatGPT能够做如下事情 ...

  3. 邀请你参与字节跳动 UME 插件开发竞赛

    UME 是由字节跳动 Flutter Infra 团队出品和维护的 Flutter 应用内调试工具.通过在 Flutter 应用中加入 UME 工具,开发者们可以直接在应用内查看调试信息,而无需使用 ...

  4. Java项目笔记(四)

    1.包装类判断是否相等时,建议用equals 而不是 == 号 2.+= 默认包含了强制类型转换,单纯的s = s+1;编译是无法通过的,因为1属于int类型,必须显示声明强制类型转换 short s ...

  5. Go 语言中值接收者和指针接收者方法调用的自动转换规则详解

    在 Go 语言中,方法的调用规则对于值接收者和指针接收者有一些特别的行为,这使得代码变得更加简洁和易用.我们来详细解释一下"方法值调用规则"和"方法表达式调用规则&quo ...

  6. 分类问题的评价指标AUC

  7. 关于自定义事件父子组件传值问题 $event

    1.$event 是 vue 提供的特殊变量,用来表示原生的事件参数对象 event 1.1在原生事件中,$event是事件对象 可以点出来属性 2.在原生事件中,$event是事件对象,在自定义事件 ...

  8. Vue3 的emit3 属性和 props 属性?

    使用场景:使用父子组件通信的时候 : 作用: 用来声明组件有哪些自定义事件,不在emtis里面都会当成原生事件,绑定给组件的根标 签. 好处: 不在像 vue2 使用  .native 修饰符 在 v ...

  9. nicegui太香了,跨平台开发和跨平台运行--使用Python+nicegui实现系统布局界面的开发

    在现今国产化浪潮的驱动下,跨平台或者缩小范围说基于国产化Linux或者基于国产鸿蒙系统的开发才是未来的趋势了,风口浪尖上,我们开发人员也只能顺势而为,本篇随笔介绍在Python开发中,使用使用Pyth ...

  10. HOW MANY OF THEM?(让人匪夷所思的一题)

    题面 由n个节点构成的,割边数不超过m条的无向连通图个数(无自环和重边),答案对1e9+7取模. \[------------------------------------------- \] 真是 ...