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支持,以便提供更加优秀的开发条件.

相关文章
相关标签/搜索