Spring Data JPA數據持久化

目錄java

 

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

  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接口:是應用程序操縱持久化數據的接口,用於增刪改查app

  • 定義用於持久性上下文進行交互的方法
  • 建立和刪除持久實體實例,經過實體的主鍵查找實體
  • 容許在實體上運行查詢

EntityManager稱爲實體管理器,由EntityManagerFactory所建立框架

獲取EntityManager實例ide

@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的思想,因此在此補充ORMpost

ORM思想概述

  • 創建兩個映射關係
    • 實體類和表的映射關係
    • 實體類中屬性和表中字段的映射關係
  • 再也不重點關注SQL語句
  • 主要目的:操做實體類至關於操做數據庫
  • ORM框架:
    • Mybatis
    • Hibernate

 

Spring Data JPA簡介

  • 是Spring Data家族的一部分
  • 對基於JPA的數據訪問層的加強支持
  • 更容易構建基於使用Spring數據訪問技術棧的應用程序

經常使用接口

  • CrudRepository 該接口提供了11個經常使用操做方法
  • PagingAndSortingRepostiory 該接口繼承了CrudRepository接口,提供了兩個方法,實現了分頁和排序的功能
  • JpaPepository 該接口繼承了PagingAndSortingRepository接口。同時也繼承QueryByExampleExecutor接口,這是個用「實例」進行查詢的接口

CrudRepositoryspa

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

}

 

 返回頂部

相關文章
相關標籤/搜索