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. mysql where 字符串根据英文逗号分割为数组 并判断是否包含指定字符串

    SELECT * FROM table_name where FIND_IN_SET('A',column_1) or FIND_IN_SET('B', column_2) table_name : ...

  2. canvas实现图片标记

    前言 由于业务需求,需要有一个图片标记功能,其实就是对图片画框画线做标记,类似微信的图片编辑 但是需要存下标记图及其标记的具体数据,.功能其实很简单,但刚开始的时候也是费了一些功夫的.我将原项目中该功 ...

  3. spark 解析 kafka message

    备用 https://databricks.com/blog/2018/11/30/apache-avro-as-a-built-in-data-source-in-apache-spark-2-4. ...

  4. 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现

    高并发场景:秒杀商品. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:1000个)的商品(比如:手机),以极低的价格(比如:0.1元),让大量用户参与活动,但只有极少数用户能够购买成功. 示例 ...

  5. ASP.NET Core – Custom Input formatters For Partial Update and Handle Under-posting

    前言 之前的文章有谈过关于 ASP.NET Core 处理 under-posting 的方式. 它会使用 class default value. 许多时候这可能不是我们期望的. 比如当我们想要 p ...

  6. Spring —— 核心概念

    IoC (Inversion of Control) 控制反转 使用对象时,由主动new产生对象转换为由外部提供对象,对象的创建控制权由程序转移至外部,这种思想成为控制反转 Spring技术对IoC思 ...

  7. 使用pxe安装ARM服务器(鲲鹏920)遇到的坑

    一.关于PXE获取到IP之后无ACK,无法获取引导文件. 目前ARM服务器基本都是使用UEFI的方式进行引导,我们只需要关注EFI方式引导即可,Legacy引导已经随着时代的发展被扫进历史的垃圾桶. ...

  8. 使用duxapp开发 React Native App 事半功倍

    Taro的React Native端开发提供了两种开发方式,一种是将壳和代码分离,一种是将壳和代码合并在一起开发 壳是用来打包调试版或者发版安装包使用的 代码是运行在壳上的js代码 Taro壳子的代码 ...

  9. LeetCode 1349. 参加考试的最大学生数 (状压DP 或 二分图最大独立子集)

    给你一个 m * n 的矩阵 seats 表示教室中的座位分布.如果座位是坏的(不可用),就用 '#' 表示:否则,用 '.' 表示. 学生可以看到左侧.右侧.左上.右上这四个方向上紧邻他的学生的答卷 ...

  10. [Dest0g3 520迎新赛]funny_upload

    打开靶机抓包发现过滤代码 发现.htaccess能上传后传入图片马 发现内容对<?进行过滤 我们换一种方式写后门代码 <script language="php"> ...