所需jar包 : commons-dbutils-1.6.jar
DbUtils类
1.DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
-public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
-public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
-public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
-public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。
1.1QueryRunner类
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
-默认的构造方法
-需要一个 javax.sql.DataSource 来作参数的构造方法。
QueryRunner类的主要方法
public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。
public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。
public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
<span style="font-size:14px;">/**
* 测试 QueryRunner 的 Update 方法
* 该方法用于 INSERT , UPDATE , DELETE
*/
@Test
public void testQueryRunnerUpdate() {
//1.创建 QueryRunner 的实现类
QueryRunner queryRunner = new QueryRunner();
//String sql = "delete from temp where id in(?,?)";
//String sql = "insert into temp(id,name,birth) values(?,?,?)";
String sql = "update temp set name = ? where id = ?";
//2.使用 update
Connection conn = null;
try {
conn = JDBC_Tools.getConnection();
queryRunner.update(conn,sql,"OK",1);
} catch (Exception e) {
JDBC_Tools.relaseSource(conn, null);
}
}</span>
1.2.ResultSetHandler接口 该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。
<span style="font-size:14px;">class MyResultSetHandler implements ResultSetHandler<Object>{
@Override
public Object handle(ResultSet rs)
throws SQLException {
// System.out.println(" handler is OK!");
// return "OVER";
List<Person> persons = new ArrayList<Person>();
while(rs.next()){
Integer id = rs.getInt(1);
String name = rs.getString(2);
Date birth = rs.getDate(3);
persons.add(new Person(id,name,birth));
}
return persons;
}
}
/**
* 测试 QueryRunner 的 Query 方法的返回值取决于ResultSetHandler参数的
* handle 方法的返回值
*/
@Test
public void testQueryRunnerQuery(){
QueryRunner queryRunner = new QueryRunner();
Connection conn = null;
try {
conn = JDBC_Tools.getConnection();
String sql = "select * from temp ";
@SuppressWarnings("unchecked")
List<Object> ls = (List<Object>) queryRunner.query(conn, sql, new MyResultSetHandler());
for(Object p : ls)
System.out.println(p);
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBC_Tools.relaseSource(conn, null);
}
}</span>
1.3 ResultSetHandler 接口的实现类
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
<span style="font-size:14px;">package xuezaipiao1;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
/**
* 测试DbUtils 工具类
* @author Kevy
*/
public class testDbUtils {
/**
* ScalarHandler : 把结果集转为一个数值(可以是任意基本数据类型和字符串),
*/
@Test
public void testScalarHandler(){
Connection conn = null;
QueryRunner queryRunner = new QueryRunner();
try {
conn = JDBC_Tools.getConnection();
//String sql = "select name from temp where id = ?";
String sql = "select count(id) from temp";
Object s = queryRunner.query(conn, sql,
new ScalarHandler<Person>());
System.out.println(s);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
JDBC_Tools.relaseSource(conn, null);
}
}
/**
* MapListHandler : 将结果集转为一个 Map 的 List (不是绑定Javabean)
* 一个 Map 对应一条查询得到的记录 键:SQL 查询的列名(不是列的别名), 值:列的值
* MapListHandler :返回的是多条记录对应的Map 集合
*/
@Test
public void testMapListHandler(){
Connection conn = null;
QueryRunner queryRunner = new QueryRunner();
try {
conn = JDBC_Tools.getConnection();
String sql = "select * from temp";
List<Map<String, Object>> ls = queryRunner.query(conn, sql,
new MapListHandler());
for(Map<String, Object> map : ls){
for(Map.Entry<String , Object> m : map.entrySet()){
System.out.print(m.getKey());
System.out.println(":"+m.getValue());
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
JDBC_Tools.relaseSource(conn, null);
}
}
/**
* MapHandler : 返回 SQL 对应的第一条记录对应的 Map对象
* 键:SQL 查询的列名(不是列的别名), 不是绑定Javabean
* 值:列的值
*/
@Test
public void testMapHandler(){
Connection conn = null;
QueryRunner queryRunner = new QueryRunner();
try {
conn = JDBC_Tools.getConnection();
String sql = "select id,name,birth from temp";
Map<String, Object> map = queryRunner.query(conn, sql,
new MapHandler());
for(Map.Entry<String , Object> entry : map.entrySet()){
System.out.print(entry.getKey()+":");
System.out.println(entry.getValue());
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
JDBC_Tools.relaseSource(conn, null);
}
}
/**
* BeanListHandler : 把结果集转为List,该List不为null,但可能为空集合(size()==0)
* 若SQL语句能够查询到记录,List中存放创建BeanListHandler 传入的Class 参数对应的对象
* 绑定Javabean,要查询的列的别名 必须与 对应 java类的属性值相同
*/
@Test
public void testBeanListHandler(){
Connection conn = null;
QueryRunner queryRunner = new QueryRunner();
try {
conn = JDBC_Tools.getConnection();
String sql = "select * from temp";
List<Person> ls = queryRunner.query(conn, sql,
new BeanListHandler<Person>(Person.class));
for(Person p : ls)
System.out.println(p);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
JDBC_Tools.relaseSource(conn, null);
}
}
/**
* BeanHandler 把结果集的第一条记录转为创建 BeanHandler 对象时传入的 Class 参数对应的对象
* 只返回一条,绑定Javabean,要查询的列的别名 必须与 对应 java类的属性值相同
* @param <T>
*
*/
@Test
public <T> void testBeanHandler(){
Connection conn = null;
QueryRunner queryRunner = new QueryRunner();
try {
conn = JDBC_Tools.getConnection();
String sql = "select * from temp where id = ?";
//BeanHandler<T>
Person p = queryRunner.query(conn, sql,
new BeanHandler<Person>(Person.class), 1);
System.out.println(p);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
JDBC_Tools.relaseSource(conn, null);
}
}
class MyResultSetHandler implements ResultSetHandler<Object>{
@Override
public Object handle(ResultSet rs)
throws SQLException {
// System.out.println(" handler is OK!");
// return "OVER";
List<Person> persons = new ArrayList<Person>();
while(rs.next()){
Integer id = rs.getInt(1);
String name = rs.getString(2);
Date birth = rs.getDate(3);
persons.add(new Person(id,name,birth));
}
return persons;
}
}
/**
* 测试 QueryRunner 的 Query 方法的返回值取决于ResultSetHandler参数的
* handle 方法的返回值
*/
@Test
public void testQueryRunnerQuery(){
QueryRunner queryRunner = new QueryRunner();
Connection conn = null;
try {
conn = JDBC_Tools.getConnection();
String sql = "select * from temp ";
@SuppressWarnings("unchecked")
List<Object> ls = (List<Object>) queryRunner.query(conn, sql, new MyResultSetHandler());
for(Object p : ls)
System.out.println(p);
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBC_Tools.relaseSource(conn, null);
}
}
/**
* 测试 QueryRunner 的 Update 方法
* 该方法用于 INSERT , UPDATE , DELETE
*/
@Test
public void testQueryRunnerUpdate() {
//1.创建 QueryRunner 的实现类
QueryRunner queryRunner = new QueryRunner();
//String sql = "delete from temp where id in(?,?)";
//String sql = "insert into temp(id,name,birth) values(?,?,?)";
String sql = "update temp set name = ? where id = ?";
//2.使用 update
Connection conn = null;
try {
conn = JDBC_Tools.getConnection();
queryRunner.update(conn,sql,"OK",1);
} catch (Exception e) {
JDBC_Tools.relaseSource(conn, null);
}
}
}
</span>