真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot中使用Spring-data-jpa實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪查改

在實(shí)際開發(fā)過程中,對(duì)數(shù)據(jù)庫(kù)的操作無(wú)非就“增刪改查”。就最為普遍的單表操作而言,除了表和字段不同外,語(yǔ)句都是類似的,開發(fā)人員需要寫大量類似而枯燥的語(yǔ)句來(lái)完成業(yè)務(wù)邏輯。

成都創(chuàng)新互聯(lián)主打移動(dòng)網(wǎng)站、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、申請(qǐng)域名、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實(shí)力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再?zèng)Q定采用什么樣的設(shè)計(jì)。最后,要實(shí)現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計(jì),我們還會(huì)規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。

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

為了解決抽象各個(gè)Java實(shí)體基本的“增刪改查”操作,我們通常會(huì)以泛型的方式封裝一個(gè)模板Dao來(lái)進(jìn)行抽象簡(jiǎn)化,但是這樣依然不是很方便,我們需要針對(duì)每個(gè)實(shí)體編寫一個(gè)繼承自泛型模板Dao的接口,再編寫該接口的實(shí)現(xiàn)。雖然一些基礎(chǔ)的數(shù)據(jù)訪問已經(jīng)可以得到很好的復(fù)用,但是在代碼結(jié)構(gòu)上針對(duì)每個(gè)實(shí)體都會(huì)有一堆Dao的接口和實(shí)現(xiàn)。

由于模板Dao的實(shí)現(xiàn),使得這些具體實(shí)體的Dao層已經(jīng)變的非?!氨 保幸恍┚唧w實(shí)體的Dao實(shí)現(xiàn)可能完全就是對(duì)模板Dao的簡(jiǎn)單代理,并且往往這樣的實(shí)現(xiàn)類可能會(huì)出現(xiàn)在很多實(shí)體上。Spring-data-jpa的出現(xiàn)正可以讓這樣一個(gè)已經(jīng)很“薄”的數(shù)據(jù)訪問層變成只是一層接口的編寫方式。比如,下面的例子:

public interface UserRepository extends JpaRepository {
User findByName(String name);
@Query("from User u where u.name=:name")
User findUser(@Param("name") String name);
}

我們只需要通過編寫一個(gè)繼承自JpaRepository的接口就能完成數(shù)據(jù)訪問,下面以一個(gè)具體實(shí)例來(lái)體驗(yàn)Spring-data-jpa給我們帶來(lái)的強(qiáng)大功能。

使用示例

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

工程配置

在pom.xml中添加相關(guān)依賴,加入以下內(nèi)容:

org.springframework.boot
spring-boot-starter-data-jpa

在application.xml中配置:數(shù)據(jù)庫(kù)連接信息(如使用嵌入式數(shù)據(jù)庫(kù)則不需要)、自動(dòng)創(chuàng)建表結(jié)構(gòu)的設(shè)置,例如使用MySQL的情況如下:

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的配置屬性,其主要作用是:自動(dòng)創(chuàng)建、更新、驗(yàn)證數(shù)據(jù)庫(kù)表結(jié)構(gòu)。該參數(shù)的幾種配置如下:

create:每次加載hibernate時(shí)都會(huì)刪除上一次的生成的表,然后根據(jù)你的model類再重新來(lái)生成新表,哪怕兩次沒有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫(kù)表數(shù)據(jù)丟失的一個(gè)重要原因。

create-drop:每次加載hibernate時(shí)根據(jù)model類生成表,但是sessionFactory一關(guān)閉,表就自動(dòng)刪除。

update:最常用的屬性,第一次加載hibernate時(shí)根據(jù)model類會(huì)自動(dòng)建立起表的結(jié)構(gòu)(前提是先建立好數(shù)據(jù)庫(kù)),以后加載

hibernate時(shí)根據(jù)model類自動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會(huì)被馬上建立起來(lái)的,是要等應(yīng)用第一次運(yùn)行起來(lái)后才會(huì)。

validate:每次加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。
至此已經(jīng)完成基礎(chǔ)配置,如果您有在Spring下整合使用過它的話,相信你已經(jīng)感受到Spring Boot的便利之處:JPA的傳統(tǒng)配置在persistence.xml文件中,但是這里我們不需要。當(dāng)然,最好在構(gòu)建項(xiàng)目時(shí)候按照之前提過的最佳實(shí)踐的工程結(jié)構(gòu)來(lái)組織,這樣以確保各種配置都能被框架掃描到。

創(chuàng)建實(shí)體

