JPA簡介
- JPA(Java Persistence API)定義了對象關系映射(ORM)以及實體對象持久化的標准接口
- JPA是用於管理Java EE和Java SE環境中的持久化,以及對象/關系映射的Java API
- JPA是一個基於ORM(Object Relational Mapping)的標准規范,所謂規范是只定義標准規則(如:接口、注解),不提供具體實現
- 主要實現
- Hibernate、Eclipse和OpenJPA
JPA提供的技術
JPA所維護的核心是實體(Entity bean),而它是通過一個持久化上下文(Persistence Context)來使用的。
- ORM映射元數據:JPA支持XML和JDK 5.0注解兩種元數據的形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持久化到數據庫表中,在SpringBoot中主要通過直接實現
- JPA 的API:定義規范,以操作實體對象,執行CRUD操作,來完成對象的持久化和查詢,框架在后台替我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來
- 查詢語言:通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。定義JPQL(Java Persistence Query Language)和Criteria兩種查詢方式,約定了面向對象的查詢原因JPQL,通過這層關系可以實現比較靈活的查詢
JPA核心概念
實體
- 實體表示關系數據庫中的表
- 每個實體實例對應於該表中的行
- 類必須用javax.persistence.Entity注解
- 類必須有一個public或protected的無參數的構造函數
- 實體實例被當做值以分離對象方式進行傳遞(例如通過會話bean的遠程業務接口),則該類必須實現Serializable接口
- 唯一的對象標識符:簡單主鍵(javax.persistence.Id)、復合主鍵(javax.persistence.EmbeddedId和javax.persistence.IdClass)(簡而言之,必須有一個id)
關系
- 一對一:@OneToOne
- 一對多:@OneToMany
- 多對一:@ManyToOne
- 多對多:@ManyToMany
EntityManager
EntityManager接口:是應用程序操縱持久化數據的接口,用於增刪改查
- 定義用於持久性上下文進行交互的方法
- 創建和刪除持久實體實例,通過實體的主鍵查找實體
- 允許在實體上運行查詢
EntityManager稱為實體管理器,由EntityManagerFactory所創建
獲取EntityManager實例:
@PersistenceUnit EntityManagerFactory emf; EntityManager emf; @Resource UserTranscation utx; ... //通過EntityManagerFactory獲取EntityManager em=emf.createEntityManager(); try{ //事務開啟 utx.begin(); em.persist(SomeEntity); em.merge(AnotherEntity); em.remove(ThirdEntity); //事務提交 utx.commit(); }catch(Exception e){ utx.rollback(); }
查找實體:
@PersistenceContext EntityManager em; public void enterOrder(int custID,CustomerOrder newOrder){ Customer cust=em.find(Customer.class,CustID); cust.getOrders().add(newOrder); newOrder.setCustomer(cust); }
補充:間歇性忘記ORM,說明沒有理解ORM的思想,所以在此補充ORM
ORM思想概述
- 建立兩個映射關系
- 實體類和表的映射關系
- 實體類中屬性和表中字段的映射關系
- 不再重點關注SQL語句
- 主要目的:操作實體類相當於操作數據庫
- ORM框架:
- Mybatis
- Hibernate
Spring Data JPA簡介
- 是Spring Data家族的一部分
- 對基於JPA的數據訪問層的增強支持
- 更容易構建基於使用Spring數據訪問技術棧的應用程序
常用接口
- CrudRepository 該接口提供了11個常用操作方法
- PagingAndSortingRepostiory 該接口繼承了CrudRepository接口,提供了兩個方法,實現了分頁和排序的功能
- JpaPepository 該接口繼承了PagingAndSortingRepository接口。同時也繼承QueryByExampleExecutor接口,這是個用“實例”進行查詢的接口
@NoRepositoryBean public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S entity);//保存 <S extends T> Iterable<S> save(Iterable<S> entities);//批量保存 T findOne(ID id);//根據id 查詢一個對象。返回對象本身,當對象不存在時,返回null Iterable<T> findAll();//查詢所有的對象 Iterable<T> findAll(Iterable<ID> ids);//根據id列表 查詢所有的對象 boolean exists(ID id);//根據id 判斷對象是否存在 long count();//計算對象的總個數 void delete(ID id);//根據id 刪除 void delete(T entity);//刪除一個對象 void delete(Iterable<? extends T> entities);//批量刪除,集合對象(后台執行時,一條一條刪除) void deleteAll();//刪除所有 (后台執行時,一條一條刪除) }
@NoRepositoryBean public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort);// 僅排序 Page<T> findAll(Pageable pageable);// 分頁和排序 }
@NoRepositoryBean public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { List<T> findAll(); //查詢所有對象,返回List List<T> findAll(Sort sort); //查詢所有對象,並排序,返回List List<T> findAll(Iterable<ID> ids); //根據id列表 查詢所有的對象,返回List void flush(); //強制緩存與數據庫同步 <S extends T> List<S> save(Iterable<S> entities); //批量保存,並返回對象List <S extends T> S saveAndFlush(S entity); //保存並強制同步數據庫 void deleteInBatch(Iterable<T> entities); //批量刪除 集合對象(后台執行時,生成一條語句執行,用多個or條件) void deleteAllInBatch();//刪除所有 (執行一條語句,如:delete from user) T getOne(ID id); //根據id 查詢一個對象,返回對象的引用(區別於findOne)。當對象不存時,返回引用不是null,但各個屬性值是null @Override <S extends T> List<S> findAll(Example<S> example); //根據實例查詢 @Override <S extends T> List<S> findAll(Example<S> example, Sort sort);//根據實例查詢,並排序。 }