声明:

此文档为免费资料,仅供个人研究和学习之用,不得用于任何商业目的。在免费、且无任何附加条件的前提下,可在网络媒体中自由传播。转载时请保持文档的完整性,作者不能保证文档的完全正确,希望大家对其中的错误进行更正并与我联系。

在写作过程中,我参考了网上大量的资料,并摘取了其中的一部分内容,在这里向这些资料的作者表示深深的感谢,如果您认为我侵犯了您的著作版权,请告之我,我会将相关内容删除并将结果通知您。

 

 

本文档仅代表作者本人的观点。

 

 

联系QQ20978405

联系邮箱:qjyong@gmail.com

技术博客: http://blog.csdn.net/qjyong

技术博客2http://qjyong.javaeye.com/

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-utils的使用相关推荐

  1. No module named 'dlframework.common.utils.local'

    No module named 'dlframework.common.utils.local' 报错代码: checkpoint_dict = torch.load(path)

  2. 阿里vod视频点播报错: com.aliyun.oss.common.utils.StringUtils

    阿里VOD视频点播com.aliyun.oss.common.utils.StringUtils 先把aliyun-sdk-oss发布到3.1.0的版本,打开源码copy出来这个类.在自己的项目里面新 ...

  3. 多模块下依赖其他模块(例如Common模块)时的解决办法

    在多模块下,使用Knife4j进行接口测试时发现,全局异常处理器无法捕获自定义异常,经检查,已经在该模块下的依赖文件中引入相关模块,但是在返回给前端数据时,对于错误的请求返回的还是 message:I ...

  4. Java.Utils:获取电脑配置信息

    Don't say much, just go to the code. package org.bood.common.utils;import java.io.*;/*** 获取电脑配置信息** ...

  5. shiro整合oauth

    前言 如果oauth原理还不清楚的地方,其参考这里.  一.基本思路脑图 二.客户端shiro配置 shiro配置文件 <?xml version="1.0" encodin ...

  6. 配置springmvc在其他类中(spring容器外)获取注入bean

    今天在写JedisUtils的时候要注入JedisPool,而这个属性被设置为static,@Resource和@Autowired都不可以注入,因为spring不能为静态变量依赖注入.因此需要额外的 ...

  7. java 查询 代码_java使用es查询的示例代码

    众所周知,elasticsearch简称es,它是基于基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开 ...

  8. java实现验证码功能

    1.创建生成图片验证码工具类 package cn.wkgb.common.utils; import java.awt.Color; import java.awt.Font; import jav ...

  9. ruoyi后台管理系统分析(三)---admin包

    三.admin包 --web包 -----controller包 -----------common包 CommonController.java------通用请求处理 package com.ru ...

  10. 如何使用SpringBoot AOP 记录操作日志、异常日志?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:咫尺的梦想_w cnblogs.com/wm-dv/ ...

最新文章

  1. Java Web中的jsp技术
  2. 【AI-1000问】为什么LeNet5倒数第二个全连接层维度为84?
  3. Node中同步与异步的方式读取文件
  4. 2018-2019-1 20165234 《信息安全系统设计基础》第四周学习总结
  5. Andrew Ng机器学习公开课笔记 -- Logistic Regression
  6. Java解决空引用_在java中检查空引用的乐观方法
  7. 泄漏计算机网络安全法情节,第十一章网络安全法第十二章电子商务纠纷的法律解决详细分解.doc...
  8. Atitit 持久化 之道 attilax 艾龙著 1. 第2章 Java对象持久化技术概述 2 1.1. 2.1 直接通过JDBC API来持久化实体域对象 2 1.2. 2.2 ORM简介 2
  9. Qt file not recognized: File truncated 半分钟搞定,不用浪费过多时间重新编译
  10. Ubuntu18.04安装TPlink WDN5200 usb无线网卡驱动
  11. SQL语句-考勤统计表按照年份统计员工每月的加班调休数据
  12. 解决服务器上中文显示乱码问题
  13. 《按自己的意愿过一生》语录一
  14. Kotlin-Android世界的一股清流-委托
  15. 二手交易app开发可以定制哪些功能
  16. 无线视频监控系统设计
  17. 我在创业游戏公司的一年
  18. 单项冠军企业申报条件及奖励政策
  19. C++ accumulate
  20. 口令攻击的理解和密码破解工具的使用

热门文章

  1. ebay卖家开店如何做到稳定出单?自养号测评对eBay卖家有什么优势?
  2. 微信 被动回复 (五)
  3. OpenWrt内核模块开发(六)-通过linux netfilter框架实现mac地址过滤
  4. R语言数据预处理、数据因子化并自定义因子标签、通过labels参数指定因子标签
  5. Kafka Schema-Registry
  6. 智能家居进入下半场,欧瑞博难以让消费者买单
  7. 我的书单(持续更新)
  8. 架构漫谈(五):什么是软件
  9. SQL Server中视图,存储过程,注入
  10. 《从0到1上线微信小游戏》第八节 在微信开发者工具和手机上调试