更新時間:2021-02-24 17:32:02 來源:動力節(jié)點(diǎn) 瀏覽1513次
JDBC提供了諸如查詢和更新數(shù)據(jù)庫中數(shù)據(jù)的方法,本質(zhì)上是用來規(guī)范訪問數(shù)據(jù)庫的應(yīng)用程序接口。總的來說,JDBC在數(shù)據(jù)庫中有著不容忽視的地位,需要我們花費(fèi)足夠的時間去學(xué)習(xí),無論是在求職面試還是學(xué)習(xí)中都需要重視。下面為大家介紹8道經(jīng)典JDBC面試題。
1、JDBC操作數(shù)據(jù)庫的步驟 ?
1)注冊數(shù)據(jù)庫驅(qū)動。
2)建立數(shù)據(jù)庫連接。
3)創(chuàng)建一個Statement。
4)執(zhí)行SQL語句。
5)處理結(jié)果集。
6)關(guān)閉數(shù)據(jù)庫連接
2、JDBC中的Statement 和PreparedStatement,CallableStatement的區(qū)別?
區(qū)別:
1)PreparedStatement是預(yù)編譯的SQL語句,效率高于Statement。
2)PreparedStatement支持?操作符,相對于Statement更加靈活。
3)PreparedStatement可以防止SQL注入,安全性高于Statement。
4)CallableStatement適用于執(zhí)行存儲過程。
3、說說數(shù)據(jù)庫連接池工作原理。
JAVA EE服務(wù)器啟動時會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接。客戶端程序需要連接時,池驅(qū)動程序會返回一個未使用的池連接并將其表記為忙。如果當(dāng)前沒有空閑連接,池驅(qū)動程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個連接。
數(shù)據(jù)庫連接池的實(shí)現(xiàn)方案?
連接池使用集合來進(jìn)行裝載,返回的Connection是原始Connection的代理,代理Connection的close方法,當(dāng)調(diào)用close方法時,不是真正關(guān)連接,而是把它代理的Connection對象放回到連接池中,等待下一次重復(fù)利用。具體代碼:
@Override
????public Connection getConnection() throws SQLException {
????????if (list.size() > 0) {
????????????final Connection connection = list.removeFirst();
????????????//看看池的大小
????????????System.out.println(list.size());
????????????//返回一個動態(tài)代理對象
????????????return (Connection) Proxy.newProxyInstance(Demo1.class.getClassLoader(), connection.getClass().getInterfaces(), new InvocationHandler() {
????????????????@Override
????????????????public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
????????????????????//如果不是調(diào)用close方法,就按照正常的來調(diào)用
????????????????????if (!method.getName().equals("close")) {
????????????????????????method.invoke(connection, args);
????????????????????} else {
????????????????????????//進(jìn)到這里來,說明調(diào)用的是close方法
????????????????????????list.add(connection);
????????????????????????//再看看池的大小
????????????????????????System.out.println(list.size());
????????????????????}
????????????????????return null;
????????????????}
????????????});
????????}
????????return null;
}
5、寫出一段JDBC連接本機(jī)MySQL數(shù)據(jù)庫的代碼。
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost/test";
Stirng user='root';
String password='root';
Connection conn = DriverManager.getConnection(url,user,password);
6、execute,executeQuery,executeUpdate的區(qū)別是什么?
· Statement的execute(String query)方法用來執(zhí)行任意的SQL查詢,如果查詢的結(jié)果是一個ResultSet,這個方法就返回true。如果結(jié)果不是ResultSet,比如insert或者update查詢,它就會返回false。我們可以通過它的getResultSet方法來獲取ResultSet,或者通過getUpdateCount()方法來獲取更新的記錄條數(shù)。
· Statement的executeQuery(String query)接口用來執(zhí)行select查詢,并且返回ResultSet。即使查詢不到記錄返回的ResultSet也不會為null。我們通常使用executeQuery來執(zhí)行查詢語句,這樣的話如果傳進(jìn)來的是insert或者update語句的話,它會拋出錯誤信息為 “executeQuery method can not be used for update”的java.util.SQLException。
· Statement的executeUpdate(String query)方法用來執(zhí)行insert或者update/delete(DML)語句,或者 什么也不返回DDL語句。返回值是int類型,如果是DML語句的話,它就是更新的條數(shù),如果是DDL的話,就返回0。
· 只有當(dāng)你不確定是什么語句的時候才應(yīng)該使用execute()方法,否則應(yīng)該使用executeQuery或者executeUpdate方法。
7、PreparedStatement的缺點(diǎn)是什么,怎么解決這個問題?
PreparedStatement的一個缺點(diǎn)是,我們不能直接用它來執(zhí)行in條件語句;需要執(zhí)行IN條件語句的話,下面有一些解決方案:
1)分別進(jìn)行單條查詢——這樣做性能很差,不推薦。
2)使用存儲過程——這取決于數(shù)據(jù)庫的實(shí)現(xiàn),不是所有數(shù)據(jù)庫都支持。
3)動態(tài)生成PreparedStatement——這是個好辦法,但是不能享受PreparedStatement的緩存帶來的好處了。
4)在PreparedStatement查詢中使用NULL值——如果你知道輸入變量的最大個數(shù)的話,這是個不錯的辦法,擴(kuò)展一下還可以支持無限參數(shù)。
8、JDBC的ResultSet是什么?
在查詢數(shù)據(jù)庫后會返回一個ResultSet,它就像是查詢結(jié)果集的一張數(shù)據(jù)表。
ResultSet對象維護(hù)了一個游標(biāo),指向當(dāng)前的數(shù)據(jù)行。開始的時候這個游標(biāo)指向的是第一行。如果調(diào)用了ResultSet的next()方法游標(biāo)會下移一行,如果沒有更多的數(shù)據(jù)了,next()方法會返回false。可以在for循環(huán)中用它來遍歷數(shù)據(jù)集。
默認(rèn)的ResultSet是不能更新的,游標(biāo)也只能往下移。也就是說你只能從第一行到最后一行遍歷一遍。不過也可以創(chuàng)建可以回滾或者可更新的ResultSet。
當(dāng)生成ResultSet的Statement對象要關(guān)閉或者重新執(zhí)行或是獲取下一個ResultSet的時候,ResultSet對象也會自動關(guān)閉。
可以通過ResultSet的getter方法,傳入列名或者從1開始的序號來獲取列數(shù)據(jù)。
以上就是為大家介紹的8道經(jīng)典JDBC面試題,當(dāng)然,JDBC的面試題還有很多,不是僅僅靠這8道題就能完全代表的了,在本站的JDBC教程中還有更多的更加全面的JDBC面試題,有需要的小伙伴可以前去學(xué)習(xí),為自己未來的求職面試做下鋪墊。
初級 202925
初級 203221
初級 202629
初級 203743