什么是DBUtils?是JDBC的简化开发工具包。使用它就不用再写很多冗余的代码了。总而言之,就是使得JDBC的操作更加的简单化了。
文章目录
为啥要用DBUtils
诞生背景:
- 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils。
- DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。
核心优点:
- **无资源泄漏 **- DBUtils类确保不会发生资源泄漏。
- 清理和清除代码 - DBUtils类提供干净清晰的代码来执行数据库操作,而无需编写任何清理或资源泄漏防护代码。
防止了SQL注入。
- Bean映射 - DBUtils类支持从结果集中自动填充Javabeans。
特性:
- DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
- DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
- Dbutils三个核心功能介绍
- QueryRunner类 中提供对sql语句操作的API
- ResultSetHandler接口,用于定义select操作后,怎样封装结果集
- DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
下面,将从QueryRunner类展开,详解DBUtils包在开发中的具体使用!
完整项目:
https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/05-%E4%BD%BF%E7%94%A8DBUtils
QueryRunner类
**功能:**包装并执行SQL语句
核心方法:
int update(Connection conn, String sql, Object... params)
,用来完成表数据的增加、删除、更新操作,返回执行成功后影响的行数。可变参数的出现是因为SQL语句中会出现占位符。<T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
,用来完成表数据的查询操作,返回的是相关类型。T表示泛型。
**Notice:**update方法使用示例如下,query方法使用示例在ResultSetHandle接口的讲解中!
使用的数据库
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE `person` (
`pid` INT(11) NOT NULL,
`pname` VARCHAR(20) NOT NULL,
`page` INT(11) DEFAULT NULL,
`psex` CHAR(10) DEFAULT NULL,
`ptel` VARCHAR(20) DEFAULT NULL,
`pemail` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (`pid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
注册驱动并建立起连接
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.commons.dbutils.DbUtils;
import org.junit.Test;
public class DBUtilsUpdate {
static final String driver = "com.mysql.jdbc.Driver";
static final String url = "jdbc:mysql://localhost:3306/kdb";
static final String user = "root";
static final String passwd = "kyle";
@Test
public void testConnect() {
Connection con = buildConnection();
System.out.println(con); //com.mysql.jdbc.JDBC4Connection@2e3967ea
closeConnection(con);
}
public Connection buildConnection() {
Connection conn = null;
//Step 1: Register JDBC driver
DbUtils.loadDriver(driver);
//Step 2: Open a connection
System.out.println("Connecting to database...");
try {
conn = DriverManager.getConnection(url, user, passwd);
} catch (SQLException e) {
e.printStackTrace();
}
//System.out.println(conn);
return conn;
}
public void closeConnection(Connection conn) {
try {
DbUtils.close(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
update操作
public void update(Connection conn) {
QueryRunner qr = new QueryRunner();
String sql = "UPDATE person SET p_name=?,p_age=? WHERE p_id=?";
//定义Object数组,存储?中的参数
Object[] params = {"huawei",200,1};
int row = 0;
try {
row = qr.update(conn,sql,params);
System.out.println("受影响的函数为:" + row);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
}
create操作
public void insert(Connection conn) {
QueryRunner qr = new QueryRunner();
String sql = "INSERT INTO person (p_id,p_name,p_age) VALUES (?,?,?)";
Object[] params = {5,"apple",30};
int row = 0;
try {
row = qr.update(conn,sql,params);
System.out.println("受影响的行数为:" + row);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
}
delete操作
public void delete(Connection conn) {
QueryRunner qr = new QueryRunner(); //创建SQL类对象
String sql = "DELETE FROM person WHERE p_id=?";
int row;
try {
row = qr.update(conn,sql,3); //参数:连接对象,要执行的SQL语句,SQL语句中各个问号的具体值
System.out.println("被影响的行数为:" + row);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
}
ResultSetHandle接口
**功能:**接收并处理QueryRunner类的query方法执行结果!
注意:完整展示见——https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/05-%E4%BD%BF%E7%94%A8DBUtils
接口实现类概览:
ArrayHandler
将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值ArrayListHandler
将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。BeanHandler
将结果集中第一条记录封装到一个指定的javaBean中。BeanListHandler
将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中ColumnListHandler
将结果集中指定的列的字段值,放到一个List集合中ScalarHandler
应用于查询结果集中有且只有一个结果(仅一行一列)的情形MapHandler
将结果集第一行封装到Map集合中,Key 列名, Value 该列数据MapListHandler
将结果集所有行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合
将查询结果存于顺序表
**ArrayHandler类功能:**将结果集第一行存储到Object数组中
public static void arrayHandler(Connection conn)throws SQLException{
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM person";
//调用方法query执行查询,传递连接对象,SQL语句,结果集处理方式的实现类
//返回对象数组
Object[] result = qr.query(conn, sql, new ArrayHandler());
for(Object obj : result){
System.out.print(obj + " ");
}
}
**ArrayListHandler类功能:**将结果集全部存储到Object数组中
public static void arrayListHandler(Connection conn) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM person";
List<Object[]> result = qr.query(conn, sql,new ArrayListHandler());
for(Object[] objs:result) { //遍历集合
for(Object obj:objs) {
System.out.print(obj + " ");
}
System.out.println();
}
}
将查询结果存于对象
BeanHandler类功能:将第一条记录存放到一个JavaBean中
Person s = qr.query(conn, sql, new BeanHandler<Person>(Person.class)); //Person类一个含有pid,pname,page变量的JavaBean
System.out.println(s.getP_id() + " " + s.getP_name() + " " + s.getP_age());
BeanListHandler类功能:将所有记录存放到一个List集合包装的JavaBean中
List<Person> list = qr.query(conn, sql, new BeanListHandler<Person>(Person.class));
for(Person s : list){
System.out.println(s);
}
将查询结果存于集合
MapHandler类功能:将结果集的第一行数据封装到Map集合中,其中“键”是列名,“值”是这列的数据;
Map<String,Object> map = qr.query(conn, sql, new MapHandler());
//遍历Map集合
for(String key : map.keySet()){
System.out.println(key+".."+map.get(key));
}
MapListHandler类功能:将结果集的全部封装到Map集合中
List<Map<String,Object>> list = qr.query(conn, sql, new MapListHandler());
//遍历集合list
for( Map<String,Object> map : list ){
for(String key : map.keySet()){
System.out.print(key+": "+map.get(key)+" ");
}
System.out.println();
ColumnListHandler类使用
**功能:**将结果集中的指定列的数据值,存放到一个List集合中。因为每个列的数据类型可能都是不同的,所以需要使用Object类型。
List<Object> list = qr.query(conn, sql, new ColumnListHandler<Object>("p_name")); //把数据库中pname所在列的所有数据放在一个List中
for(Object obj : list){
System.out.println(obj);
}
ScalarHandler类使用
适用于:结果集中有且只有一个结果(仅有一行一列)时的情形。
Object count = qr.query(conn, sql, new ScalarHandler<Long>()); //如果已经确定查询结果是个int型,则不用Object类型
System.out.println(count);