開源框架:DBUtils使用詳解

来源:https://www.cnblogs.com/meiliguo/archive/2018/05/27/9097026.html
-Advertisement-
Play Games

一、先熟悉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 } 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Serial Downloader模式是一種串列下載模式,在這種模式下,BootROM通過指定的USB或者UART口來接收來自Host(恩智浦提供了上位機工具sdphost.exe或者mfgtool)的Flashloader數據,並將數據存儲在SRAM中執行,Flashloader程式可以用來將你的... ...
  • 命令語法如下: sudo apt-get install package=version 例如: sudo apt-get install samba=2:4.4.5+dfsg-2ubuntu6 ...
  • 終端清屏:clear,快捷鍵Ctrl+l ...
  • 問題描述:使用apt-get下載一個文件,由於下載的太慢,使用Ctrl+C強制結束。然後輸入sudo apt-get update,想繼續下載其他文件。結果出現如標題所示的錯誤,截圖如下:按照網上說的,對/var/cache/apt/下的操作,並沒有解決問題。 解決方法:參考地址首先在“系統設置”中 ...
  • nginx負載均衡及配置 1 負載均衡概述 2 負載均衡的常見平衡機制 1 輪詢(round robin) :以輪詢方式將請求分配到不同伺服器上,每個請求按時間順序逐一分配到不同的後端伺服器, 如果後端伺服器掛掉,自動剔除,保證正常的服務。 2 權重負載均衡(weight):如果沒有配置權重,每個服 ...
  • 目錄 一、關於Reducer全排序 1.1、 什麼叫全排序 1.2、 分區的標準是什麼 二、全排序的三種方式 2.1、 一個Reducer 2.2、 自定義分區函數 2.3、 採樣 一、關於Reducer全排序 1.1、什麼叫全排序? 在所有的分區(Reducer)中,KEY都是有序的: 正確舉例: ...
  • 若澤大數據測試平臺環境搭建 一、介質需求: 虛擬機:VMware Workstation 14.1.1.28517 大小:465.2MB 操作系統:CentOS-6.5-x86_64-bin-DVD1.iso 大小:4.16GB 二、測試環境搭建: 1、虛擬機安裝: 打開VMware Worksta ...
  • 1.添加PRIMARY KEY(主鍵索引) alter table `table_name` add primary key ( `column` ) 2.添加UNIQUE(唯一索引) alter table `table_name` add unique ( `column` ) 3.添加INDE ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...