日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDBC总复习下

發(fā)布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC总复习下 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一.數(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ù)庫連接池。

    • 配置屬性說明

    屬性默認(rèn)值說明
    initialSize0連接池啟動時創(chuàng)建的初始化連接數(shù)量
    maxActive8連接池中可同時連接的最大的連接數(shù)
    maxIdle8連接池中最大的空閑的連接數(shù),超過的空閑連接將被釋放,如果設(shè)置為負(fù)數(shù)表示不限制
    minIdle0連接池中最小的空閑的連接數(shù),低于這個數(shù)量會被創(chuàng)建新的連接。該參數(shù)越接近maxIdle,性能越好,因?yàn)檫B接的創(chuàng)建和銷毀,都是需要消耗資源的;但是不能太大。
    maxWait無限制最大等待時間,當(dāng)沒有可用連接時,連接池等待連接釋放的最大時間,超過該時間限制會拋出異常,如果設(shè)置-1表示無限等待
    poolPreparedStatementsfalse開啟池的Statement是否prepared
    maxOpenPreparedStatements無限制開啟池的prepared 后的同時最大連接數(shù)
    minEvictableIdleTimeMillis連接池中連接,在時間段內(nèi)一直空閑, 被逐出連接池的時間
    removeAbandonedTimeout300超過時間限制,回收沒有用(廢棄)的連接
    removeAbandonedfalse超過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(建議配置下)
    initialSize0初始化時建立物理連接的個數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時
    maxActive8最大連接池數(shù)量
    maxIdle8已經(jīng)不再使用,配置了也沒效果
    minIdle最小連接池數(shù)量
    maxWait獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
    poolPreparedStatementsfalse是否緩存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都不會其作用。
    testOnBorrowtrue申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。
    testOnReturnfalse歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能
    testWhileIdlefalse建議配置為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:查詢單個值對象

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的JDBC总复习下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。