jpa 概述
全稱Java Persistence API,通過JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中
JPA提供的技術:
1)ORM映射元數據:JPA支持XML和JDK 5.0註解兩種元數據的形式,元數據描述對象和表之間的映射關係,框架據此將實體對象持久化到數據庫表中;
2)JPA 的API:用來操作實體對象,執行CRUD操作,框架在後臺替我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。
3)查詢語言:通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。
jpa 和hibernate的關係
JPA是規範,Hibernate是框架,JPA是持久化規範,而Hibernate實現了JPA。
在springboot中的 jpa的使用
##實體對象
實體關係映射(ORM)
對象端 | 數據庫端 | annotion | |
---|---|---|---|
Class | Table | @Entity @Table(name=“tablename”) | |
property | column | @Column(name = “columnname”) | |
property | primary key | @Id @GeneratedValue 詳見ID生成策略 |
@Table(name="t_dept")
@Entity
public class Dept {
@Id
@GeneratedValue
int did;
String dname;
映射關係
JPA定義了
one-to-one、one-to-many、many-to-one、many-to-many 4種關係。
JPA提供的接口
JpaRepository,最頂層的接口,是一個空的接口,目的是爲了統一所有Repository的類型
CrudRepository :是Repository的子接口,提供CRUD的功能
PagingAndSortingRepository:是CrudRepository的子接口,添加分頁和排序的功能
接口舉例
@Repository
public interface JpaDao extends JpaRepository<RiCheng, Integer> {
Page<RiCheng> findGoodsListBySnameContaining(String name,Pageable page);
}
jap中的默認查詢方法
Keyword | Sample | JPQL snippet |
---|---|---|
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 | findByFirstname,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 %) |
Containing1 | 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(Collection age) | … 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) |
jpa的分頁
設置分頁
PageRequest pageRequest = PageRequest.of(1, 3);
傳參:Page findGoodsListBySnameContaining(String name,Pageable page);