13-撩課-Java面試寶典-第十三篇
阿新 • • 發佈:2018-12-05
撩課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物件
設定進來的值所覆蓋掉。