http://java.chinaitlab.com/advance/796954_3.html
Hibernate 太复杂,iBatis 不好用,JDBC 代码太垃圾,DBUtils 在简单与优美之间取得了完美平衡。
一、概述
DbUtils 小巧的Java 数据库操作工具,它在JDBC 的基础上做了科学的封装,旨在简化JDBC 代码混乱与重复。
对于JDBC 代码,存在很多问题,算是对Java的批判:
1 、操作过程复杂,代码操作一个模式,大量的重复。
2 、结果集难以处理,拿到一个ResultSet 干屁啊,一个一个度,转称JavaBean ,后来形成List ,太麻烦了。
3 、到处都强制检查SQLException ,烦不烦啊,影响代码的美观和可读性。
当然,以上的批判不是说JDBC 设计不合理,二是缺乏更高层操作API 的支持。因此才产生了众多的开源数据库操作的框架和工具包。
二、熟悉DBUtils 的API
针对DBUitlsAPI 的包,做个简单的翻译,以便迅速掌握API 的使用。
1 、------------------------------------
包org.apache.commons.dbutils
DbUtils 是一个为简化JDBC 操作的小类库。
接口摘要
ResultSetHandler 将ResultSet 转换为别的对象的工具。
RowProcessor 将ResultSet 行转换为别的对象的工具。
类摘要
BasicRowProcessor - RowProcessor 接口的基本实现类。
BeanProcessor - BeanProcessor 匹配列名到Bean 属性名,并转换结果集列到Bean 对象的属性中。
DbUtils 一个JDBC 辅助工具集合。
ProxyFactory 产生JDBC 接口的代理实现。
QueryLoader 属性文件加载器,主要用于加载属性文件中的 SQL 到内存中。
QueryRunner 使用可插拔的策略执行SQL 查询并处理结果集。
ResultSetIterator 包装结果集为一个迭代器。
2 、------------------------------------
包org.apache.commons.dbutils.handlers
-------ResultSetHandler 接口的实现类
类摘要
AbstractListHandler 将ResultSet 转为List 的抽象类
ArrayHandler 将ResultSet 转为一个Object[] 的ResultSetHandler 实现类
ArrayListHandler 将ResultSet 转换为List<Object[]> 的ResultSetHandler 实现类
BeanHandler 将ResultSet 行转换为一个JavaBean 的ResultSetHandler 实现类
BeanListHandler 将ResultSet 转换为List<JavaBean> 的ResultSetHandler 实现类
ColumnListHandler 将ResultSet 的一个列转换为List<Object> 的ResultSetHandler 实现类
KeyedHandler 将ResultSet 转换为Map<Map> 的ResultSetHandler 实现类
MapHandler 将ResultSet 的首行转换为一个Map 的ResultSetHandler 实现类
MapListHandler 将ResultSet 转换为List<Map> 的ResultSetHandler 实现类
ScalarHandler 将ResultSet 的一个列到一个对象。
3 、------------------------------------
包org.apache.commons.dbutils.wrappers
--- 添加java.sql 类中功能包装类。
类摘要
SqlNullCheckedResultSet 在每个getXXX 方法上检查SQL NULL 值的ResultSet 包装类。
StringTrimmedResultSet 取出结果集中字符串左右空格的ResultSet 包装类。
三、环境
Java5
commons-dbutils-1.2-bin.zip
mysql-noinstall-5.1.40-win32.zip
mysql-connector-java-5.1.10.zip
下载地址:
http://apache.freelamp.com/commons/dbutils/binaries/commons-dbutils-1.2-bin.zip
http://gd.tuwien.ac.at/db/mysql/Downloads/MySQL-5.1/mysql-noinstall-5.1.40-win32.zip
http://gd.tuwien.ac.at/db/mysql/Downloads/Connector-J/mysql-connector-java-5.1.10.zip
四、实例
1 、sql 脚本
create table user (
id int (11) not null auto_increment,
name varchar (50) character set latin1 not null ,
pswd varchar (50) character set latin1 default null ,
primary key (id)
) engine=MYISAM auto_increment=1 default charset=gbk
2 、简单的数据库连接工具
package stu.lavasoft.dbutils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 随便写个数据库连接获取工具,凑合着把例子跑起来
*
* @author leizhimin 2009-11-6 14:48:22
*/
public class ConnTools {
private static String dirverClassName = "com.mysql.jdbc.Driver" ;
private static String url = "jdbc:mysql: //192.168.104.101:3306/testdb?useUnicode=true&characterEncoding=utf8";
private static String user = "root";
private static String password = "leizhimin";
public static Connection makeConnection() {
Connection conn = null ;
try {
Class.forName(dirverClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
3 、实体Bean
package stu.lavasoft.dbutils;
/**
* 实体 Bean
*
* @author leizhimin 2009-11-6 16:05:41
*/
public class User {
private int id;
private String name;
private String pswd;
public int getId() {
return id;
}
public void setId( int id) {
this .id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public String getPswd() {
return pswd;
}
public void setPswd(String pswd) {
this .pswd = pswd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pswd='" + pswd + '\'' +
'}';
}
}
4 、测试类
package stu.lavasoft.dbutils;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/**
* DbUtils 入门
*
* @author leizhimin 2009-11-6 14:47:26
*/
public class Test1 {
public static void main(String[] args) throws SQLException {
test_insert();
test_find();
}
public static void test_insert() throws SQLException {
System.out.println( "-------------test_insert()-------------" );
// 创建连接
Connection conn = ConnTools.makeConnection();
// 创建 SQL 执行工具
QueryRunner qRunner = new QueryRunner();
// 执行 SQL 插入
int n = qRunner.update(conn, "insert into user(name,pswd) values('iii','iii')" );
System.out.println( " 成功插入 " + n + " 条数据! " );
// 关闭数据库连接
DbUtils.closeQuietly(conn);
}
public static void test_find() throws SQLException {
System.out.println( "-------------test_find()-------------" );
// 创建连接
Connection conn = ConnTools.makeConnection();
// 创建 SQL 执行工具
QueryRunner qRunner = new QueryRunner();
// 执行 SQL 查询,并获取结果
List<User> list = (List<User>) qRunner.query(conn, "select id,name,pswd from user" , new BeanListHandler(User. class ));
// 输出查询结果
for (User user : list) {
System.out.println(user);
}
// 关闭数据库连接
DbUtils.closeQuietly(conn);
}
}
执行结果:
-------------test_insert()-------------
成功插入 1 条数据!
-------------test_find()-------------
User{id=4, name='bbb', pswd='bbb'}
User{id=3, name='aaa', pswd='bbb'}
User{id=5, name='iii', pswd='iii'}
User{id=6, name='iii', pswd='iii'}
Process finished with exit code 0