創(chuàng)建一個(gè)User實(shí)體,包含id(主鍵)、name(姓名)、age(年齡)屬性,通過ORM框架其會(huì)被映射到數(shù)據(jù)庫(kù)表中,由于配置了hibernate.hbm2ddl.auto,在應(yīng)用啟動(dòng)的時(shí)候框架會(huì)自動(dòng)去數(shù)據(jù)庫(kù)中創(chuàng)建對(duì)應(yīng)的表。

@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer age;
// 省略構(gòu)造函數(shù)
// 省略getter和setter
}

創(chuàng)建數(shù)據(jù)訪問接口

下面針對(duì)User實(shí)體創(chuàng)建對(duì)應(yīng)的Repository接口實(shí)現(xiàn)對(duì)該實(shí)體的數(shù)據(jù)訪問,如下代碼:

 public interface UserRepository extends JpaRepository {
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中,只需要編寫類似上面這樣的接口就可實(shí)現(xiàn)數(shù)據(jù)訪問。不再像我們以往編寫了接口時(shí)候還需要自己編寫接口實(shí)現(xiàn)類,直接減少了我們的文件清單。

下面對(duì)上面的UserRepository做一些解釋,該接口繼承自JpaRepository,通過查看JpaRepository接口的API文檔,可以看到該接口本身已經(jīng)實(shí)現(xiàn)了創(chuàng)建(save)、更新(save)、刪除(delete)、查詢(findAll、findOne)等基本操作的函數(shù),因此對(duì)于這些基礎(chǔ)操作的數(shù)據(jù)訪問就不需要開發(fā)者再自己定義。

在我們實(shí)際開發(fā)中,JpaRepository接口定義的接口往往還不夠或者性能不夠優(yōu)化,我們需要進(jìn)一步實(shí)現(xiàn)更復(fù)雜一些的查詢或操作。由于本文重點(diǎn)在spring boot中整合spring-data-jpa,在這里先拋磚引玉簡(jiǎn)單介紹一下spring-data-jpa中讓我們興奮的功能,后續(xù)再單獨(dú)開篇講一下spring-data-jpa中的常見使用。

在上例中,我們可以看到下面兩個(gè)函數(shù):

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

它們分別實(shí)現(xiàn)了按name查詢User實(shí)體和按name和age查詢User實(shí)體,可以看到我們這里沒有任何類SQL語(yǔ)句就完成了兩個(gè)條件查詢方法。這就是Spring-data-jpa的一大特性:通過解析方法名創(chuàng)建查詢。

除了通過解析方法名來(lái)創(chuàng)建查詢外,它也提供通過使用@Query 注解來(lái)創(chuàng)建查詢,您只需要編寫JPQL語(yǔ)句,并通過類似“:name”來(lái)映射@Param指定的參數(shù),就像例子中的第三個(gè)findUser函數(shù)一樣。

Spring-data-jpa的能力遠(yuǎn)不止本文提到的這些,由于本文主要以整合介紹為主,對(duì)于Spring-data-jpa的使用只是介紹了常見的使用方式。諸如@Modifying操作、分頁(yè)排序、原生SQL支持以及與Spring MVC的結(jié)合使用等等內(nèi)容就不在本文中詳細(xì)展開,這里先挖個(gè)坑,后續(xù)再補(bǔ)文章填坑,如您對(duì)這些感興趣可以關(guān)注我博客或簡(jiǎn)書,同樣歡迎大家留言交流想法。

單元測(cè)試

在完成了上面的數(shù)據(jù)訪問接口之后,按照慣例就是編寫對(duì)應(yīng)的單元測(cè)試來(lái)驗(yàn)證編寫的內(nèi)容是否正確。這里就不多做介紹,主要通過數(shù)據(jù)操作和查詢來(lái)反復(fù)驗(yàn)證操作的正確性。 

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {
@Autowired
private UserRepository userRepository;
@Test
public void test() throws Exception {
// 創(chuàng)建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));
// 測(cè)試findAll, 查詢所有記錄
Assert.assertEquals(10, userRepository.findAll().size());
// 測(cè)試findByName, 查詢姓名為FFF的User
Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue());
// 測(cè)試findUser, 查詢姓名為FFF的User
Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue());
// 測(cè)試findByNameAndAge, 查詢姓名為FFF并且年齡為60的User
Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName());
// 測(cè)試刪除姓名為AAA的User
userRepository.delete(userRepository.findByName("AAA"));
// 測(cè)試findAll, 查詢所有記錄, 驗(yàn)證上面的刪除是否成功
Assert.assertEquals(9, userRepository.findAll().size());
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


當(dāng)前標(biāo)題:SpringBoot中使用Spring-data-jpa實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪查改
當(dāng)前路徑:http://weahome.cn/article/jjisgj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部