国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - Spring Boot中使用Spring-data-jpa實現數據庫增刪查改

Spring Boot中使用Spring-data-jpa實現數據庫增刪查改

2020-08-21 11:42ilinux_one Java教程

本篇文章主要介紹了Spring Boot中使用Spring-data-jpa實現增刪查改,非常具有實用價值,需要的朋友可以參考下。

在實際開發過程中,對數據庫的操作無非就“增刪改查”。就最為普遍的單表操作而言,除了表和字段不同外,語句都是類似的,開發人員需要寫大量類似而枯燥的語句來完成業務邏輯。

為了解決這些大量枯燥的數據操作語句,我們第一個想到的是使用ORM框架,比如:Hibernate。通過整合Hibernate之后,我們以操作Java實體的方式最終將數據改變映射到數據庫表中。

為了解決抽象各個Java實體基本的“增刪改查”操作,我們通常會以泛型的方式封裝一個模板Dao來進行抽象簡化,但是這樣依然不是很方便,我們需要針對每個實體編寫一個繼承自泛型模板Dao的接口,再編寫該接口的實現。雖然一些基礎的數據訪問已經可以得到很好的復用,但是在代碼結構上針對每個實體都會有一堆Dao的接口和實現。

由于模板Dao的實現,使得這些具體實體的Dao層已經變的非常“薄”,有一些具體實體的Dao實現可能完全就是對模板Dao的簡單代理,并且往往這樣的實現類可能會出現在很多實體上。Spring-data-jpa的出現正可以讓這樣一個已經很“薄”的數據訪問層變成只是一層接口的編寫方式。比如,下面的例子:

?
1
2
3
4
5
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
@Query("from User u where u.name=:name")
User findUser(@Param("name") String name);
}

我們只需要通過編寫一個繼承自JpaRepository的接口就能完成數據訪問,下面以一個具體實例來體驗Spring-data-jpa給我們帶來的強大功能。

使用示例

由于Spring-data-jpa依賴于Hibernate。如果您對Hibernate有一定了解,下面內容可以毫不費力的看懂并上手使用Spring-data-jpa。如果您還是Hibernate新手,您可以先按如下方式入門,再建議回頭學習一下Hibernate以幫助這部分的理解和進一步使用。

工程配置

在pom.xml中添加相關依賴,加入以下內容:

?
1
2
3
4
<dependency
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

在application.xml中配置:數據庫連接信息(如使用嵌入式數據庫則不需要)、自動創建表結構的設置,例如使用mysql的情況如下:

?
1
2
3
4
5
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置屬性,其主要作用是:自動創建、更新、驗證數據庫表結構。該參數的幾種配置如下:

create:每次加載hibernate時都會刪除上一次的生成的表,然后根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致數據庫表數據丟失的一個重要原因。

create-drop:每次加載hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。

update:最常用的屬性,第一次加載hibernate時根據model類會自動建立起表的結構(前提是先建立好數據庫),以后加載

hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到服務器后,表結構是不會被馬上建立起來的,是要等應用第一次運行起來后才會。

validate:每次加載hibernate時,驗證創建數據庫表結構,只會和數據庫中的表進行比較,不會創建新表,但是會插入新值。
至此已經完成基礎配置,如果您有在Spring下整合使用過它的話,相信你已經感受到Spring Boot的便利之處:JPA的傳統配置在persistence.xml文件中,但是這里我們不需要。當然,最好在構建項目時候按照之前提過的最佳實踐的工程結構來組織,這樣以確保各種配置都能被框架掃描到。

創建實體

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

?
1
2
3
4
5
6
7
8
9
10
11
12
@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接口實現對該實體的數據訪問,如下代碼:

?
1
2
3
4
5
6
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)等基本操作的函數,因此對于這些基礎操作的數據訪問就不需要開發者再自己定義。

在我們實際開發中,JpaRepository接口定義的接口往往還不夠或者性能不夠優化,我們需要進一步實現更復雜一些的查詢或操作。由于本文重點在spring boot中整合spring-data-jpa,在這里先拋磚引玉簡單介紹一下spring-data-jpa中讓我們興奮的功能,后續再單獨開篇講一下spring-data-jpa中的常見使用。

在上例中,我們可以看到下面兩個函數:

?
1
2
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
@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());
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/ilinuxer/p/6481590.html

延伸 · 閱讀

精彩推薦
703
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 婷婷天堂| 国产伦精品一区二区三区精品视频 | 日韩精品一区二区三区av | 黄色免费看 | 懂色一区| 久久一日本道色综合久久 | 免费观看www7722午夜电影 | 成人激情免费 | 亚洲欧美在线一区 | 成人一区二区在线 | 日韩和的一区二在线 | 欧美日韩不卡合集视频 | 欧美一区二区在线观看 | 亚洲精品综合中文字幕 | 羞羞的视频在线 | 欧美精品v国产精品v日韩精品 | 一区二区三区免费看 | 国产免费自拍 | 久久一区 | 午夜羞羞视频 | 91久久久久久久久久久久久久久久 | 国产精品1区2区3区 久久免费一区 | 91久久精品一区二区二区 | 国产精品三级视频 | 日产欧产va高清 | 久久久久99精品国产片 | 亚洲国产精品久久 | 欧美高清一区 | 91天堂网| 国产日韩精品一区二区 | 伊人二区| 欧美国产日韩一区 | 久久久成人精品 | 国产亚洲欧美另类一区二区三区 | 精品福利一区二区三区 | 国产黄色成人 | 午夜黄色影院 | 精品亚洲永久免费精品 | 91久久精品一区 | 成人亚洲精品777777大片 | 日本高清不卡视频 |