Spring Data Jpa 初探

Spring Data 項目的目的是爲了簡化構建基於 Spring 框架應用的數據訪問計數,包括非關係數據庫、Map-Reduce 框架、雲數據服務等等;另外也包含對關係數據庫的訪問支持。java

<!-- spring data jpa 的maven座標 -->
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.9.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.7.Final</version>
        </dependency>

Spring中的applicationContext.xml中關於jpa的配置:mysql

首先引入名稱空間:程序員

xmlns:jpa="http://www.springframework.org/schema/data/jpa"

http://www.springframework.org/schema/data/jpa 
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
<!-- 描述spring整合JPA -->
<jpa:repositories base-package="dao接口以及實現類所在的包" />

<!-- spring整合jpa配置,jpa管理工廠 -->
<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
         <!-- 鏈接池 -->
         <property name="dataSource" ref="配置的鏈接池"/>
         <!-- 註解掃描domain類 -->
         <property name="packagesToScan" value="實體類domain所在的包" />
          <!-- jpa採起的底層框架開發,這裏使用的是hibernate框架 -->
          <property name="persistenceProvider">
                    <bean class="org.hibernate.ejb.HibernatePersistence" />
          </property>
          <!-- jpa的設置 -->
         <property name="jpaVendorAdapter">
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
         <property name="generateDdl" value="true" />
         <property name="database" value="MYSQL" />
         <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
         <!-- <property name="showSql" value="true"/> -->
     </bean>
         </property>

         <!-- jpa的一些高級特性 -->
         <property name="jpaDialect">
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
         </property>
         <property name="jpaPropertyMap">
     <map>
         <entry key="hibernate.query.substitutions" value="true 1,false 0" />
     </map>
         </property>
</bean>

    <!--配置 jpa事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
    <!-- 自動事務管理 -->
<tx:annotation-driven transaction-manager="transactionManager" />

其中jpa具備的一些參數:spring

  • dataSource屬性指定使用Spring定義的數據源;
  • persistenceXmlLocation指定JPA配置文件爲chapter8/persistence.xml,且該配置文件很是簡單,具體配置徹底在Spring中進行;
  • persistenceUnitName指定持久化單元名字,即JPA配置文件中指定的;
  • persistenceProvider:指定JPA持久化提供商,此處使用Hibernate實現HibernatePersistence類;
  • jpaVendorAdapter:指定實現廠商專用特性,即generateDdl= true表示自動生成DDL,database= MYSQL表示使用的是mysql數據庫;
  • jpaDialect:若是指定jpaVendorAdapter此屬性可選,此處爲HibernateJpaDialect;

當使用了spring data jpa去集成hibernate等框架時候,能夠採用dao接口繼承jpa提供的接口的方式進行CRUD操做,而不須要本身編寫實體類去實現,spring會在執行的以後,自動生成實現類,從而極大的簡化了操做.sql

如下是dao繼承的接口編寫規則:數據庫

  • Repository (空接口)
  • CrudRepository (增刪改查)
  • PagingAndSortingRepository (分頁和排序)
  • JpaRepository (擴展增刪改查、批量操做 )
  • JpaSpecificationExecutor: 用來作負責查詢的接口
  • Specification:是Spring Data JPA提供的一個查詢規範, 要作複雜的查詢,相似hibernate QBC查詢

上述規則描述中,標綠的爲經常使用接口.當dao接口繼承了JpaRepository後,就能夠在servie類彙總,使用image api

這一系列的方法. app

而當dao接口繼承了JpaSpecificationExecutor接口後,即可實現以下一系列方法. 框架

image

同時,繼承了JpaSpecificationExecutor接口後,還能夠自定義方法,以及按照規則編寫方法. dom

  1. 在dao接口中,新建方法,加上註解,就可使用HQL語句進行CRUD操做.
    @Query("HQL語句")
    @Modifying

注:

  • @Query註解默認接受HQL語句,若是想配置SQL,能夠將nativeQuery屬性設置true
  • @Query註解也能夠配置增刪改操做,可是要添加@Modifying註解
  1. 另外一種方法,不須要編寫HQL語句,也能夠進行查詢操做,即按照規則編寫方法使用JPQL語法自動實現數據庫查詢的操做.

JPQL查詢方法編寫規則:

image

image

image

image

 

spring data jpa是一種很是好的orm規範,雖然目前只有有hibernate,OpenJPA,TopLink和EclipseJPA等持久化層框架實現,但發展空間很是大,而且能極大的簡化程序員的操做,但願將來有更多的持久化層能對jpa支持,以便提供更加優秀的開發條件.

相關文章
相關標籤/搜索