天天看點

Java面試知識點總結⑤——資料庫

大綱

  • [x] 一、Java基礎(語言、集合架構、OOP、設計模式等)
  • [x] 二、Java進階(JavaEE、架構、伺服器、工具等)
  • [x] 三、多線程和并發
  • [x] 四、Java虛拟機
  • [x] 五、資料庫(Sql、MySQL、Redis等)
  • [x] 六、算法與資料結構
  • [x] 七、計算機網絡
  • [x] 八、作業系統(OS基礎、Linux等)
  • [x] 九、其他

五、資料庫(Sql、MySQL、Redis等)

1. Statement

1.1 基本内容

  • Statement是最基本的用法, 不傳參, 采用字元串拼接,存在注入漏洞
  • PreparedStatement傳入參數化的sql語句, 同時檢查合法性, 效率高可以重用, 防止sql注入
  • CallableStatement接口擴充PreparedStatement,用來調用存儲過程
  • BatchedStatement用于批量操作資料庫,BatchedStatement不是标準的Statement類
public interface CallableStatement extends PreparedStatement 
public interface PreparedStatement extends Statement 
           

1.2 Statement與PrepareStatement的差別

  • 建立時的差別
Statement statement = conn.createStatement();
PreparedStatement preStatement = conn.prepareStatement(sql);
           
  • 執行的時候
ResultSet rSet = statement.executeQuery(sql);
ResultSet pSet = preStatement.executeQuery();
           

由上可以看出,PreparedStatement有預編譯的過程,已經綁定sql,之後無論執行多少遍,都不會再去進行編譯,而 statement 不同,如果執行多遍,則相應的就要編譯多少遍sql,是以從這點看,preStatement 的效率會比 Statement要高一些

  • 安全性

PreparedStatement是預編譯的,是以可以有效的防止SQL注入等問題

  • 代碼的可讀性和可維護性

PreparedStatement更勝一籌

2. 遊标

3. 列出 5 個應該遵循的 JDBC 最佳實踐

有很多的最佳實踐,你可以根據你的喜好來例舉。下面是一些更通用的原則:

a)使用批量的操作來插入和更新資料

b)使用 PreparedStatement 來避免 SQL 異常,并提高性能

c)使用資料庫連接配接池

d)通過列名來擷取結果集,不要使用列的下标來擷取

4. 資料庫索引的實作

資料庫系統還維護着滿足特定查找算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實作進階查找算法。這種資料結構,就是索引。

B樹:

一棵m階B樹(balanced tree of order m)是一棵平衡的m路搜尋樹。它或者是空樹,或者是滿足下列性質的樹:

1、根結點至少有兩個子女;2、每個非根節點所包含的關鍵字個數 j 滿足:┌m/2┐ - 1 <= j <= m - 1;3、除根結點以外的所有結點(不包括葉子結點)的度數正好是關鍵字總數加1,故内部子樹個數 k 滿足:┌m/2┐ <= k <= m ;4、所有的葉子結點都位于同一層。

由于B-Tree的特性,在B-Tree中按key檢索資料的算法非常直覺:首先從根節點進行二分查找,如果找到則傳回對應節點的data,否則對相應區間的指針指向的節點遞歸進行查找,直到找到節點或找到null指針,前者查找成功,後者查找失敗。

一個度為d的B-Tree,設其索引N個key,則其樹高h的上限為logd((N 1)/2),檢索一個key,其查找節點個數的漸進複雜度為O(logdN)。從這點可以看出,B-Tree是一個非常有效率的索引資料結構。

B 樹:

B-Tree有許多變種,其中最常見的是B Tree,例如MySQL就普遍使用B Tree實作其索引結構。

B 樹是B樹的變形,它把所有的data都放在葉子結點中,隻将關鍵字和子女指針儲存于内結點,内結點完全是索引的功能。

與B-Tree相比,B Tree有以下不同點:

1、每個節點的指針上限為2d而不是2d 1。

2、内節點不存儲data,隻存儲key;葉子節點存儲data不存儲指針。

一般在資料庫系統或檔案系統中使用的B Tree結構都在經典B Tree的基礎上進行了優化,增加了順序通路指針。

在B Tree的每個葉子節點增加一個指向相鄰葉子節點的指針

例如圖4中如果要查詢key為從18到49的所有資料記錄,當找到18後,隻需順着節點和指針順序周遊就可以一次性通路到所有資料節點,極大提到了區間查詢效率。

為什麼B樹(B 樹)?

一般來說,索引本身也很大,不可能全部存儲在記憶體中,是以索引往往以索引檔案的形式存儲的磁盤上。這樣的話,索引查找過程中就要産生磁盤I/O消耗,相對于記憶體存取,I/O存取的消耗要高幾個數量級,是以評價一個資料結構作為索引的優劣最重要的名額就是在查找過程中磁盤I/O操作次數的漸進複雜度。換句話說,索引的結構組織要盡量減少查找過程中磁盤I/O的存取次數。

這涉及到磁盤存取原理、局部性原理和磁盤預讀。

先從B-Tree分析,根據B-Tree的定義,可知檢索一次最多需要通路h個節點。資料庫系統的設計者巧妙利用了磁盤預讀原理,将一個節點的大小設為等于一個頁,這樣每個節點隻需要一次I/O就可以完全載入。

為了達到這個目的,在實際實作B-Tree還需要使用如下技巧:

每次建立節點時,直接申請一個頁的空間,這樣就保證一個節點實體上也存儲在一個頁裡,加之計算機存儲配置設定都是按頁對齊的,就實作了一個node隻需一次I/O。

B-Tree中一次檢索最多需要h-1次I/O(根節點常駐記憶體),漸進複雜度為O(h)=O(logdN)。一般實際應用中,出度d是非常大的數字,通常超過100,是以h非常小(通常不超過3)。

綜上所述,用B-Tree作為索引結構效率是非常高的。

而紅黑樹這種結構,h明顯要深的多。由于邏輯上很近的節點(父子)實體上可能很遠,無法利用局部性,是以紅黑樹的I/O漸進複雜度也為O(h),效率明顯比B-Tree差很多。

至于B Tree為什麼更适合外存索引,原因和内節點出度d有關。

由于B Tree内節點去掉了data域,是以可以擁有更大的出度,擁有更好的性能。

【感謝您能看完,如果能夠幫到您,麻煩點個贊~】

更多經驗技術歡迎前來共同學習交流:一點課堂-為夢想而奮鬥的線上學習平台 http://www.yidiankt.com/

![關注公衆号,回複“1”免費領取-【java核心知識點】]

Java面試知識點總結⑤——資料庫

QQ讨論群:616683098

QQ:3184402434

想要深入學習的同學們可以加我QQ一起學習讨論~還有全套資源分享,經驗探讨,等你哦!

Java面試知識點總結⑤——資料庫