JDBC(Java DataBase Connectivity)是 Java 程式與關系型資料庫互動的統一 API。
在實際開發 Java 程式時,我們可以通過 JDBC 連接配接到資料庫,并完成各種各樣的資料庫操作,例如 CRUD 資料、執行 DDL 語句。這裡以 JDBC 程式設計中執行一條 Select 查詢語句作為例子,說明 JDBC 操作的核心步驟,具體如下:
- 注冊資料庫驅動類,指定資料庫位址,其中包括 DB 的使用者名、密碼及其他連接配接資訊;
- 調用 DriverManager.getConnection() 方法建立 Connection 連接配接到資料庫;
- 調用 Connection 的 createStatement() 或 prepareStatement() 方法,建立 Statement 對象,此時會指定 SQL(或是 SQL 語句模闆 + SQL 參數);
- 通過 Statement 對象執行 SQL 語句,得到 ResultSet 對象,也就是查詢結果集;
- 周遊 ResultSet,從結果集中讀取資料,并将每一行資料庫記錄轉換成一個 JavaBean 對象;
- 關閉 ResultSet 結果集、Statement 對象及資料庫 Connection,進而釋放這些對象占用的底層資源。
無論是執行查詢操作,還是執行其他 DML 操作,1、2、3、4、6 這些步驟都會重複出現。
為了處理上述代碼重複的問題以及後續的維護問題,我們需要選擇一款适合項目需求、符合人員能力的 ORM(Object Relational Mapping,對象-關系映射)架構來封裝 1~6 步的重複性代碼,實作對象模型、關系模型之間的轉換。這正是ORM 架構的核心功能:根據配置(配置檔案或是注解)實作對象模型、關系模型兩者之間無感覺的映射(如下圖)。
MyBatis介紹
Apache 基金會中的 iBatis 項目是 MyBatis 的前身。iBatis 項目由于各種原因,在 Apache 基金會并沒有得到很好的發展,最終于 2010 年脫離 Apache,并更名為 MyBatis。三年後,也就是 2013 年,MyBatis 将源代碼遷移到了 GitHub。
MyBatis 中一個重要的功能就是可以幫助 Java 開發封裝重複性的 JDBC 代碼,這與Spring Data JPA 、Hibernate 等 ORM 架構一樣。MyBatis 封裝重複性代碼的方式是通過 Mapper 映射配置檔案以及相關注解,将 ResultSet 結果映射為 Java 對象,在具體的映射規則中可以嵌套其他映射規則和必要的子查詢,這樣就可以輕松實作複雜映射的邏輯,當然,也能夠實作一對一、一對多、多對多關系映射以及相應的雙向關系映射。
很多人會将 Hibernate 和 MyBatis 做比較,認為 Hibernate 是全自動 ORM 架構,而 MyBatis 隻是半自動的 ORM 架構或是一個 SQL 模闆引擎。其實,這些比較都無法完全說明一個架構比另一個架構先進,關鍵還是看應用場景。
MyBatis 相較于 Hibernate 和各類 JPA 實作架構更加靈活、更加輕量級、更加可控。
- 我們可以在 MyBatis 的 Mapper 映射檔案中,直接編寫原生的 SQL 語句,應用底層資料庫産品的方言,這就給了我們直接優化 SQL 語句的機會;
- 我們還可以按照資料庫的使用規則,讓原生 SQL 語句選擇我們期望的索引,進而保證服務的性能,這就特别适合大資料量、高并發等需要将 SQL 優化到極緻的場景;
- 在編寫原生 SQL 語句時,我們也能夠更加友善地控制結果集中的列,而不是查詢所有列并映射對象後傳回,這在列比較多的時候也能起到一定的優化效果。(當然,Hibernate 也能實作這種效果,需要在實體類添加對應的構造方法。)
在實際業務中,對同一資料集的查詢條件可能是動态變化的,如果你有使用 JDBC 或其他類似架構的經曆應該能體會到,拼接 SQL 語句字元串是一件非常麻煩的事情,尤其是條件複雜的場景中,拼接過程要特别小心,要確定在合适的位置添加“where”“and”“in”等 SQL 語句的關鍵字以及空格、逗号、等号等分隔符,而且這個拼接過程非常枯燥、沒有技術含量,可能經過反複調試才能得到一個可執行的 SQL 語句。
MyBatis 提供了強大的動态 SQL 功能來幫助我們開發者擺脫這種重複勞動,我們隻需要在映射配置檔案中編寫好動态 SQL 語句,MyBatis 就可以根據執行時傳入的實際參數值拼湊出完整的、可執行的 SQL 語句。
這章隻是簡單地介紹了什麼是JDBC,MyBatis。下章會介紹Mybatis的入門示例。