使用Spring-data-jpa(2)(三十一)

建立實體

建立一個User實體,包含id(主鍵)、name(姓名)、age(年齡)屬性,經過ORM框架其會被映射到數據庫表中,因爲配置了hibernate.hbm2ddl.auto,在應用啓動的時候框架會自動去數據庫中建立對應的表。java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Entity
public  class  User {
 
     @Id
     @GeneratedValue
     private  Long id;
 
     @Column (nullable =  false )
     private  String name;
 
     @Column (nullable =  false )
     private  Integer age;
 
     // 省略構造函數
 
     // 省略getter和setter
 
}

建立數據訪問接口

下面針對User實體建立對應的Repository接口實現對該實體的數據訪問,以下代碼:spring

1
2
3
4
5
6
7
8
9
10
public  interface  UserRepository  extends  JpaRepository<User, Long> {
 
     User findByName(String name);
 
     User findByNameAndAge(String name, Integer age);
 
     @Query ( "from User u where u.name=:name" )
     User findUser( @Param ( "name" ) String name);
 
}

在Spring-data-jpa中,只須要編寫相似上面這樣的接口就可實現數據訪問。再也不像咱們以往編寫了接口時候還須要本身編寫接口實現類,直接減小了咱們的文件清單。數據庫

下面對上面的UserRepository作一些解釋,該接口繼承自JpaRepository,經過查看JpaRepository接口的API文檔,能夠看到該接口自己已經實現了建立(save)、更新(save)、刪除(delete)、查詢(findAll、findOne)等基本操做的函數,所以對於這些基礎操做的數據訪問就不須要開發者再本身定義。api

 

在咱們實際開發中,JpaRepository接口定義的接口每每還不夠或者性能不夠優化,咱們須要進一步實現更復雜一些的查詢或操做。因爲本文重點在spring boot中整合spring-data-jpa,在這裏先拋磚引玉簡單介紹一下spring-data-jpa中讓咱們興奮的功能,後續再單獨開篇講一下spring-data-jpa中的常見使用。框架

在上例中,咱們能夠看到下面兩個函數:函數

  • User findByName(String name)
  • User findByNameAndAge(String name, Integer age)

它們分別實現了按name查詢User實體和按name和age查詢User實體,能夠看到咱們這裏沒有任何類SQL語句就完成了兩個條件查詢方法。這就是Spring-data-jpa的一大特性:經過解析方法名建立查詢性能

除了經過解析方法名來建立查詢外,它也提供經過使用@Query 註解來建立查詢,您只須要編寫JPQL語句,並經過相似「:name」來映射@Param指定的參數,就像例子中的第三個findUser函數同樣。單元測試

 

Spring-data-jpa的能力遠不止本文提到的這些,因爲本文主要以整合介紹爲主,對於Spring-data-jpa的使用只是介紹了常見的使用方式。諸如@Modifying操做、分頁排序、原生SQL支持以及與Spring MVC的結合使用等等內容就不在本文中詳細展開,這裏先挖個坑,後續再補文章填坑,如您對這些感興趣能夠關注我博客或簡書,一樣歡迎你們留言交流想法。測試

單元測試

在完成了上面的數據訪問接口以後,按照慣例就是編寫對應的單元測試來驗證編寫的內容是否正確。這裏就很少作介紹,主要經過數據操做和查詢來反覆驗證操做的正確性。優化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@RunWith (SpringJUnit4ClassRunner. class )
@SpringApplicationConfiguration (Application. class )
public  class  ApplicationTests {
 
     @Autowired
     private  UserRepository userRepository;
 
     @Test
     public  void  test()  throws  Exception {
 
         // 建立10條記錄
         userRepository.save( new  User( "AAA" 10 ));
         userRepository.save( new  User( "BBB" 20 ));
         userRepository.save( new  User( "CCC" 30 ));
         userRepository.save( new  User( "DDD" 40 ));
         userRepository.save( new  User( "EEE" 50 ));
         userRepository.save( new  User( "FFF" 60 ));
         userRepository.save( new  User( "GGG" 70 ));
         userRepository.save( new  User( "HHH" 80 ));
         userRepository.save( new  User( "III" 90 ));
         userRepository.save( new  User( "JJJ" 100 ));
 
         // 測試findAll, 查詢全部記錄
         Assert.assertEquals( 10 , userRepository.findAll().size());
 
         // 測試findByName, 查詢姓名爲FFF的User
         Assert.assertEquals( 60 , userRepository.findByName( "FFF" ).getAge().longValue());
 
         // 測試findUser, 查詢姓名爲FFF的User
         Assert.assertEquals( 60 , userRepository.findUser( "FFF" ).getAge().longValue());
 
         // 測試findByNameAndAge, 查詢姓名爲FFF而且年齡爲60的User
         Assert.assertEquals( "FFF" , userRepository.findByNameAndAge( "FFF" 60 ).getName());
 
         // 測試刪除姓名爲AAA的User
         userRepository.delete(userRepository.findByName( "AAA" ));
 
         // 測試findAll, 查詢全部記錄, 驗證上面的刪除是否成功
         Assert.assertEquals( 9 , userRepository.findAll().size());
 
     }
 
 
}
相關文章
相關標籤/搜索