一、先熟悉DBUtils的API: 簡介:DbUtils是一個為簡化JDBC操作的小類庫。 (一)整個dbutils總共才3個包: 1、包org.apache.commons.dbutils 介面摘要 ResultSetHandler 將ResultSet轉換為別的對象的工具。 RowProcess ...
一、先熟悉DBUtils的API: 簡介:DbUtils是一個為簡化JDBC操作的小類庫。 (一)整個dbutils總共才3個包: 1、包org.apache.commons.dbutils 介面摘要
ResultSetHandler 將ResultSet轉換為別的對象的工具。
RowProcessor 將ResultSet行轉換為別的對象的工具。
類摘要
BasicRowProcessor RowProcessor介面的基本實現類。
BeanProcessor BeanProcessor匹配列明到Bean屬性名,並轉換結果集列到Bean對象的屬性中。
DbUtils 一個JDBC輔助工具集合。
ProxyFactory 產生JDBC介面的代理實現。
QueryLoader 屬性文件載入器,主要用於載入屬性文件中的 SQL 到記憶體中。
QueryRunner 使用可插拔的策略執行SQL查詢並處理結果集。
ResultSetIterator 包裝結果集為一個迭代器。
2、包org.apache.commons.dbutils.handlers
ResultSetHandler介面的實現類
類摘要
AbstractListHandler 將ResultSet轉為List的抽象類 ArrayHandler 將ResultSet轉為一個Object[]的ResultSetHandler實現類 ArrayListHandler 將ResultSet轉換為List<Object[]>的ResultSetHandler實現類 BeanHandler 將ResultSet行轉換為一個JavaBean的ResultSetHandler實現類 BeanListHandler 將ResultSet轉換為List<JavaBean>的ResultSetHandler實現類 ColumnListHandler 將ResultSet的一個列轉換為List<Object>的ResultSetHandler實現類 KeyedHandler 將ResultSet轉換為Map<Map>的ResultSetHandler實現類 MapHandler 將ResultSet的首行轉換為一個Map的ResultSetHandler實現類 MapListHandler 將ResultSet轉換為List<Map>的ResultSetHandler實現類 ScalarHandler 將ResultSet的一個列到一個對象。 3、包org.apache.commons.dbutils.wrappers 添加java.sql類中功能包裝類。
類摘要 SqlNullCheckedResultSet 在每個getXXX方法上檢查SQL NULL值的ResultSet包裝類。 StringTrimmedResultSet 取出結果集中字元串左右空格的ResultSet包裝類。 (二)使用DBUtils 其實只是使用的話,只看兩個類(DbUtils 和QueryRunner)和一個介面(ResultSethandler)就可以了。
1、DbUtils
DbUtils是一個為做一些諸如關閉連接、裝載JDBC驅動程式之類的常規工作提供有用方法的類,它裡面所有的方法都是靜態的。
這個類里的重要方法有:
close(): DbUtils類提供了三個重載的關閉方法。這些方法檢查所提供的參數是不是NULL,
如果不是的話,它們就關閉連接、聲明和結果集(ResultSet)。
CloseQuietly:
CloseQuietly這一方法不僅能在連接、聲明或者結果集(ResultSet)為NULL情況下避免關閉,
還能隱藏一些在程式中拋出的SQLEeception。如果你不想捕捉這些異常的話,這對你是非常有用的。
在重載CloseQuietly方法時,特別有用的一個方法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),
這是因為在大多數情況下,連接、聲明和結果集(ResultSet)是你要用的三樣東西,而且在最後的塊你必須關閉它們。
使用這一方法,你最後的塊就可以只需要調用這一方法即可。
CommitAndCloseQuietly(Connection conn):
這一方法用來提交連接,然後關閉連接,並且在關閉連接時不向上拋出在關閉時發生的一些SQL異常。
LoadDriver(String driveClassName):這一方法裝載並註冊JDBC驅動程式,如果成功就返回TRUE。
使用這種方法,你不需要去捕捉這個異常ClassNotFoundException。使用loadDrive方法,編碼就變得更容易理解,
你也就得到了一個很好的Boolean返回值,這個返回值會告訴你驅動類是不是已經載入成功了。
2、ResultSetHandler
這一介面執行處理一個jaca.sql.ResultSet,將數據轉變並處理為任何一種形式,這樣有益於其應用而且使用起來更容易。
這一組件提供了ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler等執行程式。
ResultSetHandler介面提供了一個單獨的方法:Object handle (java.sql.ResultSet .rs)。
因此任何ResultSetHandler 的執行需要一個結果集(ResultSet)作為參數傳入,然後才能處理這個結果集,再返回一個對象。
因為返回類型是java.lang.Object,所以除了不能返回一個原始的Java類型之外,其它的返回類型並沒有什麼限制。
如果你發現這七個執行程式中沒有任何一個提供了你想要的服務,你可以自己寫執行程式並使用它。 3、QreryRunner
這個類使執行SQL查詢簡單化了,它與ResultSetHandler串聯在一起有效地履行著一些平常的任務,它能夠大大減少你所要寫的編碼。
QueryRunner類提供了兩個構造器:其中一個是一個空構造器,另一個則拿一個 javax.sql.DataSource 來作為參數。
因此,在你不用為一個方法提供一個資料庫連接來作為參數的情況下,提供給構造器的數據源(DataSource) 被用來獲得一個新的連接並將繼續進行下去。 這一類中的重要方法包括以下這些: query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):
這一方法執行一個選擇查詢,在這個查詢中,對象陣列的值被用來作為查詢的置換參數。
這一方法內在地處理PreparedStatement 和ResultSet 的創建和關閉。
ResultSetHandler對把從 ResultSet得來的數據轉變成一個更容易的或是應用程式特定的格式來使用。 query(String sql, Object[] params, ResultSetHandler rsh):
這幾乎與第一種方法一樣;唯一的不同在於它不將資料庫連接提供給方法,
並且它是從提供給構造器的數據源(DataSource) 或使用的setDAtaSource 方法中重新獲得的。 query(Connection conn, String sql, ResultSetHandler rsh):
這執行一個不要參數的選擇查詢。 update(Connection conn, String sql, Object[] params):
這一方法被用來執行一個插入、更新或刪除操作。對象陣列為聲明保存著置換參數。
到此為止,說明工作就差不多了,下麵就實戰一下,進入DBUtils使用詳解二。
4、使用遵從以下步驟:
1.載入JDBC驅動程式類,並用DriverManager來得到一個資料庫連接conn。
2.實例化 QueryRunner,得到實例化對象qRunner。
3. qRunner.update()方法,執行增改刪的sql命令,
qRunner.query()方法,得到結果集。
5、實戰
1、連接類ConnectDb:import java.sql.DriverManager;
1 import java.sql.SQLException; 2 import java.sql.Connection; 3 4 public class ConnectDb { 5 private static String driveClassName = "com.mysql.jdbc.Driver"; 6 private static String url = "jdbc:mysql://192.168.1.161:3306/test?useUnicode=true&characterEncoding=utf8"; 7 8 private static String user = "root"; 9 private static String password = "e-playnow"; 10 11 public static Connection Connect(){ 12 Connection conn = null; 13 14 //load driver 15 try { 16 Class.forName(driveClassName); 17 } catch (ClassNotFoundException e) { 18 System.out.println("load driver failed!"); 19 e.printStackTrace(); 20 } 21 22 //connect db 23 try { 24 conn = DriverManager.getConnection(url, user, password); 25 } catch (SQLException e) { 26 System.out.println("connect failed!"); 27 e.printStackTrace(); 28 } 29 30 return conn; 31 } 32 }
2、資料庫表
1 CREATE TABLE `user` ( 2 `id` int(11) NOT NULL auto_increment, 3 `name` varchar(50) NOT NULL, 4 `age` tinyint(10) NOT NULL, 5 PRIMARY KEY (`id`) 6 ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
3、Bean
1 package Beans; 2 3 public class UserBean { 4 private int id; 5 private String name; 6 private int age; 7 8 public int getId() { 9 return id; 10 } 11 public void setId(int id) { 12 this.id = id; 13 } 14 public String getName() { 15 return name; 16 } 17 public void setName(String name) { 18 this.name = name; 19 } 20 public int getAge() { 21 return age; 22 } 23 public void setAge(int age) { 24 this.age = age; 25 } 26 }
4、Demo
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 import java.util.List; 4 import org.apache.commons.dbutils.DbUtils; 5 import org.apache.commons.dbutils.QueryRunner; 6 import org.apache.commons.dbutils.handlers.BeanListHandler; 7 import Beans.UserBean; 8 9 public class main { 10 11 public static void main(String[] args) throws SQLException { 12 insert_test(); 13 del_test(); 14 } 15 16 static void insert_test() throws SQLException{ 17 Connection conn = ConnectDb.Connect(); 18 19 //創建SQL執行工具 20 QueryRunner qRunner = new QueryRunner(); 21 22 //執行SQL插入 23 int n = qRunner.update(conn, "insert into user(name,age) values('xxx',22)"); 24 System.out.println("成功插入" + n + "條數據!"); 25 26 //關閉資料庫連接 27 DbUtils.closeQuietly(conn); 28 } 29 30 static void select_test() throws SQLException{ 31 Connection conn = ConnectDb.Connect(); 32 33 //創建SQL執行工具 34 QueryRunner qRunner = new QueryRunner(); 35 36 @SuppressWarnings("unchecked") 37 List<UserBean> list = (List<UserBean>) qRunner.query(conn, "select id,name,age from user", new BeanListHandler(UserBean.class)); 38 //輸出查詢結果 39 for (UserBean user : list) { 40 System.out.println(user.getAge()); 41 } 42 43 //關閉資料庫連接 44 DbUtils.closeQuietly(conn); 45 } 46 47 static void update_test() throws SQLException{ 48 Connection conn = ConnectDb.Connect(); 49 50 //創建SQL執行工具 51 QueryRunner qRunner = new QueryRunner(); 52 //執行SQL插入 53 int n = qRunner.update(conn, "update user set name = 'xxx',age=28"); 54 System.out.println("成功更新" + n + "條數據!"); 55 56 //關閉資料庫連接 57 DbUtils.closeQuietly(conn); 58 } 59 60 static void del_test() throws SQLException{ 61 Connection conn = ConnectDb.Connect(); 62 63 //創建SQL執行工具 64 QueryRunner qRunner = new QueryRunner(); 65 //執行SQL插入 66 int n = qRunner.update(conn, "DELETE from user WHERE name='xxx';"); 67 System.out.println("刪除成功" + n + "條數據!"); 68 69 //關閉資料庫連接 70 DbUtils.closeQuietly(conn); 71 } 72 }