[JAVA]DbUtils小结及一个小例子

本文参考自: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;
			}
		};

1 对于数据表的读操作 他可以把结果转换成List Array Set等java集合 便于程序员操作; 2 对于数据表的写操作 也变得很简单(只需写sql语句) 3 可以使用数据源 使用JNDI 数据库连接池等技术来优化性能 重用已经构建好的数据库连接对象 而不像php asp那样 费时费力的不断重复的构建和析构这样的对象 DBUtils包括3个包: org apache commons dbutils org apache commons dbutils handlers org apache commons dbutils wrappers DBUtils封装了对JDBC的操作 简化了JDBC操作 可以少写代码 org apache commons dbutils DbUtils 关闭链接等操作 QueryRunner 进行查询的操作 org apache commons dbutils handlers ArrayHandler :将ResultSet中第一行的数据转化成对象数组 ArrayListHandler将ResultSet中所有的数据转化成List List中存放的是Object[] BeanHandler :将ResultSet中第一行的数据转化成类对象 BeanListHandler :将ResultSet中所有的数据转化成List List中存放的是类对象 ColumnListHandler :将ResultSet中某一列的数据存成List List中存放的是Object对象 KeyedHandler :将ResultSet中存成映射 key为某一列对应为Map Map中存放的是数据 MapHandler :将ResultSet中第一行的数据存成Map映射 MapListHandler :将ResultSet中所有的数据存成List List中存放的是Map ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object org apache commons dbutils wrappers SqlNullCheckedResultSet :对ResultSet进行操作 改版里面的值 StringTrimmedResultSet :去除ResultSet中中字段的左右空格 Trim ">1 对于数据表的读操作 他可以把结果转换成List Array Set等java集合 便于程序员操作; 2 对于数据表的写操作 也变得很简单(只需写sql语句) 3 可以使用数据源 使用JNDI 数据库连接池等技术来优化性能 重用已经构建好的 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值