SpringBoot整合JPA方法及配置解析
JPA與Hibernate及Spring Data JPA的關系
JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0注解或XML描述對象-關系表的映射關系,并將運行期的實體對象持久化到數(shù)據(jù)庫中。Sun引入新的JPA ORM規(guī)范出于兩個原因:其一,簡化現(xiàn)有Java EE和Java SE應用開發(fā)工作;其二,Sun希望整合ORM技術,實現(xiàn)天下歸一。
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數(shù)據(jù)庫表建立映射關系,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執(zhí)行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的JavaEE架構中取代CMP,完成數(shù)據(jù)持久化的重任。
Spring Data JPA是更大的Spring Data家族的一部分,它使實現(xiàn)基于JPA的存儲庫變得容易。 本模塊處理對基于 JPA 的數(shù)據(jù)訪問層的增強支持。 它使構建使用數(shù)據(jù)訪問技術的 Spring 驅(qū)動的應用程序變得更加容易。在相當長的一段時間內(nèi),實現(xiàn)應用程序的數(shù)據(jù)訪問層一直很麻煩。 必須編寫太多樣板代碼來執(zhí)行簡單的查詢以及執(zhí)行分頁和審核。 Spring Data JPA旨在通過將工作量減少到實際需要的數(shù)量來顯著改進數(shù)據(jù)訪問層的實現(xiàn)。 作為開發(fā)人員,您編寫存儲庫接口,包括自定義查找器方法,Spring 將自動提供實現(xiàn)。底層是Hibernate。
簡單理解就是JPA是java自帶的持久層API,然后Hibernate對JPA進行了二次開發(fā)和優(yōu)化,Spring Data JPA又對Hibernate進行了二次開發(fā)和優(yōu)化。
整合JPA
pom.xml
<dependencies> <!-- lombok插件依賴 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> <scope>runtime</scope> </dependency> <!-- jpa --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies>
application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring_boot_jpa_demo?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
jpa:
# 打印SQL
show-sql: true
hibernate:
# 5種建表策略,一般推薦update或none,首推update。
ddl-auto: update
- create:啟動時刪除上一次生成的表,并根據(jù)實體類生成表,表中數(shù)據(jù)會被清空
- create-drop:啟動時根據(jù)實體類生成表,程序關閉時表會被刪除
- update:啟動時會根據(jù)實體類生成表,當實體類屬性變動的時候,表結構也會更新,在初期開發(fā)階段使用此選項
- validate:啟動時驗證實體類和數(shù)據(jù)表是否一致,在數(shù)據(jù)結構穩(wěn)定時采用此選項
- none:不采取任何措施
Person實體類
import lombok.Data; import org.hibernate.annotations.Comment; //import org.hibernate.annotations.Table; import javax.persistence.*; /** * 人員 */ @Data @Entity //@Table(appliesTo = "person",comment = "人員表")//appliesTo指表的名稱(必填),MySQL表名小寫,用Person會拋異常。 public class Person { @Id//主鍵標識 @GeneratedValue(strategy = GenerationType.IDENTITY)//數(shù)據(jù)庫主鍵策略,默認是AUTO。IDENTITY自增有符號主鍵 @Comment("主鍵ID")//字段備注 private Long id; @Column(name = "name",length = 20,unique = true,nullable = false)//字段屬性設置 @Comment("名稱") private String name; @Comment("性別") private Integer sex; @Transient//此注解表示數(shù)據(jù)庫不創(chuàng)建該字段 private String ignore;//忽略字段 }
PersonRepository接口
import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; /** * 寫法參考<a rel="external nofollow" /> */ @Repository //不加也可以,只要你使用的時候注入即可。JpaRepository里面有很多簡單的CRUD接口,可以少寫很多代碼。 public interface PersonRepository extends JpaRepository<Person, Long> { //根據(jù)名稱精確查詢 List<Person> findByName(String name);//自定義方法 //模糊查詢 List<Person> findByNameLike(String name); //分頁模糊查詢 Page<Person> findAllByNameLike(String name, PageRequest pageRequest); }
具體寫法以及寫法所對應的SQL如下
Test測試類
import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import javax.annotation.Resource; @Slf4j @SpringBootTest public class PersonRepositoryTests { @Resource private PersonRepository personRepository; /** * 新增/修改。一般情況下新增是不傳ID的,只有修改才傳ID。 */ @Test public void save(){ Person person = new Person(); person.setName("Meta39"); person.setSex(0); this.personRepository.save(person); log.info("{}",this.personRepository.save(person)); } /** * 查詢 */ @Test public void search(){ // log.info("{}",this.personRepository.findById(1L));//使用框架自帶的方法 // log.info("{}",this.personRepository.findByName("Meta"));//使用自定義根據(jù)名稱查詢方法 // log.info("{}",this.personRepository.findByNameLike("%t%"));//使用自定義模糊查詢方法 // Page<Person> personPage = this.personRepository.findAll(PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "id")));//分頁查詢 // log.info("{}", personPage);//自帶無參分頁查詢 Page<Person> personPageByNameLike = this.personRepository.findAllByNameLike("%e%", PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "id"))); personPageByNameLike.forEach(System.out::println);//自定義模糊分頁查詢(%M%這種寫法是不會有SQL注入的,不信自己可以試試%M% and id = 1) } /** * 刪除 */ @Test public void delete(){ this.personRepository.deleteById(1L);//根據(jù)ID刪除一條記錄 this.personRepository.deleteAllById(Arrays.asList(1L,2L,3L));//根據(jù)ID集合批量刪除記錄 } }
總結
JPA相比較MyBatis來說,整體還是非常不錯的??梢哉f簡單的單表幾乎不用寫SQL。復雜的業(yè)務建議用SQL去實現(xiàn),JPA的復雜查詢太啰嗦
到此這篇關于SpringBoot整合Java Persistence API方法及配置解析的文章就介紹到這了,更多相關SpringBoot整合JPA內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java中的FileInputStream三種read()函數(shù)用法
這篇文章主要介紹了java中的FileInputStream三種read()函數(shù)用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Intellij IDEA菜單欄不見了(Main Menu as Separat
有人問博主,關于Intellij IDEA菜單欄找不到了,被不小心的操作給隱藏了,怎么辦?下面給大家分享解決方案,感興趣的朋友跟隨小編一起看看吧2024-06-06SpringMVC事件監(jiān)聽ApplicationListener實例解析
這篇文章主要介紹了SpringMVC事件監(jiān)聽ApplicationListener實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11