1.
什么是JDBC API,什么時(shí)候使用?
Java DataBase Connectivity API允許我們使用關(guān)系數(shù)據(jù)庫。JDBC API接口和類是部分java.sql和javax.sqlpackage的一部分,我們可以使用JDBC API獲取數(shù)據(jù)庫連接,在數(shù)據(jù)庫服務(wù)器上運(yùn)行sql查詢和存儲(chǔ)過程,并處理結(jié)果。
JDBC API的編寫方法允許我們的Java程序和實(shí)際的JDBC驅(qū)動(dòng)程序之間的松散耦合,這使得我們可以很容易地從一個(gè)數(shù)據(jù)庫切換到另一個(gè)數(shù)據(jù)庫服務(wù)器。
2.
JDBC司機(jī)有哪些類型?
JDBC有四種類型的司機(jī)。任何使用數(shù)據(jù)庫的java程序都有兩個(gè)部分,第一部分是JDBC API,第二部分是執(zhí)行實(shí)際工作的驅(qū)動(dòng)程序。
JDBC-ODBC橋加ODBC驅(qū)動(dòng)(類型1):使用ODBC驅(qū)動(dòng)連接數(shù)據(jù)庫。我們應(yīng)該安裝ODBC驅(qū)動(dòng)程序來連接數(shù)據(jù)庫,這就是為什么這個(gè)驅(qū)動(dòng)程序幾乎過時(shí)了。
本機(jī)API部分支持Java技術(shù)的驅(qū)動(dòng)程序(類型2):該驅(qū)動(dòng)程序?qū)DBC類轉(zhuǎn)換為數(shù)據(jù)庫服務(wù)器的客戶端API。我們應(yīng)該安裝數(shù)據(jù)庫客戶端API。這不是首選驅(qū)動(dòng)程序,因?yàn)樗~外依賴于數(shù)據(jù)庫客戶端API驅(qū)動(dòng)程序。
數(shù)據(jù)庫中間件的純Java驅(qū)動(dòng)程序(類型3):該驅(qū)動(dòng)程序向可以連接到不同類型數(shù)據(jù)庫的中間件服務(wù)器發(fā)送JDBC調(diào)用。我們應(yīng)該安裝一個(gè)中間件服務(wù)器來使用這個(gè)驅(qū)動(dòng)程序。這增加了額外的網(wǎng)絡(luò)呼叫并降低了性能,這就是為什么JDBC驅(qū)動(dòng)程序沒有被廣泛使用的原因。
直接到數(shù)據(jù)庫的純Java驅(qū)動(dòng)程序(類型4):這個(gè)驅(qū)動(dòng)程序?qū)DBC調(diào)用轉(zhuǎn)換成數(shù)據(jù)庫服務(wù)器可以理解的網(wǎng)絡(luò)協(xié)議。該解決方案簡單,適合網(wǎng)絡(luò)上的數(shù)據(jù)庫連接。但是對于這個(gè)解決方案,我們應(yīng)該使用特定于數(shù)據(jù)庫的驅(qū)動(dòng)程序,比如Oracle的OJDBC jar for Oracle DB和MySQL Connector/J .
3.
JDBC API如何幫助我們實(shí)現(xiàn)Java程序和JDBC驅(qū)動(dòng)API的松耦合?
JDBC應(yīng)用編程接口使用java反射應(yīng)用編程接口來實(shí)現(xiàn)Java程序和JDBC驅(qū)動(dòng)程序之間的松耦合。如果你看一個(gè)簡單的JDBC例子,你會(huì)發(fā)現(xiàn)所有的編程都是由JDBC API完成的,驅(qū)動(dòng)只有在通過反射由Class.forName()方法加載時(shí)才會(huì)出現(xiàn)。
我認(rèn)為這是在核心java類中使用反射來確保我們的應(yīng)用程序不能直接使用驅(qū)動(dòng)程序接口的最好例子之一,這使得從一個(gè)數(shù)據(jù)庫移動(dòng)到另一個(gè)數(shù)據(jù)庫變得非常容易。
4.
什么是JDBC聯(lián)系?解釋在一個(gè)簡單的java程序中獲得數(shù)據(jù)庫連接的步驟。
JDBC連接類似于使用數(shù)據(jù)庫服務(wù)器創(chuàng)建的會(huì)話。您也可以將連接視為來自數(shù)據(jù)庫服務(wù)器的套接字連接。
創(chuàng)建JDBC連接非常簡單,需要兩步:
注冊并加載驅(qū)動(dòng)程序:使用Class.forName(),驅(qū)動(dòng)程序類在DriverManager中注冊并加載到內(nèi)存中。
使用驅(qū)動(dòng)管理器獲取連接對象:我們通過傳遞數(shù)據(jù)庫URL字符串、用戶名和密碼作為參數(shù)來獲取連接對象。
Connection con = null嘗試{ //加載驅(qū)動(dòng)類class . forname(" com . MySQL . JDBC . driver ");//創(chuàng)建連接con = driver manager . getconnection(" JDBC:MySQL://localhost:3306/userdb "," pankaj "," pankaj 123 ");} catch(SQLException e){ System . out . println("檢查數(shù)據(jù)庫是否正常,配置是否正確");e . printstacktrace();} catch(ClassNotFoundException e){ System . out . println("請?jiān)陬惵窂街邪琂DBC MySQL jar ");e . printstacktrace();}
5.
JDBC驅(qū)動(dòng)管理器類有什么用?
JDBC驅(qū)動(dòng)管理器是工廠類,我們通過它獲得數(shù)據(jù)庫連接對象。當(dāng)我們加載JDBC驅(qū)動(dòng)程序類時(shí),它會(huì)向驅(qū)動(dòng)管理器注冊,您可以通過查找JDBC驅(qū)動(dòng)程序類的源代碼來檢查它。
當(dāng)我們通過傳遞數(shù)據(jù)庫配置細(xì)節(jié)來調(diào)用方法DriverManager.getConnection()時(shí),DriverManager使用注冊的驅(qū)動(dòng)程序來獲取連接并將其返回給調(diào)用程序。
6.
如何在java程序中獲取數(shù)據(jù)庫服務(wù)器的詳細(xì)信息?
我們可以使用DatabaseMetaDataobject來獲取數(shù)據(jù)庫服務(wù)器的詳細(xì)信息。成功創(chuàng)建數(shù)據(jù)庫連接后,我們可以通過調(diào)用getMetaData()方法來獲取元數(shù)據(jù)對象。我們可以使用數(shù)據(jù)庫元數(shù)據(jù)中的方法來獲取數(shù)據(jù)庫產(chǎn)品名稱、版本和詳細(xì)的配置信息。
database metaData metaData = con . GetMetadata();string DBProducT = Metadata . GetDatabaseProductName();
7.
什么是JDBC聲明?
JDBC應(yīng)用編程接口語句用于在數(shù)據(jù)庫中執(zhí)行查詢。我們可以通過調(diào)用連接創(chuàng)建狀態(tài)()方法來創(chuàng)建一個(gè)語句對象。我們可以使用語句通過不同的執(zhí)行方法傳遞查詢來執(zhí)行靜態(tài)的SQL查詢,比如execute(),executeQuery(),executeUpdate(),等等。
由于查詢是在java程序中生成的,如果用戶輸入驗(yàn)證不正確,可能會(huì)導(dǎo)致SQL注入問題,更多細(xì)節(jié)可以在SQL注入示例中找到。
默認(rèn)情況下,每個(gè)語句對象只能同時(shí)打開一個(gè)結(jié)果集對象。因此,如果我們想使用多個(gè)結(jié)果集對象,每個(gè)對象必須由不同的語句對象生成。語句接口中的所有execute()方法都隱式關(guān)閉語句的當(dāng)前結(jié)果集對象(如果有打開的對象)。
8.
execute、executeQuery和executeUpdate有什么區(qū)別?
語句執(zhí)行(字符串查詢)用于執(zhí)行任何SQL查詢,如果結(jié)果是結(jié)果集(如運(yùn)行選擇查詢),則返回真。當(dāng)沒有結(jié)果集對象時(shí)(如運(yùn)行插入或更新查詢),輸出為假。我們可以使用getResultSet()獲取結(jié)果集,使用getUpdateCount()方法檢索更新計(jì)數(shù)。
語句執(zhí)行查詢(字符串查詢)用于執(zhí)行選擇查詢并返回結(jié)果集。即使沒有與查詢匹配的記錄,返回的結(jié)果集也不會(huì)為空。在執(zhí)行選擇查詢時(shí),我們應(yīng)該使用executeQuery方法,這樣如果有人試圖執(zhí)行insert/update語句,就會(huì)拋出java.sql.SQLException,并顯示消息“executeQuery方法不能用于更新”。
執(zhí)行更新(字符串查詢)用于執(zhí)行不返回任何內(nèi)容的插入/更新/刪除(DML)語句或DDL語句。Output為int,等于SQL數(shù)據(jù)操作語言(DML)語句的行數(shù)。對于DDL語句,輸出為0。
execute()方法只能在語句類型不確定時(shí)使用;否則,應(yīng)該使用executeQuery或executeUpdate方法。
9.
什么是JDBC準(zhǔn)備聲明?
JDBC準(zhǔn)備狀態(tài)對象代表一個(gè)預(yù)編譯的SQL語句。我們可以使用它的setter方法來設(shè)置查詢的變量。
因?yàn)镻reparedStatement是預(yù)編譯的,所以它可以用來多次有效地執(zhí)行該語句。對于語句來說,PreparedStatement是一個(gè)更好的選擇,因?yàn)樗詣?dòng)轉(zhuǎn)義特殊字符并避免了SQL注入攻擊。
10.
如何在JDBC報(bào)表中設(shè)置空值。
我們可以使用PreparedStatement setNull()方法將空變量綁定到參數(shù)。例如,setNull方法以index和SQL Types作為參數(shù)ps.setnull (10,Java . SQL . Types . integer);。
11.
getGeneratedKeys()方法在Statement中有什么用?
有時(shí),表可以使用自動(dòng)生成的鍵來插入主鍵的唯一列值。我們可以使用語句getGeneratedKeys()方法來獲取這個(gè)自動(dòng)生成的密鑰的值。
12.
報(bào)表附注有什么好處?
報(bào)表附注的一些優(yōu)點(diǎn)是:
PreparedStatement幫助我們防止SQL注入攻擊,因?yàn)樗鼤?huì)自動(dòng)轉(zhuǎn)義特殊字符。
PreparedStatement允許我們使用參數(shù)輸入來執(zhí)行動(dòng)態(tài)查詢。
準(zhǔn)備語句比語句快。當(dāng)我們重用PreparedStatement或使用其批處理方法執(zhí)行多個(gè)查詢時(shí),這一點(diǎn)變得更加明顯。
PreparedStatement幫助我們使用setter方法編寫面向?qū)ο蟮拇a,而使用語句時(shí),我們必須使用字符串連接來創(chuàng)建查詢。如果要設(shè)置多個(gè)參數(shù),使用字符串連接編寫查詢看起來很難看,而且容易出錯(cuò)。
13.
PreparedStatement的局限性是什么,如何克服?
準(zhǔn)備聲明的一個(gè)限制是我們不能在IN子句中直接使用它。在in子句中使用PreparedStatement的一些替代方法是:
執(zhí)行單個(gè)查詢的性能非常慢,不建議這樣做
使用存儲(chǔ)過程是特定于數(shù)據(jù)庫的,因此不適合多個(gè)數(shù)據(jù)庫應(yīng)用程序。
這是一種動(dòng)態(tài)創(chuàng)建準(zhǔn)備狀態(tài)查詢的好方法,但它失去了緩存準(zhǔn)備狀態(tài)的好處。
在PreparedStatement查詢中使用NULL當(dāng)您知道變量輸入的最大數(shù)量時(shí),這是一個(gè)很好的方法,可以通過部分執(zhí)行來擴(kuò)展,以允許無限制的參數(shù)。更詳細(xì)的分析可以在JDBC準(zhǔn)備聲明條款替換中找到。
14.
什么是JDBC結(jié)果集?
Jdbcsultset類似于表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常是通過執(zhí)行查詢數(shù)據(jù)庫的語句生成的。
結(jié)果集對象保持一個(gè)指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。最初,光標(biāo)位于第一行之前。next()方法將光標(biāo)移動(dòng)到下一行。如果沒有更多的行,next()方法返回false,并且可以在while循環(huán)中使用它來迭代結(jié)果集。
默認(rèn)的結(jié)果集對象不可更新,并且只有一個(gè)光標(biāo)向前移動(dòng)。因此,只能迭代一次,并且只能從第一行迭代到最后一行。您可以使用以下語法生成可滾動(dòng)和/或可更新的結(jié)果集對象。
語句stmt = con . CreateStatement(ResultSet。不敏感,結(jié)果集。CONCUR _ UPDATABLE
當(dāng)生成結(jié)果集對象的語句對象被關(guān)閉、重新執(zhí)行或用于從多個(gè)結(jié)果序列中檢索下一個(gè)結(jié)果時(shí),該對象將自動(dòng)關(guān)閉。
我們可以使用ResultSet getter方法、列名或索引號(hào)從1中檢索列數(shù)據(jù)。
15.
結(jié)果集有哪些不同類型?
創(chuàng)建語句時(shí),我們可以根據(jù)用戶輸入獲得不同類型的結(jié)果集對象。如果您查看連接方法,您會(huì)看到createStatement()和prepareStatement()方法被重載,以提供結(jié)果集類型和并發(fā)性作為輸入?yún)?shù)。
結(jié)果集對象有三種類型。
結(jié)果集。TYPEFORWARDONLY:這是默認(rèn)類型,光標(biāo)只能在結(jié)果集中向前移動(dòng)。
結(jié)果集。類型不敏感:光標(biāo)可以前后移動(dòng),結(jié)果集對創(chuàng)建結(jié)果集后其他人對數(shù)據(jù)庫的更改不敏感。
結(jié)果集。TYPESCROLLSENSITIVE:光標(biāo)可以前后移動(dòng),結(jié)果集對創(chuàng)建結(jié)果集后其他人對數(shù)據(jù)庫所做的更改很敏感。基于并發(fā)性有兩種類型的結(jié)果集對象。
結(jié)果集。并發(fā)只讀:結(jié)果集是只讀的,這是默認(rèn)的并發(fā)類型。
結(jié)果集。CONCUR _可更新:我們可以使用ResultSet更新方法來更新行數(shù)據(jù)。
16.
setFetchSize()和setMaxRows()方法在語句中有什么用?
我們可以使用setMaxRows(int i)方法來限制數(shù)據(jù)庫從查詢中返回的行數(shù)。您可以使用SQL查詢本身來實(shí)現(xiàn)相同的功能。例如,在MySQL中,我們可以使用LIMIT子句來設(shè)置查詢返回的最大行數(shù)。
理解fetchSize可能很棘手,因?yàn)槟鷳?yīng)該知道語句和結(jié)果集是如何工作的。當(dāng)我們在數(shù)據(jù)庫中執(zhí)行查詢時(shí),我們將在數(shù)據(jù)庫緩存中獲取并維護(hù)結(jié)果,并返回結(jié)果集。結(jié)果集是一個(gè)引用數(shù)據(jù)庫中結(jié)果的游標(biāo)。
假設(shè)我們有一個(gè)返回100行的查詢,我們將fetchSize設(shè)置為10,那么JDBC驅(qū)動(dòng)程序在每次數(shù)據(jù)庫訪問時(shí)將只獲得10行,因此將有10次訪問來獲得所有的行。如果每一行都需要大量的處理時(shí)間,并且結(jié)果中的行數(shù)很大,那么設(shè)置最佳的fetchSize是有幫助的。
我們可以通過Statement對象設(shè)置fetchSize,但是可以通過ResultSet對象的set fetchSize()方法覆蓋它。
17.
如何使用JDBC API調(diào)用存儲(chǔ)過程?
存儲(chǔ)過程是在數(shù)據(jù)庫中編譯的一組SQL查詢,可以從JDBC應(yīng)用編程接口執(zhí)行。JDBC調(diào)用狀態(tài)可用于執(zhí)行數(shù)據(jù)庫中的存儲(chǔ)過程。初始化CallableStatement的語法為;
CallableStatement stmt = con . prepare call({ call insert Employee(?,?,?,?,?,?)}");stmt.setInt(1,id);stmt.setString(2,name);stmt.setString(3,角色);stmt.setString(4,city);stmt.setString(5,國家);//我們需要在調(diào)用存儲(chǔ)過程之前注冊外部參數(shù)stmt.registeroutparameter (6,java.sql.types.varchar)。stmt . execute update();
我們需要在執(zhí)行CallableStatement之前注冊O(shè)UT參數(shù)。
18.
什么是JDBC批量加工,它有什么好處?
有時(shí)我們需要為數(shù)據(jù)庫運(yùn)行類似的批處理查詢,比如將數(shù)據(jù)從CSV文件加載到關(guān)系數(shù)據(jù)庫表中。我們知道我們可以選擇使用語句或準(zhǔn)備語句來執(zhí)行查詢。此外,JDBC API還提供了批處理功能,通過它我們可以一次對數(shù)據(jù)庫執(zhí)行大量查詢。
JDBC應(yīng)用編程接口通過語句和準(zhǔn)備語句添加批處理()和執(zhí)行批處理()方法支持批處理。
批處理比一次執(zhí)行一條語句更快,因?yàn)閿?shù)據(jù)庫調(diào)用更少。
19.
什么是JDBC交易管理?我們?yōu)槭裁葱枰?/p>
默認(rèn)情況下,當(dāng)我們創(chuàng)建數(shù)據(jù)庫連接時(shí),它以自動(dòng)提交模式運(yùn)行。這意味著無論何時(shí)執(zhí)行并完成查詢,都會(huì)自動(dòng)觸發(fā)提交。因此,我們觸發(fā)的每個(gè)SQL查詢都是一個(gè)事務(wù)。如果我們運(yùn)行一些DML或DDL查詢,這些更改將在每個(gè)SQL語句完成后保存到數(shù)據(jù)庫中。
有時(shí),我們希望一組SQL查詢成為事務(wù)的一部分,這樣我們就可以在所有查詢正常運(yùn)行時(shí)提交它們。如果我們得到任何異常,我們可以選擇回滾作為事務(wù)一部分執(zhí)行的所有查詢。
JDBC應(yīng)用編程接口提供了一個(gè)方法,設(shè)置自動(dòng)提交(布爾標(biāo)志),通過它我們可以禁用連接的自動(dòng)提交功能。我們應(yīng)該僅在必要時(shí)禁用自動(dòng)提交,因?yàn)槌俏覀冊谶B接上調(diào)用commit()方法,否則不會(huì)提交事務(wù)。數(shù)據(jù)庫服務(wù)器使用表鎖實(shí)現(xiàn)事務(wù)管理,這是一個(gè)資源密集型的過程。因此,我們應(yīng)該在完成交易后立即提交交易。
20.
如何回滾JDBC事務(wù)?
我們可以使用連接對象回滾()方法來來回回滾事務(wù)。它回滾事務(wù)所做的所有更改,并釋放此連接對象當(dāng)前持有的所有數(shù)據(jù)庫鎖。
21.
什么是JDBC保存點(diǎn)?怎么用?
有時(shí),一個(gè)事務(wù)可以是一組多個(gè)語句,我們希望回滾到事務(wù)中的某個(gè)特定點(diǎn)。JDBC保存點(diǎn)幫助我們在事務(wù)中創(chuàng)建檢查點(diǎn),我們可以回滾到該特定檢查點(diǎn)。
為事務(wù)創(chuàng)建的任何保存點(diǎn)都會(huì)自動(dòng)釋放,并在事務(wù)提交或整個(gè)事務(wù)回滾時(shí)變得無效。將事務(wù)回滾到保存點(diǎn)會(huì)自動(dòng)釋放在相關(guān)保存點(diǎn)之后創(chuàng)建的任何其他保存點(diǎn),并使其無效。
22.
什么是JDBC數(shù)據(jù)源?它的優(yōu)點(diǎn)是什么?
JDBC數(shù)據(jù)源是javax.sql包中定義的接口,比DriverManager功能更強(qiáng)大,可以用于數(shù)據(jù)庫連接。我們可以使用數(shù)據(jù)源來創(chuàng)建數(shù)據(jù)庫連接,并且可以使用驅(qū)動(dòng)程序?qū)崿F(xiàn)類來獲得連接的實(shí)際工作。除了獲取數(shù)據(jù)庫連接,數(shù)據(jù)源還提供了一些其他功能,例如:
緩存準(zhǔn)備狀態(tài)用于加快處理連接超時(shí)設(shè)置記錄函數(shù)最大大小閾值使用JNDI支持servlet容器中的連接池讀取有關(guān)JDBC數(shù)據(jù)源的更多信息。
23.
如何在Apache Tomcat服務(wù)器中使用JDBC數(shù)據(jù)源和JNDI實(shí)現(xiàn)JDBC連接池?
對于部署在servlet容器中的Web應(yīng)用程序,創(chuàng)建JDBC連接池非常簡單,只需要幾個(gè)步驟。
在容器配置文件中創(chuàng)建一個(gè)JDBC·JNDI資源,例如
server.xml
context.xml在Web應(yīng)用程序中,使用InitialContext查找第一步中配置的JNDI資源,然后獲取連接。
Context ctx = new InitialContext();DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");24.
什么是阿帕奇DBCP API?
如果使用數(shù)據(jù)源獲取數(shù)據(jù)庫連接,通常用于獲取連接的代碼與特定于驅(qū)動(dòng)程序的數(shù)據(jù)源實(shí)現(xiàn)緊密耦合。除了選擇數(shù)據(jù)源實(shí)現(xiàn)類,大部分代碼都是樣板代碼。
Apache DBCP通過提供數(shù)據(jù)源實(shí)現(xiàn)幫助我們擺脫這些問題,數(shù)據(jù)源實(shí)現(xiàn)充當(dāng)了我們的程序和不同JDBC驅(qū)動(dòng)程序之間的抽象層。阿帕奇DBCP圖書館依賴于公地池圖書館,所以要確保它們都在構(gòu)建路徑中。
25.
什么是JDBC連接隔離等級?
當(dāng)我們使用JDBC事務(wù)來實(shí)現(xiàn)數(shù)據(jù)完整性時(shí),DBMS使用鎖來防止其他人訪問事務(wù)訪問的數(shù)據(jù)。DBMS使用鎖來防止臟讀、不可重復(fù)讀和幻影讀。
DBMS使用JDBC事務(wù)隔離級別來使用鎖定機(jī)制。我們可以通過connectiongettransactionin solution()方法獲取隔離級別信息,并通過setTransactionIsolation()方法進(jìn)行設(shè)置。
26.
什么是JDBC行集?行集有哪些類型?
Jdbcrrowset以更靈活的方式保存表數(shù)據(jù),即ResultSet。所有行集對象都是從結(jié)果集派生的,因此它們具有結(jié)果集的所有功能和一些其他功能。行集接口是在javax.sql包中定義的。
行集提供的一些附加功能包括:
帶有屬性和它們的getter-setter方法的Java Bean。行集使用JavaBeans事件模型,該模型可以向任何已注冊的組件發(fā)送事件通知,例如光標(biāo)移動(dòng)、更新/插入/刪除行以及更改行集內(nèi)容。
默認(rèn)情況下,行集對象是可滾動(dòng)和可更新的,所以如果DBMS不支持可滾動(dòng)或可更新的結(jié)果集,我們可以使用行集來獲取這些函數(shù)。
行集大致分為兩種類型:
連接的行集對象-這些對象連接到數(shù)據(jù)庫,與結(jié)果集對象最相似。JDBC API只提供了一個(gè)連接的RowSet對象javax.sql.RowSet.JdbcRowSet,它的標(biāo)準(zhǔn)實(shí)現(xiàn)類是com . sun . RowSet . JDBC RowSet impl disconnected RowSet對象——這些RowSet對象不需要連接到數(shù)據(jù)庫,所以比較輕便,可以序列化。它們適合通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù)。有四種類型的斷開連接的行集實(shí)現(xiàn)。
它們可以獲得連接,執(zhí)行查詢,讀取結(jié)果集數(shù)據(jù)來填充行集數(shù)據(jù)。當(dāng)數(shù)據(jù)斷開連接時(shí),我們可以操作和更新數(shù)據(jù),重新連接到數(shù)據(jù)庫并寫入更改。WebRowSet是從CachedRowSet派生出來的——它們可以讀寫XML文檔。JoinRowSet是從WebRowSet派生的——它們可以在不連接到數(shù)據(jù)源的情況下形成SQL連接。從WebRowSet派生的篩選行集-我們可以應(yīng)用篩選條件,以便只顯示選定的數(shù)據(jù)。
27.
結(jié)果集和行集有什么區(qū)別?
行集對象是從結(jié)果集派生的,因此它們具有結(jié)果集的所有功能和一些附加功能。行集的一個(gè)優(yōu)點(diǎn)是它們可以斷開連接,使它們重量輕,易于在網(wǎng)絡(luò)上傳輸。
是否使用結(jié)果集或行集取決于您的要求,但是如果您計(jì)劃長時(shí)間使用結(jié)果集,斷開連接的行集是釋放數(shù)據(jù)庫資源的更好選擇。
28.
有哪些常見的JDBC例外?
一些常見的JDBC例外情況是:
這是JDBC異常的基本異常類。這個(gè)異常是在批處理操作失敗時(shí)拋出的,但是這取決于JDBC驅(qū)動(dòng)程序拋出這個(gè)異常還是基本的SQLException。Java . sql . SqlWarning-在SQL操作中使用的警告消息。當(dāng)數(shù)據(jù)值由于超過MaxFieldSize而被意外截?cái)鄷r(shí)。
29.
JDBC有哪些CLOB和BLOB數(shù)據(jù)類型?
字符大對象(CLOB)是由單字節(jié)字符和相關(guān)代碼頁組成的字符串。這種數(shù)據(jù)類型適用于存儲(chǔ)面向文本的信息,其中信息量可能超過傳統(tǒng)VARCHAR數(shù)據(jù)類型的限制(上限為32 KB)。
二進(jìn)制大對象(BLOB)是由字節(jié)組成的二進(jìn)制字符串,沒有關(guān)聯(lián)的代碼頁。這種數(shù)據(jù)類型可以存儲(chǔ)大于VARBEROS(32K限制)的二進(jìn)制數(shù)據(jù)。這種數(shù)據(jù)類型適用于存儲(chǔ)圖像、語音、圖形和其他類型的業(yè)務(wù)或特定于應(yīng)用的數(shù)據(jù)。
30.
什么是JDBC的“骯臟閱讀”?哪個(gè)隔離級別防止臟讀?
當(dāng)我們處理事務(wù)時(shí),可以更新行,而其他查詢可以讀取更新的值。這將導(dǎo)致臟讀,因?yàn)楦碌闹挡皇怯谰玫?,并且更新行的事?wù)可以回滾到以前的值,從而導(dǎo)致無效數(shù)據(jù)。
隔離級別TRANSACTIONREADCOMMITTED、TRANSACTION_REPEATABLEREAD和TRANSACTIONSERIALIZABLE防止臟讀。
31.
什么是2階段提交?
當(dāng)我們在涉及多個(gè)數(shù)據(jù)庫的分布式系統(tǒng)中工作時(shí),我們需要使用兩階段提交協(xié)議。兩階段提交協(xié)議是分布式系統(tǒng)的原子提交協(xié)議。在第一階段,事務(wù)管理器向所有事務(wù)資源發(fā)送提交請求。如果所有事務(wù)資源都正常,事務(wù)管理器將提交所有資源的事務(wù)更改。如果任何事務(wù)資源響應(yīng)為“中止”,事務(wù)管理器可以回滾所有事務(wù)更改。
32.
JDBC有哪些不同類型的鎖?
廣義而言,有兩種類型的鎖定機(jī)制可以防止數(shù)據(jù)損壞,因?yàn)槎鄠€(gè)用戶使用相同的數(shù)據(jù)。
樂觀鎖定-使用代碼來實(shí)現(xiàn)這種鎖定。表中引入了一個(gè)額外的列來保持更新計(jì)數(shù)。當(dāng)你選擇了這一行,你也會(huì)讀到這一列,比如“版本”?,F(xiàn)在,當(dāng)您試圖更新/刪除一行時(shí),這個(gè)“版本”將在where子句中傳遞。因此,如果同時(shí)執(zhí)行其他線程的更新,更新將會(huì)失敗。這是避免數(shù)據(jù)損壞的好方法,但是如果有人在更新語句中遺漏了更新“版本”,可能很容易出錯(cuò)。這樣,更新查詢?nèi)缦滤尽?/p>mysql> update emp SET name = 'David', version = 5 WHERE id = 10 and version = 4;
悲觀鎖定-從選擇到讀取、更新和提交鎖定記錄。這通常由數(shù)據(jù)庫供應(yīng)商軟件完成,并通過使用選擇進(jìn)行更新查詢來觸發(fā)。如果線程長時(shí)間處理鎖,這種鎖定行的方式可能會(huì)導(dǎo)致性能下降和死鎖。
此外,一些DBMS系統(tǒng)提供鎖定機(jī)制來鎖定單個(gè)行、表或數(shù)據(jù)庫。
33.
你對DDL和DML語句了解多少?
數(shù)據(jù)定義語言語句用于定義數(shù)據(jù)庫模式。創(chuàng)建、更改、刪除、截?cái)?、重命名語句是DDL語句,通常不會(huì)返回任何結(jié)果。
數(shù)據(jù)操作語言語句用于操作數(shù)據(jù)庫模式中的數(shù)據(jù)。選擇、插入、更新、刪除、調(diào)用等等都是DML語句的例子。
34.
java.util.Date和java.sql.Date有什么區(qū)別?
Java.util.Date包含日期和時(shí)間信息,而java.sql.Date只包含日期信息,沒有時(shí)間信息。因此,如果必須在數(shù)據(jù)庫中保留時(shí)間信息,建議使用時(shí)間戳或日期時(shí)間字段。
35.
如何將圖像或原始數(shù)據(jù)插入數(shù)據(jù)庫?
我們可以使用BLOB將圖像或原始二進(jìn)制數(shù)據(jù)插入數(shù)據(jù)庫。
36.
什么是幻影閱讀,什么隔離等級阻止?
虛擬讀取是指事務(wù)多次執(zhí)行查詢并獲取不同數(shù)據(jù)的情況。假設(shè)一個(gè)事務(wù)正在執(zhí)行一個(gè)查詢以根據(jù)條件獲取數(shù)據(jù),然后另一個(gè)事務(wù)插入一個(gè)與條件匹配的行?,F(xiàn)在,當(dāng)同一事務(wù)再次執(zhí)行查詢時(shí),新行將成為結(jié)果集的一部分。新行叫幻影行,這種情況叫幻影讀。
只有TRANSACTION_SERIALIZABLE隔離級別可以防止幻影讀取。
37.
什么是SQL警告?如何在JDBC程序中檢索SQL警告。
SQLWarning是SQLException的子類,可以通過調(diào)用Connection、Statement和ResultSet對象上的getWarnings()方法來檢索。SQL警告不會(huì)停止腳本的執(zhí)行,但會(huì)向用戶發(fā)出警告。
38.
如何使用數(shù)據(jù)庫對象作為IN/OUT調(diào)用Oracle存儲(chǔ)過程?
如果Oracle存儲(chǔ)過程有IN/OUT參數(shù)作為數(shù)據(jù)庫對象,我們需要在程序中創(chuàng)建一個(gè)大小相同的對象數(shù)組,然后用它來創(chuàng)建Oracle STRUCT對象。然后我們可以為數(shù)據(jù)庫對象設(shè)置這個(gè)STRUCT對象,并通過調(diào)用setSTRUCT()方法來使用它。
39.
什么時(shí)候能拿到j(luò)ava.sql.SQLException:找不到合適的驅(qū)動(dòng)?
當(dāng)SQL URL字符串格式不正確時(shí),如果沒有合適的驅(qū)動(dòng)程序,就會(huì)出現(xiàn)異常。您可以在使用驅(qū)動(dòng)管理器的簡單Java應(yīng)用程序中或使用數(shù)據(jù)源的JNDI資源中獲得此異常。異常堆棧跟蹤如下所示。
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL ''jdbc:mysql://localhost:3306/UserDB' at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)java.sql.SQLException: No suitable driver found for 'jdbc:mysql://localhost:3306/UserDB at java.sql.DriverManager.getConnection(DriverManager.java:604) at java.sql.DriverManager.getConnection(DriverManager.java:221) at com.journaldev.jdbc.DBConnection.getConnection(DBConnection.java:24) at com.journaldev.jdbc.DBConnectionTest.main(DBConnectionTest.java:15)Exception in thread "main" java.lang.NullPointerException at com.journaldev.jdbc.DBConnectionTest.main(DBConnectionTest.java:16)調(diào)試此異常時(shí),只需檢查日志中打印的URL即可。比如上面日志里的URL是‘JDBC:MySQL://localhost:3306/userdb,但是應(yīng)該是JDBC:MySQL://localhost:3306/userdb。
40
JDBC的最佳實(shí)踐是什么?
JDBC的一些最佳實(shí)踐是:
數(shù)據(jù)庫資源很重,所以請確保在完成后立即關(guān)閉它。Close()方法是為連接、語句、結(jié)果集和所有其他JDBC對象定義的,用于關(guān)閉它們。始終顯式關(guān)閉代碼中的結(jié)果集、語句和連接,因?yàn)槿绻谶B接池環(huán)境中工作,連接可能會(huì)返回到池中,從而導(dǎo)致打開的結(jié)果集和語句對象導(dǎo)致資源泄漏。關(guān)閉finally塊中的資源,以確保它們即使在異常情況下也是關(guān)閉的。對類似的批處理操作使用批處理。始終在語句上使用準(zhǔn)備語句,以避免SQL注入,并獲得準(zhǔn)備語句的預(yù)編譯和緩存優(yōu)勢。如果要將批處理數(shù)據(jù)檢索到結(jié)果集中,設(shè)置fetchSize的最佳值有助于獲得良好的性能。數(shù)據(jù)庫服務(wù)器可能不支持所有隔離級別,因此請?jiān)诩僭O(shè)之前進(jìn)行檢查。更嚴(yán)格的隔離級別會(huì)導(dǎo)致性能下降,因此請確保為數(shù)據(jù)庫連接設(shè)置了最佳隔離級別。如果您想在Web應(yīng)用程序中創(chuàng)建數(shù)據(jù)庫連接,請嘗試使用JNDI上下文使用JDBC數(shù)據(jù)源資源來重用該連接。當(dāng)您需要長時(shí)間使用結(jié)果集時(shí),請嘗試使用斷開連接的行集。
1.《jdbc JDBC面試問題》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《jdbc JDBC面試問題》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請保留本站內(nèi)容來源地址,http://f99ss.com/yule/1193475.html