JDBC总复习下
目錄
一.數(shù)據(jù)庫事務(wù)
1.1數(shù)據(jù)庫事務(wù)介紹
1.2事務(wù)的ACID屬性
1.3數(shù)據(jù)庫的并發(fā)問題
1.4隔離級別
1.5JDBC事務(wù)處理
二.DAO及相關(guān)實(shí)現(xiàn)類
三.數(shù)據(jù)庫連接池
3.1JDBC數(shù)據(jù)庫連接池的必要性
3.2數(shù)據(jù)庫連接池技術(shù)
3.3多種開源的數(shù)據(jù)庫連接池
3.4C3P0數(shù)據(jù)庫連接池
3.5DBCP數(shù)據(jù)庫連接池
3.6Druid(德魯伊)數(shù)據(jù)庫連接池
四.主要API的使用
4.1DbUtils
4.2QueryRunner類
4.3ResultSetHandler接口及實(shí)現(xiàn)類
一.數(shù)據(jù)庫事務(wù)
1.1數(shù)據(jù)庫事務(wù)介紹
事務(wù):一組邏輯操作單元,使數(shù)據(jù)從一種狀態(tài)變換到另一種狀態(tài)。
事務(wù)處理(事務(wù)操作):保證所有事務(wù)都作為一個工作單元來執(zhí)行,即使出現(xiàn)了故障,都不能改變這種執(zhí)行方式。當(dāng)在一個事務(wù)中執(zhí)行多個操作時,要么所有的事務(wù)都被提交(commit),那么這些修改就永久地保存下來;要么數(shù)據(jù)庫管理系統(tǒng)將放棄所作的所有修改,整個事務(wù)回滾(rollback)到最初狀態(tài)。
為確保數(shù)據(jù)庫中數(shù)據(jù)的一致性:數(shù)據(jù)的操縱應(yīng)當(dāng)是離散的成組的邏輯單元:當(dāng)它全部完成時,數(shù)據(jù)的一致性可以保持,而當(dāng)這個單元中的一部分操作失敗,整個事務(wù)應(yīng)全部視為錯誤,所有從起始點(diǎn)以后的操作應(yīng)全部回退到開始狀態(tài)。
1.2事務(wù)的ACID屬性
原子性(Atomicity) 原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
一致性(Consistency) 事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。
隔離性(Isolation) 事務(wù)的隔離性是指一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。
持久性(Durability) 持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對其有任何影響。
?
1.3數(shù)據(jù)庫的并發(fā)問題
-
對于同時運(yùn)行的多個事務(wù), 當(dāng)這些事務(wù)訪問數(shù)據(jù)庫中相同的數(shù)據(jù)時, 如果沒有采取必要的隔離機(jī)制, 就會導(dǎo)致各種并發(fā)問題:
-
臟讀: 對于兩個事務(wù) T1, T2, T1 讀取了已經(jīng)被 T2 更新但還沒有被提交的字段。之后, 若 T2 回滾, T1讀取的內(nèi)容就是臨時且無效的。
-
不可重復(fù)讀: 對于兩個事務(wù)T1, T2, T1 讀取了一個字段, 然后 T2 更新了該字段。之后, T1再次讀取同一個字段, 值就不同了。
-
幻讀: 對于兩個事務(wù)T1, T2, T1 從一個表中讀取了一個字段, 然后 T2 在該表中插入了一些新的行。之后, 如果 T1 再次讀取同一個表, 就會多出幾行。
-
-
數(shù)據(jù)庫事務(wù)的隔離性: 數(shù)據(jù)庫系統(tǒng)必須具有隔離并發(fā)運(yùn)行各個事務(wù)的能力, 使它們不會相互影響, 避免各種并發(fā)問題。
-
一個事務(wù)與其他事務(wù)隔離的程度稱為隔離級別。數(shù)據(jù)庫規(guī)定了多種事務(wù)隔離級別, 不同隔離級別對應(yīng)不同的干擾程度, 隔離級別越高, 數(shù)據(jù)一致性就越好, 但并發(fā)性越弱
1.4隔離級別
-
數(shù)據(jù)庫提供的4種事務(wù)隔離級別:
-
Oracle 支持的 2 種事務(wù)隔離級別:READ COMMITED, SERIALIZABLE。 Oracle 默認(rèn)的事務(wù)隔離級別為: READ COMMITED 。
-
Mysql 支持 4 種事務(wù)隔離級別。Mysql 默認(rèn)的事務(wù)隔離級別為: REPEATABLE READ。
1.5JDBC事務(wù)處理
-
數(shù)據(jù)一旦提交,就不可回滾。
-
數(shù)據(jù)什么時候意味著提交?
-
當(dāng)一個連接對象被創(chuàng)建時,默認(rèn)情況下是自動提交事務(wù):每次執(zhí)行一個 SQL 語句時,如果執(zhí)行成功,就會向數(shù)據(jù)庫自動提交,而不能回滾。
-
關(guān)閉數(shù)據(jù)庫連接,數(shù)據(jù)就會自動的提交。如果多個操作,每個操作使用的是自己單獨(dú)的連接,則無法保證事務(wù)。即同一個事務(wù)的多個操作必須在同一個連接下。
-
-
JDBC程序中為了讓多個 SQL 語句作為一個事務(wù)執(zhí)行:
-
調(diào)用 Connection 對象的 setAutoCommit(false); 以取消自動提交事務(wù)
-
在所有的 SQL 語句都成功執(zhí)行后,調(diào)用 commit(); 方法提交事務(wù)
-
在出現(xiàn)異常時,調(diào)用 rollback(); 方法回滾事務(wù)
若此時 Connection 沒有被關(guān)閉,還可能被重復(fù)使用,則需要恢復(fù)其自動提交狀態(tài) setAutoCommit(true)。尤其是在使用數(shù)據(jù)庫連接池技術(shù)時,執(zhí)行close()方法前,建議恢復(fù)自動提交狀態(tài)。
-
二.DAO及相關(guān)實(shí)現(xiàn)類
-
DAO:Data Access Object訪問數(shù)據(jù)信息的類和接口,包括了對數(shù)據(jù)的CRUD(Create、Retrival、Update、Delete),而不包含任何業(yè)務(wù)相關(guān)的信息。有時也稱作:BaseDAO
-
作用:為了實(shí)現(xiàn)功能的模塊化,更有利于代碼的維護(hù)和升級。
-
下面是尚硅谷JavaWeb階段書城項(xiàng)目中DAO使用的體現(xiàn):
三.數(shù)據(jù)庫連接池
3.1JDBC數(shù)據(jù)庫連接池的必要性
-
在使用開發(fā)基于數(shù)據(jù)庫的web程序時,傳統(tǒng)的模式基本是按以下步驟:
-
在主程序(如servlet、beans)中建立數(shù)據(jù)庫連接
-
進(jìn)行sql操作
-
斷開數(shù)據(jù)庫連接
-
-
這種模式開發(fā),存在的問題:
-
普通的JDBC數(shù)據(jù)庫連接使用 DriverManager 來獲取,每次向數(shù)據(jù)庫建立連接的時候都要將 Connection 加載到內(nèi)存中,再驗(yàn)證用戶名和密碼(得花費(fèi)0.05s~1s的時間)。需要數(shù)據(jù)庫連接的時候,就向數(shù)據(jù)庫要求一個,執(zhí)行完成后再斷開連接。這樣的方式將會消耗大量的資源和時間。數(shù)據(jù)庫的連接資源并沒有得到很好的重復(fù)利用。若同時有幾百人甚至幾千人在線,頻繁的進(jìn)行數(shù)據(jù)庫連接操作將占用很多的系統(tǒng)資源,嚴(yán)重的甚至?xí)斐煞?wù)器的崩潰。
-
對于每一次數(shù)據(jù)庫連接,使用完后都得斷開。否則,如果程序出現(xiàn)異常而未能關(guān)閉,將會導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄漏,最終將導(dǎo)致重啟數(shù)據(jù)庫。(回憶:何為Java的內(nèi)存泄漏?)
-
這種開發(fā)不能控制被創(chuàng)建的連接對象數(shù),系統(tǒng)資源會被毫無顧及的分配出去,如連接過多,也可能導(dǎo)致內(nèi)存泄漏,服務(wù)器崩潰。
-
3.2數(shù)據(jù)庫連接池技術(shù)
-
為解決傳統(tǒng)開發(fā)中的數(shù)據(jù)庫連接問題,可以采用數(shù)據(jù)庫連接池技術(shù)。
-
數(shù)據(jù)庫連接池的基本思想:就是為數(shù)據(jù)庫連接建立一個“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。
-
數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是重新建立一個。
-
數(shù)據(jù)庫連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設(shè)定的。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時,這些請求將被加入到等待隊(duì)列中。
數(shù)據(jù)庫連接池技術(shù)的優(yōu)點(diǎn)
1. 資源重用
由于數(shù)據(jù)庫連接得以重用,避免了頻繁創(chuàng)建,釋放連接引起的大量性能開銷。在減少系統(tǒng)消耗的基礎(chǔ)上,另一方面也增加了系統(tǒng)運(yùn)行環(huán)境的平穩(wěn)性。
2. 更快的系統(tǒng)反應(yīng)速度
數(shù)據(jù)庫連接池在初始化過程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫連接置于連接池中備用。此時連接的初始化工作均已完成。對于業(yè)務(wù)請求處理而言,直接利用現(xiàn)有可用連接,避免了數(shù)據(jù)庫連接初始化和釋放過程的時間開銷,從而減少了系統(tǒng)的響應(yīng)時間
3. 新的資源分配手段
對于多應(yīng)用共享同一數(shù)據(jù)庫的系統(tǒng)而言,可在應(yīng)用層通過數(shù)據(jù)庫連接池的配置,實(shí)現(xiàn)某一應(yīng)用最大可用數(shù)據(jù)庫連接數(shù)的限制,避免某一應(yīng)用獨(dú)占所有的數(shù)據(jù)庫資源
4. 統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄漏
在較為完善的數(shù)據(jù)庫連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的占用超時設(shè)定,強(qiáng)制回收被占用連接,從而避免了常規(guī)數(shù)據(jù)庫連接操作中可能出現(xiàn)的資源泄露
3.3多種開源的數(shù)據(jù)庫連接池
-
JDBC 的數(shù)據(jù)庫連接池使用 javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口通常由服務(wù)器(Weblogic, WebSphere, Tomcat)提供實(shí)現(xiàn),也有一些開源組織提供實(shí)現(xiàn):
-
DBCP 是Apache提供的數(shù)據(jù)庫連接池。tomcat 服務(wù)器自帶dbcp數(shù)據(jù)庫連接池。速度相對c3p0較快,但因自身存在BUG,Hibernate3已不再提供支持。
-
C3P0 是一個開源組織提供的一個數(shù)據(jù)庫連接池,速度相對較慢,穩(wěn)定性還可以。hibernate官方推薦使用
-
Proxool 是sourceforge下的一個開源項(xiàng)目數(shù)據(jù)庫連接池,有監(jiān)控連接池狀態(tài)的功能,穩(wěn)定性較c3p0差一點(diǎn)
-
BoneCP 是一個開源組織提供的數(shù)據(jù)庫連接池,速度快
-
Druid 是阿里提供的數(shù)據(jù)庫連接池,據(jù)說是集DBCP 、C3P0 、Proxool 優(yōu)點(diǎn)于一身的數(shù)據(jù)庫連接池,但是速度不確定是否有BoneCP快
-
-
DataSource 通常被稱為數(shù)據(jù)源,它包含連接池和連接池管理兩個部分,習(xí)慣上也經(jīng)常把 DataSource 稱為連接池
-
DataSource用來取代DriverManager來獲取Connection,獲取速度快,同時可以大幅度提高數(shù)據(jù)庫訪問速度。
-
特別注意:
-
數(shù)據(jù)源和數(shù)據(jù)庫連接不同,數(shù)據(jù)源無需創(chuàng)建多個,它是產(chǎn)生數(shù)據(jù)庫連接的工廠,因此整個應(yīng)用只需要一個數(shù)據(jù)源即可。
-
當(dāng)數(shù)據(jù)庫訪問結(jié)束后,程序還是像以前一樣關(guān)閉數(shù)據(jù)庫連接:conn.close(); 但conn.close()并沒有關(guān)閉數(shù)據(jù)庫的物理連接,它僅僅把數(shù)據(jù)庫連接釋放,歸還給了數(shù)據(jù)庫連接池。
-
3.4C3P0數(shù)據(jù)庫連接池
//使用C3P0數(shù)據(jù)庫連接池的配置文件方式,獲取數(shù)據(jù)庫的連接:推薦 private static DataSource cpds = new ComboPooledDataSource("helloc3p0"); public static Connection getConnection2() throws SQLException{Connection conn = cpds.getConnection();return conn; }//其中,src下的配置文件為:【c3p0-config.xml】 <?xml version="1.0" encoding="UTF-8"?> <c3p0-config><named-config name="helloc3p0"><!-- 獲取連接的4個基本信息 --><property name="user">root</property><property name="password">abc123</property><property name="jdbcUrl">jdbc:mysql:///test</property><property name="driverClass">com.mysql.jdbc.Driver</property><!-- 涉及到數(shù)據(jù)庫連接池的管理的相關(guān)屬性的設(shè)置 --><!-- 若數(shù)據(jù)庫中連接數(shù)不足時, 一次向數(shù)據(jù)庫服務(wù)器申請多少個連接 --><property name="acquireIncrement">5</property><!-- 初始化數(shù)據(jù)庫連接池時連接的數(shù)量 --><property name="initialPoolSize">5</property><!-- 數(shù)據(jù)庫連接池中的最小的數(shù)據(jù)庫連接數(shù) --><property name="minPoolSize">5</property><!-- 數(shù)據(jù)庫連接池中的最大的數(shù)據(jù)庫連接數(shù) --><property name="maxPoolSize">10</property><!-- C3P0 數(shù)據(jù)庫連接池可以維護(hù)的 Statement 的個數(shù) --><property name="maxStatements">20</property><!-- 每個連接同時可以使用的 Statement 對象的個數(shù) --><property name="maxStatementsPerConnection">5</property></named-config> </c3p0-config>3.5DBCP數(shù)據(jù)庫連接池
-
DBCP 是 Apache 軟件基金組織下的開源連接池實(shí)現(xiàn),該連接池依賴該組織下的另一個開源系統(tǒng):Common-pool。如需使用該連接池實(shí)現(xiàn),應(yīng)在系統(tǒng)中增加如下兩個 jar 文件:
-
Commons-dbcp.jar:連接池的實(shí)現(xiàn)
-
Commons-pool.jar:連接池實(shí)現(xiàn)的依賴庫
-
-
Tomcat 的連接池正是采用該連接池來實(shí)現(xiàn)的。該數(shù)據(jù)庫連接池既可以與應(yīng)用服務(wù)器整合使用,也可由應(yīng)用程序獨(dú)立使用。
-
數(shù)據(jù)源和數(shù)據(jù)庫連接不同,數(shù)據(jù)源無需創(chuàng)建多個,它是產(chǎn)生數(shù)據(jù)庫連接的工廠,因此整個應(yīng)用只需要一個數(shù)據(jù)源即可。
-
當(dāng)數(shù)據(jù)庫訪問結(jié)束后,程序還是像以前一樣關(guān)閉數(shù)據(jù)庫連接:conn.close(); 但上面的代碼并沒有關(guān)閉數(shù)據(jù)庫的物理連接,它僅僅把數(shù)據(jù)庫連接釋放,歸還給了數(shù)據(jù)庫連接池。
-
配置屬性說明
| initialSize | 0 | 連接池啟動時創(chuàng)建的初始化連接數(shù)量 |
| maxActive | 8 | 連接池中可同時連接的最大的連接數(shù) |
| maxIdle | 8 | 連接池中最大的空閑的連接數(shù),超過的空閑連接將被釋放,如果設(shè)置為負(fù)數(shù)表示不限制 |
| minIdle | 0 | 連接池中最小的空閑的連接數(shù),低于這個數(shù)量會被創(chuàng)建新的連接。該參數(shù)越接近maxIdle,性能越好,因?yàn)檫B接的創(chuàng)建和銷毀,都是需要消耗資源的;但是不能太大。 |
| maxWait | 無限制 | 最大等待時間,當(dāng)沒有可用連接時,連接池等待連接釋放的最大時間,超過該時間限制會拋出異常,如果設(shè)置-1表示無限等待 |
| poolPreparedStatements | false | 開啟池的Statement是否prepared |
| maxOpenPreparedStatements | 無限制 | 開啟池的prepared 后的同時最大連接數(shù) |
| minEvictableIdleTimeMillis | 連接池中連接,在時間段內(nèi)一直空閑, 被逐出連接池的時間 | |
| removeAbandonedTimeout | 300 | 超過時間限制,回收沒有用(廢棄)的連接 |
| removeAbandoned | false | 超過removeAbandonedTimeout時間后,是否進(jìn) 行沒用連接(廢棄)的回收 |
代碼:
//使用dbcp數(shù)據(jù)庫連接池的配置文件方式,獲取數(shù)據(jù)庫的連接:推薦 private static DataSource source = null; static{try {Properties pros = new Properties();InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties");pros.load(is);//根據(jù)提供的BasicDataSourceFactory創(chuàng)建對應(yīng)的DataSource對象source = BasicDataSourceFactory.createDataSource(pros);} catch (Exception e) {e.printStackTrace();}} public static Connection getConnection4() throws Exception {Connection conn = source.getConnection();return conn; }//其中,src下的配置文件為:【dbcp.properties】 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&useServerPrepStmts=false username=root password=abc123initialSize=10 #...3.6Druid(德魯伊)數(shù)據(jù)庫連接池
Druid是阿里巴巴開源平臺上一個數(shù)據(jù)庫連接池實(shí)現(xiàn),它結(jié)合了C3P0、DBCP、Proxool等DB池的優(yōu)點(diǎn),同時加入了日志監(jiān)控,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,可以說是針對監(jiān)控而生的DB連接池,可以說是目前最好的連接池之一。
package com.atguigu.druid;import java.sql.Connection; import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid.pool.DruidDataSourceFactory;public class TestDruid {public static void main(String[] args) throws Exception {Properties pro = new Properties(); pro.load(TestDruid.class.getClassLoader().getResourceAsStream("druid.properties"));DataSource ds = DruidDataSourceFactory.createDataSource(pro);Connection conn = ds.getConnection();System.out.println(conn);} }//其中,src下的配置文件為:【druid.properties】 url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true username=root password=123456 driverClassName=com.mysql.jdbc.DriverinitialSize=10 maxActive=20 maxWait=1000 filters=wall-
詳細(xì)配置參數(shù):
| name | 配置這個屬性的意義在于,如果存在多個數(shù)據(jù)源,監(jiān)控的時候可以通過名字來區(qū)分開來。 如果沒有配置,將會生成一個名字,格式是:”DataSource-” + System.identityHashCode(this) | |
| url | 連接數(shù)據(jù)庫的url,不同數(shù)據(jù)庫不一樣。例如:mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto | |
| username | 連接數(shù)據(jù)庫的用戶名 | |
| password | 連接數(shù)據(jù)庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。詳細(xì)看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter | |
| driverClassName | 根據(jù)url自動識別 這一項(xiàng)可配可不配,如果不配置druid會根據(jù)url自動識別dbType,然后選擇相應(yīng)的driverClassName(建議配置下) | |
| initialSize | 0 | 初始化時建立物理連接的個數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時 |
| maxActive | 8 | 最大連接池數(shù)量 |
| maxIdle | 8 | 已經(jīng)不再使用,配置了也沒效果 |
| minIdle | 最小連接池數(shù)量 | |
| maxWait | 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。 | |
| poolPreparedStatements | false | 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標(biāo)的數(shù)據(jù)庫性能提升巨大,比如說oracle。在mysql下建議關(guān)閉。 |
| maxOpenPreparedStatements | -1 | 要啟用PSCache,必須配置大于0,當(dāng)大于0時,poolPreparedStatements自動觸發(fā)修改為true。在Druid中,不會存在Oracle下PSCache占用內(nèi)存過多的問題,可以把這個數(shù)值配置大一些,比如說100 |
| validationQuery | 用來檢測連接是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會其作用。 | |
| testOnBorrow | true | 申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。 |
| testOnReturn | false | 歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能 |
| testWhileIdle | false | 建議配置為true,不影響性能,并且保證安全性。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。 |
| timeBetweenEvictionRunsMillis | 有兩個含義: 1)Destroy線程會檢測連接的間隔時間2)testWhileIdle的判斷依據(jù),詳細(xì)看testWhileIdle屬性的說明 | |
| numTestsPerEvictionRun | 不再使用,一個DruidDataSource只支持一個EvictionRun | |
| minEvictableIdleTimeMillis | ||
| connectionInitSqls | 物理連接初始化的時候執(zhí)行的sql | |
| exceptionSorter | 根據(jù)dbType自動識別 當(dāng)數(shù)據(jù)庫拋出一些不可恢復(fù)的異常時,拋棄連接 | |
| filters | 屬性類型是字符串,通過別名的方式配置擴(kuò)展插件,常用的插件有: 監(jiān)控統(tǒng)計(jì)用的filter:stat日志用的filter:log4j防御sql注入的filter:wall | |
| proxyFilters | 類型是List,如果同時配置了filters和proxyFilters,是組合關(guān)系,并非替換關(guān)系 |
四.主要API的使用
4.1DbUtils
DbUtils :提供如關(guān)閉連接、裝載JDBC驅(qū)動程序等常規(guī)工作的工具類,里面的所有方法都是靜態(tài)的。主要方法如下:
-
public static void close(…) throws java.sql.SQLException: DbUtils類提供了三個重載的關(guān)閉方法。這些方法檢查所提供的參數(shù)是不是NULL,如果不是的話,它們就關(guān)閉Connection、Statement和ResultSet。
-
public static void closeQuietly(…): 這一類方法不僅能在Connection、Statement和ResultSet為NULL情況下避免關(guān)閉,還能隱藏一些在程序中拋出的SQLEeception。
-
public static void commitAndClose(Connection conn)throws SQLException: 用來提交連接的事務(wù),然后關(guān)閉連接
-
public static void commitAndCloseQuietly(Connection conn): 用來提交連接,然后關(guān)閉連接,并且在關(guān)閉連接時不拋出SQL異常。
-
public static void rollback(Connection conn)throws SQLException:允許conn為null,因?yàn)榉椒▋?nèi)部做了判斷
-
public static void rollbackAndClose(Connection conn)throws SQLException
-
rollbackAndCloseQuietly(Connection)
-
public static boolean loadDriver(java.lang.String driverClassName):這一方裝載并注冊JDBC驅(qū)動程序,如果成功就返回true。使用該方法,你不需要捕捉這個異常ClassNotFoundException。
4.2QueryRunner類
-
該類簡單化了SQL查詢,它與ResultSetHandler組合在一起使用可以完成大部分的數(shù)據(jù)庫操作,能夠大大減少編碼量。
-
QueryRunner類提供了兩個構(gòu)造器:
-
默認(rèn)的構(gòu)造器
-
需要一個 javax.sql.DataSource 來作參數(shù)的構(gòu)造器
-
-
QueryRunner類的主要方法:
-
更新
-
public int update(Connection conn, String sql, Object... params) throws SQLException:用來執(zhí)行一個更新(插入、更新或刪除)操作。
-
......
-
-
插入
-
public <T> T insert(Connection conn,String sql,ResultSetHandler<T> rsh, Object... params) throws SQLException:只支持INSERT語句,其中 rsh - The handler used to create the result object from the ResultSet of auto-generated keys. 返回值: An object generated by the handler.即自動生成的鍵值
-
....
-
-
批處理
-
public int[] batch(Connection conn,String sql,Object params)throws SQLException: INSERT, UPDATE, or DELETE語句
-
public <T> T insertBatch(Connection conn,String sql,ResultSetHandler<T> rsh,Object params)throws SQLException:只支持INSERT語句
-
.....
-
-
查詢
-
public Object query(Connection conn, String sql, ResultSetHandler rsh,Object... params) throws SQLException:執(zhí)行一個查詢操作,在這個查詢中,對象數(shù)組中的每個元素值被用來作為查詢語句的置換參數(shù)。該方法會自行處理 PreparedStatement 和 ResultSet 的創(chuàng)建和關(guān)閉。
-
......
-
-
4.3ResultSetHandler接口及實(shí)現(xiàn)類
-
該接口用于處理 java.sql.ResultSet,將數(shù)據(jù)按要求轉(zhuǎn)換為另一種形式。
-
ResultSetHandler 接口提供了一個單獨(dú)的方法:Object handle (java.sql.ResultSet .rs)。
-
接口的主要實(shí)現(xiàn)類:
-
ArrayHandler:把結(jié)果集中的第一行數(shù)據(jù)轉(zhuǎn)成對象數(shù)組。
-
ArrayListHandler:把結(jié)果集中的每一行數(shù)據(jù)都轉(zhuǎn)成一個數(shù)組,再存放到List中。
-
BeanHandler:將結(jié)果集中的第一行數(shù)據(jù)封裝到一個對應(yīng)的JavaBean實(shí)例中。
-
BeanListHandler:將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個對應(yīng)的JavaBean實(shí)例中,存放到List里。
-
ColumnListHandler:將結(jié)果集中某一列的數(shù)據(jù)存放到List中。
-
KeyedHandler(name):將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個Map里,再把這些map再存到一個map里,其key為指定的key。
-
MapHandler:將結(jié)果集中的第一行數(shù)據(jù)封裝到一個Map里,key是列名,value就是對應(yīng)的值。
-
MapListHandler:將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個Map里,然后再存放到List
-
ScalarHandler:查詢單個值對象
-
總結(jié)
- 上一篇: Java类的基本运行顺序
- 下一篇: css中选择器介绍