帶着新人學springboot的應用08(springboot+jpa的整合)

  這一節的內容比較簡單,是springboot和jpa的簡單整合,jpa默認使用hibernate,因此本質就是springboot和hibernate的整合。java

  說實話,聽別人都說spring data jpa很簡化操做,不用寫多少代碼,今天咱們就來看看。mysql

  順便一提的是,傳統大公司用hibernate比較多,互聯網公司用mybatis比較多。web

 

1.大概說一下jpa的好處(熟悉的話能夠跳過)spring

  前面說過springboot和mybatis的整合,用mybatis的最大優勢就是能夠看得見sql語句,咱們想改就改,想怎麼優化就怎麼優化。sql

  可是用過hibernate的小夥伴應該知道,hibernate幾乎是看不見sql語句的,由於hibernate底層自動生成,可是前提是你要配置好數據庫表和一個javabean的映射關係,也比較麻煩,因此就有了jpa,jpa是一個規範,不是框架(這麼說很抽象,你能夠把jpa當成一個接口,而hibernate是其中的一個實現類),那麼咱們使用jpa,那麼間接的就使用了hibernate。數據庫

  那爲何這麼麻煩呢?直接使用hibernate不就行了嗎?瀏覽器

  舉個很簡單的例子,接口Animal,兩個實現類Dog、Cat;假若有個項目咱們要使用Dog裏的crud方法,直接Animal animal = new Dog();而後animal.xx();springboot

  過了一段時間咱們又有一個項目要使用Cat裏面的crud方法,仍是Animal animal = new Cat();而後animal.xxx();mybatis

  有沒有以爲,代碼幾乎同樣,咱們只須要搞清楚Animal中的方法,就能使用兩個類,學習的成本下降了差很少一半,真正的事半功倍。框架

  jpa的實現常見的hibernate,OpenJPA,TopLink,EclipseJPA這幾種,雖然我只用過hibernate,可是,你學會了jpa以後,另外幾種你也就會了,由於方法和操做hibernate同樣。

  還有就是,開發jpa和開發hibernate的竟然是同一個做者...emmmm...

  再說一下hibernate和spring整合的時候,應該發現了Dao層仍是要寫賊多的東西,各類crud方法要慢慢實現;即便用jpa以後,spring整合jpa(實現產品爲hibernate),仍是擺脫不了要實現crud方法,雖然代碼少寫了一點,可是治標不治本;

  可是就當jpa和Spring Data整合以後,你幾乎看不到代碼了!就一個接口放在那裏,即便你有特殊的需求,你只要寫個方法,方法名符合必定的規範,就ok了,你都不用實現(固然,實際的項目中不下心可能就碰到了特別複雜的需求,那麼仍是老老實實的寫sql吧!)。

  spring data是spring的一個子項目,專門針對持久化層的,咱們用過的spring data radis,spring data rabbitmq都是這個項目的模塊之一。

 

2.簡單的搭建一下環境 

  首先,建立springboot項目,要導入的模塊web+mysql+jpa+1.5.18

  話說之前我這版本應該是1.5.16啊,怎麼偷偷的趁我不注意自動給我升級到1.5.18了......

 

  而後配置文件配置數據源(就用默認的數據源) 

 

  配置一個javabean去對應和一張表對應

 

   來看看如今的dao層是什麼鬼。

  看清楚,這是一個接口,並且不用標示註解!

 

  爲了方便,就不寫service層了,直接controller層

 

  而後運行springboot項目,就會在數據庫建立user表

  

  我手動往表裏添加幾條數據

 

  打開瀏覽器,輸入url:http://localhost:8080/hello/2,能夠看到結果和控制檯的sql語句

 

  這是最簡單的使用了,其實這裏關鍵是userDao到底能夠用哪些方法,截了一下圖,大概能夠看到基本的crud方法應該是都實現了,你只須要傳入相關的參數便可。

  話說每次都說crud,可是具體是哪幾個單詞知道嗎?C(create),R(Read),U(update),D(delete),看到名字應該知道意思吧!

  在springdata jpa中,增長和修改方法都是save()

 

   刪除,delete()

 

   查詢,方法就多了,但都是相似findxxx(),具體的本身去嘗試

 

   

