1. 程式人生 > >13-撩課-Java面試寶典-第十三篇

13-撩課-Java面試寶典-第十三篇

撩課Java+系統架構點選開始學習

96.JDBC操作資料庫的步驟 ?

1、載入資料庫驅動 
 2、建立並獲取資料庫連結 
3、建立jdbc statement物件 
4、設定sql語句
5、設定sql語句中的引數(使用preparedStatement) 
6、通過statement執行sql並獲取結果 
7、對sql執行結果進行解析處理
8、釋放資源(resultSet、preparedstatement、connection)

97.JDBC中的Statement 和PreparedStatement的區別?

Java提供了
 Statement、
PreparedStatement 
CallableStatement
三種方式來執行查詢語句,
其中 Statement 用於通用查詢,
PreparedStatement 用於執行引數化查詢,
而 CallableStatement則是用於儲存過程。


關於PreparedStatement介面,
需要重點記住的是: 
1. PreparedStatement可以寫引數化查詢,
比Statement能獲得更好的效能。 

2. 對於PreparedStatement來說,
資料庫可以使用已經編譯過
及定義好的執行計劃,
這種預處理語句查詢
比普通的查詢執行速度更快。 

3. PreparedStatement可以阻止常見的
SQL注入式攻擊。 

4. PreparedStatement可以寫動態查詢語句 

5. PreparedStatement與
java.sql.Connection物件是關聯的,
一旦你關閉了connection,
PreparedStatement也沒法使用了。 

6. “?” 叫做佔位符。 

7. PreparedStatement查詢
預設返回FORWARD_ONLY的ResultSet,
你只能往一個方向移動結果集的遊標。
當然你還可以設定為其他型別的
值如:”CONCUR_READ_ONLY”。 
8. 不支援預編譯SQL查詢的JDBC驅動,
在呼叫connection.prepareStatement(sql)的時候,
它不會把SQL查詢語句傳送給資料庫做預處理,
而是等到執行查詢動作的時候
呼叫executeQuery()方法時
才把查詢語句傳送個數據庫,
這種情況和使用Statement是一樣的。
 
9. 佔位符的索引位置從1開始而不是0,
如果填入0會導致
java.sql.SQLException invalid column index異常。
所以如果PreparedStatement有兩個佔位符,
那麼第一個引數的索引時1,
第二個引數的索引是2.

98.說說資料庫連線池工作原理和實現方案?

一般來說,Java應用程式訪問資料庫的過程是:
1.裝載資料庫驅動程式;
2.通過jdbc建立資料庫連線;
3.訪問資料庫,執行sql語句;
4.斷開資料庫連線。

程式開發過程中,存在很多問題:

首先,
每一次web請求都要建立一次資料庫連線。
建立連線是一個費時的活動,
每次都得花費0.05s~1s的時間,
而且系統還要分配記憶體資源。
這個時間對於一次或幾次資料庫操作,
或許感覺不出系統有多大的開銷。

可是對於現在的web應用,
尤其是大型電子商務網站,
同時有幾百人甚至幾千人線上是很正常的事。
在這種情況下,
頻繁的進行資料庫連線操作
勢必佔用很多的系統資源,
網站的響應速度必定下降,
嚴重的甚至會造成伺服器的崩潰。
其次,對於每一次資料庫連線,
使用完後都得斷開。
否則,如果程式出現異常而未能關閉,
將會導致資料庫系統中的記憶體洩漏,
最終將不得不重啟資料庫

“資料庫連線”是一種稀缺的資源,
為了保障網站的正常使用,
應該對其進行妥善管理。
其實我們查詢完資料庫後,
如果不關閉連線,
而是暫時存放起來,
當別人使用時,
把這個連線給他們使用。
就避免了一次建立資料庫
連線和斷開的操作時間消耗。

資料庫連線池的基本思想:
就是為資料庫連線建立一個“緩衝池”。
預先在緩衝池中放入一定數量的連線,
當需要建立資料庫連線時,
只需從“緩衝池”中取出一個,
使用完畢之後再放回去。
我們可以通過設定連線池最大連線數
來防止系統無盡的與資料庫連線

99.execute,executeQuery,executeUpdate的區別是什麼?

在jdbc中有3種執行sql的語句分別是
execute,
executeQuery
executeUpdate

ResultSet  executeQuery(String sql); 
執行SQL查詢,並返回ResultSet 物件。

方法executeQuery 
用於產生單個結果集(ResultSet)的語句,
例如 SELECT 語句。
被使用最多的執行 SQL 語句的方法。
這個方法被用來執行 SELECT 語句,
它幾乎是使用最多的 SQL 語句。
但也只能執行查詢語句,
執行後返回代表查詢結果的ResultSet物件。

2.int executeUpdate(String sql); 
可執行增,刪,改,
返回執行受到影響的行數。

方法executeUpdate
用於執行 INSERT、UPDATE 或 DELETE 語句
以及 SQL DDL(資料定義語言)語句,
例如 CREATE TABLE 和 DROP TABLE。
INSERT、UPDATE 或 DELETE 語句的效果
是修改表中零行或多行中的一列或多列。
executeUpdate 的返回值是一個整數(int),
指示受影響的行數(即更新計數)。
對於 CREATE TABLE 或 DROP TABLE 等
不操作行的語句,
executeUpdate 的返回值總為零。

3.boolean  execute(String sql); 
可執行任何SQL語句,
返回一個布林值,
表示是否返回ResultSet 。

可用於執行任何SQL語句,
返回一個boolean值,
表明執行該SQL語句是否返回了ResultSet。
如果執行後第一個結果是ResultSet,
則返回true,否則返回false。
但它執行SQL語句時比較麻煩,
通常我們沒有必要使用execute方法
來執行SQL語句,
而是使用executeQuery或executeUpdate更適合,
但如果在不清楚SQL語句的型別時
則只能使用execute方法
來執行該SQL語句了。

100.Statement中的setFetchSize和setMaxRows方法有什麼用處

setMaxRows可以用來限制返回的資料集的行數。
當然通過SQL語句也可以實現這個功能。
比如在MySQL中我們可以用
LIMIT條件來設定返回結果的最大行數。

setFetchSize理解起來就有點費勁了,
因為你得知道Statement
和ResultSet是怎麼工作的。
當資料庫在執行一條查詢語句時,
查詢到的資料是在資料庫的快取中維護的。
ResultSet其實引用的是資料庫中快取的結果。

假設我們有一條查詢返回了100行資料,
我們把fetchSize設定成了10,
那麼資料庫驅動每次只會取10條資料,
也就是說得取10次。
當每條資料需要處理的時間比較長的時候
並且返回資料又非常多的時候,
這個可選的引數就變得非常有用了。

我們可以通過Statement來
設定fetchSize引數,
不過它會被ResultSet物件
設定進來的值所覆蓋掉。