本文参考自:http://commons.apache.org/proper/commons-dbutils/index.html
笔者昨日学习了下DbUtils,那么DbUtils是个什么东西呢?
官网上给出的定义如下:
The Commons DbUtils library is a small set of classes designed to make working with JDBC easier. JDBC resource cleanup code is mundane, error prone work so these classes abstract out all of the cleanup tasks from your code leaving you with what you really wanted to do with JDBC in the first place: query and update data.
也就是说,DbUtils是一个让JDBC工作更加简单的类集。JDBC资源释放是非常平凡的且易出错的,因此DbUtils抽象出所有的资源工作,使得你可以更加专注与你想干的事:查询和更新数据。
那么使用DbUtils给我们带来了什么好处呢?
1.没有资源泄漏的可能性。正确的JDBC代码并不难但耗时且乏味。这常常会导致连接泄漏,可能很难追踪错误。
2.更清晰的代码。
3.从结果集自动填充JavaBean属性。你不需要手动将列值复制到bean实例通过调用setter方法。
DbUtils有小(small)、快(fast)和透明(transparent)三个特点。它不是一个对象/关系桥梁,也不是DAO框架。
下面来看一个笔者测试过的例子:
首先,我们采用的数据库是MySQL。给出MySQL中表的设计。
由于测试项目是用maven构建,给出pom.xml文件的配置信息。
<span style="font-size:10px;"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.arthur.test</groupId>
<artifactId>DBUnitTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>DBUnitTest</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project></span><span style="font-size: 14px;">
</span>
package com.arthur.test.DBUnitTest;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map.Entry;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.junit.Test;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
/**
* 设置好数据库连接信息
*
* @author arthur
*
*/
public class DbUtilsTest {
@Test
public void testQuery() {
ResultSetHandler<HashMap<Integer, String>> h = new ResultSetHandler<HashMap<Integer, String>>() {
public HashMap<Integer, String> handle(ResultSet rs)
throws SQLException {
HashMap<Integer, String> map = new HashMap<Integer, String>();
// rs的下标第一个为空
while (rs.next()) {
map.put((Integer) rs.getObject(1), (String) rs.getObject(2));
}
return map;
}
};
MysqlDataSource ds = new MysqlDataSource();
ds.setURL("jdbc:mysql://localhost:3307/DBUtilsTest");
ds.setUser("root");
ds.setPassword("root");
QueryRunner run = new QueryRunner(ds);
try {
HashMap<Integer, String> result = run.query("SELECT * FROM Person",
h);
java.util.Iterator<Entry<Integer, String>> it = result.entrySet()
.iterator();
while (it.hasNext()) {
Entry<Integer, String> xxx = it.next();
System.out.println("Id:" + xxx.getKey() + " name:"
+ xxx.getValue());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void testQuery2() {
ResultSetHandler<HashMap<Integer, String>> h = new ResultSetHandler<HashMap<Integer, String>>() {
public HashMap<Integer, String> handle(ResultSet rs)
throws SQLException {
HashMap<Integer, String> map = new HashMap<Integer, String>();
// rs的下标第一个为空
while (rs.next()) {
map.put((Integer) rs.getObject(1), (String) rs.getObject(2));
}
return map;
}
};
MysqlDataSource ds = new MysqlDataSource();
ds.setURL("jdbc:mysql://localhost:3307/DBUtilsTest");
ds.setUser("root");
ds.setPassword("root");
QueryRunner run = new QueryRunner();
try {
HashMap<Integer, String> result = run.query("SELECT * FROM Person",
h);
java.util.Iterator<Entry<Integer, String>> it = result.entrySet()
.iterator();
while (it.hasNext()) {
Entry<Integer, String> xxx = it.next();
System.out.println("Id:" + xxx.getKey() + " name:"
+ xxx.getValue());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
测试通过,数据库可查询。还有些其它操作,可以参考官方网站文档。
这里想说明一下,下面的代码,笔者的实现和官网上的不一样。这个接口这么实现需要根据实际情况来定。ResultSet这个类的作用是一个游标的作用,在此笔记记录下。
ResultSetHandler<HashMap<Integer, String>> h = new ResultSetHandler<HashMap<Integer, String>>() {
public HashMap<Integer, String> handle(ResultSet rs)
throws SQLException {
HashMap<Integer, String> map = new HashMap<Integer, String>();
// rs的下标第一个为空
while (rs.next()) {
map.put((Integer) rs.getObject(1), (String) rs.getObject(2));
}
return map;
}
};