新手入門 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 的初學者有幫助。

Mark Su

熱愛籃球、程式設計與美食。

Add comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Follow me

Don't be shy, get in touch. I love meeting interesting people and making new friends.