新手入門 Part 1:從 database 存取開始聊

已經不記得從哪聽到,還是讀到的一段文字:

開發 JavaEE 應用程式,大概會花上 40% 左右的時間在處理資料庫存取工作

所以在我初學 Java 的時候,得先從 SQL 開始學起,然後再學習 JDBC 的使用方式。

再進階一點,要把 JavaEE Design Pattern 的 DAO(Data Access Object)、TO/VO(Transfer Object/Value Object)學起來,這是 O-R Mapping(Object-Relation Mapping,物件與關連式資料庫的對照,這個概念主要就是在灌輸操作資料庫物件,就等同於在操作 SQL 語法) 的起源;但哪怕是用了 JavaEE Design Pattern,你還是得花非常多的時間在處理資料庫的部分,尤其是 debug O-R Mapping 之間的問題。

後來 JavaEE 平台就鼓吹使用 Enterprise JavaBean 當中的 Entity Bean,那時候各大原廠無不卯足了勁提供各式各樣的工具,期望大家都轉去使用 Entity Bean 來處理資料庫這段;無奈 Enterprise JavaBean 的學習門檻太高、環境設置太複雜也太昂貴,所以始終應用不是太廣泛。

後來 Redhat 的 JBoss 專案底下出了一個很有名的子專案叫做:Hibernate。

這個 Open Source 子專案,可以在不需要 EJB container 的環境下完成 O-R Mapping,並且配合著周邊的一些工具,讓 O-R Mapping 可以迅速的完成,一時之間成為顯學,大為風行。而這個顯學最後被 JavaEE 拿去當標準,所以 Java Persistence API(JPA)就這樣誕生了,然後 Hibernate 變成 JPA 標準的其中一個實作方式。

然而講到這裡,運用 JPA + Hibernate 還是僅能滿足基本的 O-R Mapping 操作,如果你想要完成「多欄位條件查詢」、「join table 查詢」等比較複雜一點的操作,你還是得要理解 SQL 的運作方式,然後再去採用相對應的 JPA/Hibernate 物件來組合出資料庫查詢的程式碼(比方說 Criteria 物件、JPQL 等等)、搭配 DAO Design Pattern,我常常寫到最後都有一種畫蛇添足的感覺,我何不一開始就寫 SQL 就好了?非得要去寫「物件查詢語法」然後再讓 framework 去幫我轉成 native SQL 來處理?

後來 Spring framework 推出了 Spring-JPA 的模組來解決這個麻煩,我個人覺得在使用上就解決了一大半原有使用 Criteria 物件或是 JPQL 的處理時間;所以在這個聊資料庫存取的系列裡面,我會以 JPA -> Spring JPA -> Hibernate 這樣的架構來介紹我個人習慣的做法,一方面將我自己的經驗做個筆記,也希望能對目前 JavaEE 的初學者有幫助。

markkwsu

markkwsu

1 comment