您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Spring Data JPA的配置與使用方法,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
首先簡單介紹一下SpringData:Spring Data 項目的目的是為了簡化構建基于 Spring 框架應用的數據訪問計數,包括非關系數據庫、Map-Reduce 框架、云數據服務等等;另外也包含對關系數據庫的訪問支持。
再介紹一下JPA:Java 持久化 API (JPA)是一個 Java 應用程序接口 規范,描述了使用 Java標準版平臺(Java SE) 和 Java企業版平臺(Java EE)的應用中的 關系數據 的管理。(摘自維基百科)
現在我們可以來聊一聊Spring Data JPA。從Spring Data的介紹以及JPA的介紹不難看出,Spring Data JPA是使用JPA標準的持久層工具。持久層工具,那就有意思了,我們已經有Hibernate和Mybatis等等好用的持久層工具了,為什么要用Spring Data JPA呢?這是一個好問題,我賣個關子,我們先來看看Spring Data如何與Spring進行整合。
1. Spring整合Spring Data JPA
1.1 添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency>
1.2 配置屬性
#通用數據源配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/springboot_jpa?charset=utf8mb4&useSSL=false spring.datasource.username=root spring.datasource.password=123456 # Hikari 數據源專用配置 spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 # JPA 相關配置 #在 SrpingBoot 2.0 版本中,Hibernate 創建數據表的時候,默認的數據庫存儲引擎選擇的是 MyISAM (之前好像是 InnoDB,這點比較詭異)。這個參數是在建表的時候,將默認的存儲引擎切換為 InnoDB 用的。 spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect #配置在日志中打印出執行的 SQL 語句信息。 spring.jpa.show-sql=true #配置指明在程序啟動的時候要刪除并且創建實體類對應的表。這個參數很危險,因為他會把對應的表刪除掉然后重建。所以千萬不要在生成環境中使用。只有在測試環境中,一開始初始化數據庫結構的時候才能使用一次。 spring.jpa.hibernate.ddl-auto=update
對spring.jpa.hibernate.ddl-auto屬性感興趣的同學,可以去下面這篇博客看看。jpa的hibernate.ddl-auto的幾個屬性值區別。
1.3 創建實體類
import lombok.Data; import javax.persistence.*; /* * @Description TODO * @author Raindrop * @date 2019/8/22 9:10 */ @Data //lombok構建Get和Set方法 @Entity //聲明該類為實體類 @Table(name = "SpringDataJpa") //該實體類對應的表名 public class Test { @Id //該屬性為主鍵 @GeneratedValue(strategy = GenerationType.IDENTITY) //JPA通用策略生成器 @Column(name = "id") //數據表中列名 private Integer id; @Column(name = "username", columnDefinition = "varchar(50) not null") //數據表中列名以及列類型 private String username; @Column(name = "email", columnDefinition = "varchar(50) not null") //數據表中列名以及列類型 private String email; @Column(name = "sex", columnDefinition = "varchar(50) not null") //數據表中列名以及列類型 private String sex; @Column(name = "age", columnDefinition = "varchar(50) not null") //數據表中列名以及列類型 private String age; }
1.4 創建dao層
好了,我們的準備工作都已經做完了,接下來我們就可以快樂的進行CRUD了。
創建Repository類
package run.halo.app.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import run.halo.app.model.entity.*; import java.util.List; public interface RaindropUserRepository extends JpaRepository<RaindropUser, Integer> { //自定義方法 根據方法名來創建sql語句 //形成的SQL語句:select * from spring_data_jpa where userName = ?1 RaindropUser findByUsername(String userName); //自定義方法 根據方法名來創建sql語句 //形成的SQL語句:select * from spring_data_jpa where sex = ?1 and email=?2 RaindropUser findBySexAndEmail(String sex, String email); //切記切記,native的使用方法 JPA使用nativeQuery=true來區分是不是原生SQL //以下方法是錯誤的,不可以使用原生的sql,而要是用對應的實體類以及屬性來表示列和表名 //@Query("select id,username from spring_data_jpa where age < :age") @Query("select new run.halo.app.model.entity.RaindropUser(raindrop.id," + "raindrop.username,raindrop.email,raindrop.sex," + "raindrop.age) from RaindropUser raindrop where raindrop.age < ?1") List<RaindropUser> findByLtAge(Integer age); // 該示例也是錯的 // @Query("select new run.halo.app.model.entity.RaindropUser(a.id,a.username,a.email,a.sex,a.age) from spring_data_jpa a where age > ?1") // RaindropUser findByRtAge(Integer age); }
1.5 測試類
@Test public void Test(){ RaindropUser raindropUser = new RaindropUser(); // raindropUser.setEmail("123123@gmail.com"); // raindropUser.setAge(12); // raindropUser.setUsername("Raindrop"); // raindropUser.setSex("man"); // 繼承自JpaRepository類都有一些基礎方法,稍后講解。該方法為保存數據 // raindropUserRepository.save(raindropUser); List<RaindropUser> list = raindropUserRepository.findByLtAge(15); System.out.println("List: " + list.get(0)); // RaindropUser raindropUser1 = raindropUserRepository.findByRtAge(10); // System.out.println(raindropUser); // System.out.println(raindropUser1); }
1.6 JAP方法解析
我們在Repository類中定義了findByUsername以及findBySexAndEmail方法,SpringData會根據方法名自動生成SQL語句來執行。
重點詞匯以及生成的SQL語句
Keyword | Sample | JPQL snippet |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age ? ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collectionage) | … where x.age not in ?1 |
TRUE | findByActiveTrue() | … where x.active = true |
FALSE | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
以上就是Spring Data JPA的配置與使用方法,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。