转自:
Apache commons-dbutils工具简介说明
下文笔者讲述Apache commons-dbutils工具简介说明,如下所示
commons-dbutils简介
commons-dbutils
是Apache提供的一个开源JDBC工具类库
它是对JDBC的简单封装
学习成本极低
并且使用dbutils能极大简化jdbc编码的工作量
同时也不会影响程序的性能
commons-dbutils API介绍
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
工具类
org.apache.commons.dbutils.DbUtils
commons-dbutils下载方法
https://commons.apache.org/proper/commons-dbutils/
DbUtils类介绍
DbUtils类的功能:
提供一些操作方法:
如关闭连接、装载JDBC驱动程序等常规工作的工具类
注意事项:
里面的所有方法都是静态的(关闭资源、加载驱动)
常见的方法如下所示:
public static void close(…) throws java.sql.SQLException
DbUtils类提供了三个重载的关闭方法
这些方法检查所提供的参数是不是NULL
当参数为非null时,则关闭Connection、Statement和ResultSet。
public static void closeQuietly(…)
此方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭
还能隐藏一些在程序中抛出的SQLException
public static void commitAndCloseQuietly(Connection conn);
用于提交连接
然后关闭连接
并且在关闭连接时不抛出SQL异常。
public static boolean loadDriver(java.lang.String driverClassName)
装载并注册JDBC驱动程序
如果成功就返回true
使用该方法,无需捕捉这个异常ClassNotFoundException。
QueryRunner类
该类简单化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
用于执行一个不需要置换参数的更新操作。
ResultSetHandler接口
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler接口提供了一个单独的方法:Object
handle (java.sql.ResultSet rs)
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
例
JdbcUtils类编写
package Utils;
import java.sql.*;
/**
* 1. 返回连接 2. 关闭
*
* @author java265.com
*
*/
public class JdbcUtils {
// 连接参数
// private String url = "jdbc:mysql://localhost:3306/jdbc_demo";
private static Stringurl ="jdbc:mysql://192.168.8.245:3306/testdb";
private static Stringuser ="root";
private static Stringpassword ="123456";
/**
* 返回连接对象
*/
public static Connection getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection(url,user,password);
}catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 关闭
*/
public static void closeAll(Connection con, Statement stmt, ResultSet rs) {
try {
if (rs !=null) {
rs.close();// 快速异常捕获Alt + shift + z
rs =null;// 建议垃圾回收期回收资源
}
if (stmt !=null) {
stmt.close();
stmt =null;
}
if (con !=null && !con.isClosed()) {
con.close();
con =null;
}
}catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
public class User {
private int id;
private String name;
/*
此处省略 get/set 及其它字段定义代码
*/
}
/**
* 测试代码
*/
import Utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;
import java.sql.Array;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class App_query {
private Connectionconn;
@Test
public void testQuery()throws Exception {
String sql ="select * from users where id=?";
//获取连接
conn = JdbcUtils.getConnection();
//创建DbUtils核心工具类对象
QueryRunner qr =new QueryRunner();
//查询
User users = qr.query(conn, sql,new ResultSetHandler() {
//如何封装一个Admin对象
public User handle(ResultSet rs)throws SQLException {
if (rs.next()) {
User user =new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
***********
return user;
}
return null;
}
},29);
// 关闭
conn.close();
}
@Test
public void testQueryOne()throws Exception {
String sql ="select * from user where id=?";
//获取连接
conn = JdbcUtils.getConnection();
//创建DbUtils核心工具类对象
QueryRunner qr =new QueryRunner();
//查询返回单个对象
User user = qr.query(conn, sql,new BeanHandler(User.class),30);
System.out.println(user);
conn.close();
}
//2.BeanListHandler: 查询返回list集合,集合元素是指定的对象
@Test
public void testQueryMany()throws Exception {
String sql ="select * from user";
conn = JdbcUtils.getConnection();
QueryRunner qr =new QueryRunner();
//查询全部数据
List list = qr.query(conn, sql,new BeanListHandler(Admin.class));
conn.close();
}
@Test
// 3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]
// 4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中
// 5) ScalarHandler 查询返回结果记录的第一行的第一列 (在聚合函数统计的时候用)
// 6) MapHandler 查询返回结果的第一条记录封装为map
public void testArray()throws Exception {
String sql ="select * from user";
conn = JdbcUtils.getConnection();
QueryRunner qr =new QueryRunner();
//查询
Object[] obj = qr.query(conn, sql,new ArrayHandler());
System.out.println("数组:"+ Arrays.toString(obj));
List list = qr.query(conn, sql,new ArrayListHandler());
for (int i =0; i < list.size(); i++) {
System.out.println("list:"+ Arrays.toString(list.get(i)));
}
//查询的结果先是数组
//然后将数组添加到list中
//所以由list获取的每一条都为数组,然后遍历数组才能获取值
Integer num = qr.query(conn, sql,new ScalarHandler());
System.out.println("第一列:" + num);
Map map = qr.query(conn,sql,new MapHandler());
Set<Map.Entry<String, Object>> entrys = map.entrySet();
//entry代表一个键值对
for (Map.Entry entry : entrys) {
System.out.println("map " + entry.getKey() +"=" + entry.getValue());
}
conn.close();
}
}
使用dbutils工具类可以简化
jdbc编码的工作量
不再用JDBC编写原子性代码
直接使用QueryRunner获取结果
而且其安全性较高
内部的JDBC一些工作已经做好了实现
用户只需直接使用即可