Spring Data JPA數據持久化


目錄

 

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)來使用的。

  1. ORM映射元數據:JPA支持XML和JDK 5.0注解兩種元數據的形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持久化到數據庫表中,在SpringBoot中主要通過直接實現
  2. JPA 的API:定義規范,以操作實體對象,執行CRUD操作,來完成對象的持久化和查詢,框架在后台替我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來
  3. 查詢語言:通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的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接口,這是個用“實例”進行查詢的接口

CrudRepository

@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();//刪除所有 (后台執行時,一條一條刪除)
}

PagingAndSortingRepostiory

@NoRepositoryBean  
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {  

    Iterable<T> findAll(Sort sort);// 僅排序  
    Page<T> findAll(Pageable pageable);// 分頁和排序  
} 

JpaPepository

@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);//根據實例查詢,並排序。

}

 

 返回頂部

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM