JDBC : 使用DBUtils 工具類
所需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:用來執行一個不需要置換引數的更新操作。
1.2.ResultSetHandler介面<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>
該介面用於處理 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>