3.貌似比較高級的操做

   所謂高級的操做,無外乎就是自定義嘛!

  由於有的高手就以爲我爲何用你這個方法啊,我能不能自定義啊?好比我要..emmm...按照名字來查找記錄,ok,jpa也提供給你,可是你要想好一個很特別很特殊的方法名,這個方法名不僅僅你認識,並且還要程序認識。(瑪德,想個方法名都這麼多要求,日了狗哦!)

  那麼咱們在dao層自定義一個方法試試(看清楚方法名!) 

  

  controller層我試試這個方法

 

  看看瀏覽器能不能訪問,能訪問,ok

 

  因此如今咱們要知道的就是自定義的方法名,要符合什麼規範?弄清楚這個了,那自定義方法也就ok了。

  其實規則就跟原生的sql語句差很少,就是提取了關鍵字而已,好比我要根據name模糊查找,sql語句就是xxx where name like ‘王%’,關鍵字就是like;因而咱們方法名就是findByNameLike(String name),括號裏就是咱們要傳進去的條件,至關於‘王%’。

  我猜底層應該會解析方法名,拼接成sql語句,向數據庫發送sql語句進行操做,本質上,一個方法就是一條sql語句。

  還有一些關鍵詞,And,Or,Between,OrderBy等等,均可以用於方法名。

  我隨便列舉一下幾個方法名參考一下:

findByUserName(String userName);

findByUserNameOrEmail(String username, String email);

countByUserName(String userName);

findByEmailLike(String email);

List<User> findByUserNameOrderByEmailDesc(String email);

  看名字應該知道是幹什麼的了,好好體會一下!sql語句用的熟練了,這個應該不難。

 

4.一點小操做

  有的時候理想很豐滿,現實卻很骨感!你一不當心碰到了一個很是複雜的需求,然而用上面這些規則卻老是一副日了狗的表情,你就很懷念用sql語句了!瑪德,要是我能用sql語句的話,我不要一分鐘就能作好了,如今讓我編這個方法名就是特麼編不出來啊!

    ok,springboot data jpa也考慮到了你這種需求,因而咱們便能像用mybatis的註解版同樣使用jpa了。

  請看下面dao層的方法,是否是和mybatis註解版十分類似啊?不過要注意,這裏註解裏面的語句沒記錯的話應該是hql語句吧,操做的是實體類!

  固然若是你要寫原生sql語句,在@Query裏面就要加個屬性:nativeQuery=true,就能夠寫原生sql語句了,很簡單,這裏很少說。

  能夠取別名,能夠有佔位符,佔位符能夠直接是?;不過別人都是?1:表明第一個佔位符;若是還有?2:第二個佔位符;  還有?3:第三個佔位符。。。佔位符和參數一一對應,固然還能夠用@Param(「xxx」)和形參進行參數綁定,這時hql語句佔位符也會發生變化。

  咱們就不搞這些花裏胡哨的了,怎麼簡單怎麼來:

 

  查詢只要@Query一個註解就能夠了,可是增長,修改,刪除還須要另一個註解@Modifying,再看一個方法。

 

  要加那個事務的註解,假如不加,會報錯,下圖所示,emmm....建議增上改方法除了@Query以外,都加上那這兩個註解

 

  而後我運行應用,測試了,成功,大家能夠本身試試!

  其實後面還有分頁,多表查詢,有點小麻煩因此我就很不要臉的跳過了,嘿嘿嘿!不過仍是大概說一下:

  分頁就是本身定義一下規則,一頁多少數據,多少頁,包裝成一個對象,放到findAll方法裏就能夠了;而多表查詢,前提是兩個類創建好關係(就是一對多,多對一什麼的),而後重點就是編寫@Query裏面的hql語句了;

  這裏我就是給新手小哥們看一看基本操做,想要深刻了解的小夥伴能夠本身查查資料看看分頁和多表級聯操做。

  其實原本是不想寫這個springboot data jpa的,由於用的比較少,還不如springboot+mybatis好玩,不過啊,由於我後面我要說springboot和一個東西的整合,太像springboot jpa了,因而我也順便說說jpa得了。

相關文章
相關標籤/搜索