如果只使用JDBC進(jìn)行開發(fā),我們會發(fā)現(xiàn)冗余代碼過多,為了簡化JDBC開發(fā),本案例我們講采用apache commons組件一個(gè)成員:DBUtils。
DBUtils就是JDBC的簡化開發(fā)工具包。需要項(xiàng)目導(dǎo)入commons-dbutils-1.6.jar才能夠正常使用DBUtils工具。

DBUtils是java編程中的數(shù)據(jù)庫操作實(shí)用工具,小巧簡單實(shí)用。
DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫代碼。
Dbutils三個(gè)核心功能介紹:
- QueryRunner中提供對sql語句操作的API.
- ResultSetHandler接口,用于定義select操作后,怎樣封裝結(jié)果集.
- DbUtils類,它就是一個(gè)工具類,定義了關(guān)閉資源與事務(wù)處理的方法
DbUtils類核心方法
closeQuietly(Connection conn) 關(guān)閉連接,如果有異常try后不拋。
commitAndCloseQuietly(Connection conn) 提交并關(guān)閉連接
rollbackAndCloseQuietly(Connection conn) 回滾并關(guān)閉連接
QueryRunner核心類
update(Connection conn, String sql, Object... params),用來完成表數(shù)據(jù)的增加、刪除、更新操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用來完成表數(shù)據(jù)的查詢操作
一、QueryRunner實(shí)現(xiàn)添加、更新、刪除操作
update(Connection conn, String sql, Object... params),用來完成表數(shù)據(jù)的增加、刪除、更新操作
- 添加
public void insert(){
try {
//獲取一個(gè)用來執(zhí)行SQL語句的對象 QueryRunner
QueryRunner qr = new QueryRunner();
String sql = "INSERT INTO zhangwu(name,money,parent) VALUES(?,?,?)";
Object[] params = {"股票收入", 5500, "收入"};
Connection conn = JDBCUtils.getConnection*();
int line = qr.update(conn,sql,params);// 用來完成表數(shù)據(jù)的增加、刪除、更新操作
//結(jié)果集處理
System.out.println("line = " + line);
} catch(SQLException e) {
throw new RuntimeException(e);
}
}
- 更新
public void update(){
try{
//創(chuàng)建一個(gè)QueryRunner對象,用來完成SQL語句的執(zhí)行
QueryRunner qr = **new** QueryRunner();
//執(zhí)行SQL語句
String sql = "UPDATE zhangwu SET money = money+1000 WHERE name=?";
Object[] params = {"股票收入"};
Connection conn = JDBCUtils.*getConnection*();
int line = qr.update(conn, sql, params);
//結(jié)果集的處理
System.out.println("line="+line);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
- 刪除
public void delete(){
try{
//創(chuàng)建一個(gè)QueryRunner對象,用來完成SQL語句的執(zhí)行
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "DELETE FROM zhangwu WHERE name = ?";
Object[] params = {"股票收入"};
Connection conn = JDBCUtils.getConnection();
int line = qr.update(conn, sql, params);
//結(jié)果集的處理
System.out.println("line="+line);
} catch(SQLException e) {
throw new RuntimeException(e);
}
}
二、QueryRunner實(shí)現(xiàn)查詢操作
需要用到的類和方法:
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params),用來完成表數(shù)據(jù)的查詢操作ResultSetHandler結(jié)果集處理類
| 處理類 | 作用介紹 |
|---|---|
| ArrayHandler | 將結(jié)果集中的第一條記錄封裝到一個(gè)Object[]數(shù)組中,數(shù)組中的每一個(gè)元素就是這條記錄中的每一個(gè)字段的值 |
| ArrayListHandler | 將結(jié)果集中的每一條記錄都封裝到一個(gè)Object[]數(shù)組中,將這些數(shù)組在封裝到List集合中。 |
| BeanHandler | 將結(jié)果集中第一條記錄封裝到一個(gè)指定的javaBean中。 |
| BeanListHandler | 將結(jié)果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中 |
| ColumnListHandler | 將結(jié)果集中指定的列的字段值,封裝到一個(gè)List集合中 |
| ScalarHandler | 它是用于單數(shù)據(jù)。例如select count(*) from 表操作。 |
| MapHandler | 將結(jié)果集中第一條記錄封裝到了Map<String,Object>集合中,key就是字段名稱,value就是字段值 |
| MapListHandler | 將結(jié)果集中每一條記錄封裝到了Map<String,Object>集合中,key就是字段名稱,value就是字段值,在將這些Map封裝到List集合中。 |
JavaBean:
JavaBean就是一個(gè)類,在開發(fā)中常用語封裝數(shù)據(jù)。具有如下特性:
- 需要實(shí)現(xiàn)接口:java.io.Serializable ,通常實(shí)現(xiàn)接口這步驟省略了,不會影響程序。
- 提供私有字段:private 類型 字段名;
- 提供getter/setter方法:
- 提供無參構(gòu)造
創(chuàng)建一個(gè)JavaBean,用來封裝處理類返回的數(shù)據(jù):
/*
* 賬務(wù)類
*/
public class ZhangWu {
private int id;
private String name;
private double money;
private String parent;
public ZhangWu() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getParent() {
return parent;
}
public void setParent(String parent) {
this.parent = parent;
}
@Override
public String toString() { //該方法可以省略
return "ZhangWu [id=" + id + ", name=" + name + ", money=" + money + ", parent=" + parent + "]";
}
}
-
ArrayHandler與ArrayListHandler查詢
- ArrayHandler:將結(jié)果集中的第一條記錄封裝到一個(gè)Object[]數(shù)組中,數(shù)組中的每一個(gè)元素就是這條記錄中的每一個(gè)字段的值
public class ArrayHandlerDemo {
@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "SELECT * FROM zhangwu";
Object[] params = {};
Connection conn = JDBCUtils.getConnection();
Object[] objArray = qr.query(conn, sql, new ArrayHandler(), params);
//結(jié)果集的處理
System.out.println( Arrays.toString(objArray) );
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- ArrayListHandler:將結(jié)果集中的每一條記錄都封裝到一個(gè)Object[]數(shù)組中,將這些數(shù)組在封裝到List集合中。
public class ArrayListHandlerDemo {
@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "SELECT * FROM zhangwu WHERE money>?";
Object[] params = {2000};
Connection conn = JDBCUtils.getConnection();
List<Object[]> list = qr.query(conn, sql, new ArrayListHandler(), params);
//結(jié)果集的處理
for (Object[] objArray : list) {
System.out.println( Arrays.toString(objArray) );
}
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
-
BeanHandler與BeanListHandler查詢
- BeanHandler :將結(jié)果集中第一條記錄封裝到一個(gè)指定的javaBean中。
public class BeanHandlerDemo {
@Test
public void method(){
try{
//獲取QueryRunner
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "SELECT * FROM zhangwu WHERE id=?";
Object[] params = {1};
Connection conn = JDBCUtils.getConnection();
ZhangWu zw = qr.query(conn, sql, new BeanHandler<ZhangWu>(ZhangWu.class), params);
//結(jié)果集處理
System.out.println(zw);
conn.close();
} catch(SQLException e){
throw new RuntimeException(e);
}
}
}
- BeanListHandler :將結(jié)果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
public class BeanListHandlerDemo {
@Test
public void method(){
try{
//獲取QueryRunner
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "SELECT * FROM zhangwu WHERE money>?";
Object[] params = {2000};
Connection conn = JDBCUtils.getConnection();
List<ZhangWu> list = qr.query(conn, sql, new BeanListHandler<ZhangWu>(ZhangWu.class), params);
//結(jié)果集處理
for (ZhangWu zw : list) {
System.out.println(zw);
}
conn.close();
} catch(SQLException e){
throw new RuntimeException(e);
}
}
}
-
ColumnListHandler與ScalarHandler查詢
- ColumnListHandler:將結(jié)果集中指定的列的字段值,封裝到一個(gè)List集合中
public class ColumnListHandlerDemo {
@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "SELECT name FROM zhangwu WHERE money>?";
Object[] params = {2000};
Connection conn = JDBCUtils.getConnection();
List<String> list = qr.query(conn, sql, new ColumnListHandler<String>(), params);
//結(jié)果集的處理
for (String str : list) {
System.out.println(str);
}
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- ScalarHandler:它是用于單數(shù)據(jù)。例如select count(*) from 表操作。
public class ScalarHandlerDemo {
@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執(zhí)行SQL語句
String sql = "SELECT MAX(money) FROM zhangwu";
Object[] params = {};
Connection conn = JDBCUtils.getConnection();
Double max = qr.query(conn, sql, new ScalarHandler<Double>(), params);
//結(jié)果集的處理
System.out.println("max=" + max);
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}