Spring Data JPA 入门Demo

什么是JPA呢?

 其实JPA可以说是一种规范,是java5.0之后提出来的用于持久化的一套规范;它不是任何一种ORM框架,在我看来,是现有ORM框架在这个规范下去实现持久层。

它的出现是为了简化现有的持久化框架,例如hibernate、Toplink等,让我们的程序再不用去使用这些现有的产品所提供的API,也就是说,我们只需遵循这套规范,用什么框架实现数据库操作就不会有太高的耦合度,JPA可以为我们降低耦合,并且简化我们的ORM操作。

 JPA主要提供3方面的技术:

  1.ORM映射元数据,通常对应我们的做法就是注解@Table@Entity这些,当然,你也可以通过xml来实现映射,但是,本人已经习惯注解了;

  2.Java持久化API,他同时提供很多现成的CRUD方法,分页、批量操作的都有;

3.查询语言(JPQL),跟hql很类似,但也有点小不同;

总的来说,JPA是把现有的orm框架做一个规范,让后大家在这个规范上选择使用不同的框架去实现自己功能,降低耦合度。

实现JPA的最多最常用的就是Hibernate,其实这套规范的作者也是hibernate的作者==。这里我就以hibernate实现JPA来说。

这是自己写的一个小小的demo,由于时间比较急功能不是很完善,但是基本功能都有了:http://files.cnblogs.com/files/sevenlin/MySpringDataJpaDemo.rar

使用的maven,涉及到spring,springmvc,spring data jpa以及hibernate

基本配置:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app  xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
          version="3.1">

  <display-name>Archetype Created Web Application</display-name>

    <!--引入spring-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application.xml</param-value>
    </context-param>

    <!-- filter -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>  

    <!--springmvc DispathcherServlet-->
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

</web-app>

spring 配置文件,application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                            http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

    <!-- 开启注解扫描 -->
    <context:component-scan base-package="com.seven.myspringdatajpademo"/>

    <!-- 引入外部配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 数据源 -->
    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         <property name="jdbcUrl" value="${jdbcUrl}"/>
        <property name="driverClass" value="${driverClass}"/>
        <property name="user" value="${user}"/>
        <property name="password" value="${password}"/>
    </bean>

    <!-- Jpa Entity Manager 配置 -->
    <bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!-- 指定数据源 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 指定Jpa持久化实现厂商类,这里是Hibernate -->
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
        <!-- 指定Entity实体类包路径 -->
        <property name="packagesToScan" value="com.seven.myspringdatajpademo.domain" />
        <!-- 配置jpa属性,下面是使用hibernate实现的方法 -->
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">false</prop>
                <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
            </props>
        </property>
    </bean>

    <!-- Hibernate对Jpa的实现 -->
    <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

    <!-- jap repositories 启动扫描,并自动创建代理 -->
    <jpa:repositories base-package="com.seven" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>

    <!-- 事务管理 -->
    <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <!-- 利用事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

springmvc 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--spring注解扫描包-->
    <context:component-scan base-package="com.seven.myspringdatajpademo"/>

    <!--springmvc注解驱动-->
    <mvc:annotation-driven/>

    <!--内部资源解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

相关配置:jdbc.properties

jdbcUrl=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver
user=root
password=root

主要涉及到jpa 的操作就是spring data的Repository接口,然后spring data jpa 同时提供子接口,功能也越来越强大

例如,CrudRepository、PagingAndSortingRepository、JpaRepository等等,具体看官方文档;

这里我主要说明的是,为什么可以利用接口实现crud呢?

其实,原理和我们学习spring的时候是一样的,就是ioc,依赖注入,仔细查看文档我们可以发现,这些接口有他们的实现类,

例如,最常见的SimpleJpaRepository,只要我们的接口实现Repository等接口,sping在实现的时候给我们注入就是类似SimpleJpaRepository的实现类,这样子,我们的接口就有了强大的功能!

  同时,spring data jpa通过规范的命名也可以实现不同的查询功能,具体可以查看:http://blog.csdn.net/z69183787/article/details/30265243 这篇博文,比我讲得好多了==。

demo下载地址:

http://files.cnblogs.com/files/sevenlin/MySpringDataJpaDemo.rar

上一篇:Hibernate从入门到精通(六)一对一双向关联映射


下一篇:记录分享公司Spring data相关配置