每個系統都有機會要將資料進行儲存,方便後續的搜尋或是統計 等其它運用。目前最常用的儲存方式莫過於檔案或是資料庫(Database)。
今天我們一樣以會員註冊的畫面來示範,如何將表單上的資料可以有效又快速的儲存至資料庫。
市場上常見的資料庫有 MS SQL Server, Oracle DB, mySQL, PostrgreSQL 等等,而這次我們會使用的是H2資料庫,原因是檔案體積小,執行快而且 還非常容易整合在Spring專案裏,不用另外再安裝。
實作步驟一二三:
- 在現有專案裏導入H2 Database server
- 測試資料庫連線設定 (* 使用 H2-Console)
- 撰寫程式將資料存入資料庫 (*Repository)
第一步 : 在現有專案裏導入H2 Database Server
打開現行專案資料夾的POM檔,我們要確定有包含 H2,以及
Spring-Data-JPA-Starter的函式庫/程式。
(*如果是使用 IDEA J 的朋友們,可以在POM檔裏面 按下 COMMAND + N)
輸入關鍵字spring data 即可看到 spring-boot-starter-data-jpa
確定加入之後,在POM檔 就該會出現以下的設定
第二步 : 測試資料庫連線設定 (*使用 H2-Console)
接著就是要做資料庫來源的設定,方便程式的連結。
打開 專案資料夾/resources/application.properties
然後輸入以下的設定內容
接著打開瀏覽器,開啟 http://localhost/myh2/ (*注意 第一行有改成 port 80)
並且確認 中間連線字串 JDBC URL及帳密的設定如下圖後,按下 Connect
成功的話,就會出現如下的畫面,就完成了。 (*沒出現的話,請檢查上述步驟)
第三步 : 撰寫程式將資料存入資料庫 (*Repository Pattern)
如果需要將表單傳送給Controller的資料儲存到DB的話,我們需要準備下列幾項
I. Database Model Class(*對應資料庫欄位)
II. 資料庫連線相關的Java程式 — Repository Class
讓我們一一來說明,
所謂的Model Class,可以先想成Controller用來儲存表單的類別,而這類別的結構也就會是Spring-Data-Jpa會自動幫我們建立資料表的結構喔。以之前的會員註冊表單為例,(*在這邊,我們有重新命名 類別名稱 為 MyUser)
除了之前寫的驗證規則的標籤之外,我們還加了三個,分別是 @Entity, @Id, @ GeneratedValue 。
存檔執行後,重新載入H2 Console 小工具會發現左邊多了一項 My_USER資料表,展開後裏面還包含了各個欄位 如ID, Email 等。代表 @Entity標示的類別,spring-data-jpa會在資料庫建立對應的Table。
接著,要如何在程式裏可以新增一筆資料到DB呢?!
以老派(old-school)的寫法,通常都會要用JDBC寫法,
搭配 connection, Statement, ResultSet的方式 ~~~~ oh no!!!!!
在Spring Data的年代 ~~~ 上面的關鍵字通通都不用到
只要新建一個簡單的類別,裏面還不用寫任何的程式
最後回到Controller ~ 搭配著Autowired關鍵字,讓MyUserRepository可以被自動產生(注入)到成員變數裏。
那最後就只剩下關鍵的那一行 userRepository.save(user);
Wowla ~~~~ 一切就是那麼地簡單 !!! 那麼地方便 !!!
透過DB連線小工具,確認一下資料的確有存入,喔耶!!!!
總結
在這次的範例裏,我們有使用以下 javax.persistence 分類裏的 annotation
@Entity
@Id
@GeneratedValue
搭配著Spring Core所提供的核心標籤 @Autowired,可以讓Spring底層自動幫我們來產生MyUserRepository物件,並且依照原本宣告的類別注入。就不用再靠建構子或是setter/getter的方式來取得 MyUserRepository。
而且也可以跟老派的Connection, Statement, ResultSet 等物件 說 byebye
以上的例子希望能讓大家對Spring裏 Dependency Injection (DI)的運作及Spring Data的運用,能有多一步的了解 ~
練習
一、依上面文章內容,試著產生一個新的類別代表 Product,
欄位有 產品名稱,詳細說明,價格,種類 等四個欄位。
可以讓Controller的程式新增一個產品記錄到Database裏的新Table。