建立一個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());
}
}
|