你的位置:首页 > Java教程

[Java教程]spring data jpa学习笔记一:helloworld


在学习 JPA Spring Data之前,我们有必要了解一下JPA和Spring Data。

 

JPA

JPA全称Java Persistence API。即java持久化规范。JPA通过注解或

 

 

Spring Data

Spring Data是Spring框架的一个子项目,就像Spring MVC是Spring的一部分一样。使得数据库访问变得方便和快捷。Spring Data 支持JPA。

 

JPA Spring Data

JPA Spring Data致力于减少数据访问层(DAO)的开发量。使用Spring Data JPA,开发人员只需要声明持久层的接口。

 

JPA Spring Data与JPA的关系

JPA Spring Data是JPA规范的一种上层实现。

 

下面我们通过一个简单的Hello World案例来学习Spring Data JPA的相关技术。

使用 Spring Data JPA 进行持久层开发需要的四个步骤:

第一步:配置 Spring 整合 JPA

第二步:在 Spring 配置文件中配置 Spring Data,让 Spring 为声明的接口创建代理对象。配置了 <jpa:repositories> 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。

第三步:声明持久层的接口,该接口继承 Repository,Repository 是一个标记型接口,它不包含任何方法,如必要,Spring Data 可实现 Repository 其他子接口,其中定义了一些常用的增删改查,以及分页相关的方法。

第四步:在接口中声明需要的方法。Spring Data 将根据给定的策略(具体策略稍后讲解)来为其生成实现代码。

 

 

第一步的具体过程如下:

第一步:新建一个java工程命名为springDataJpa

第二步:在工程下新建libs文件夹,用来存放外部jar包

第三步:引入jar包

spring框架相关jar包:              hibernate相关jar包                    jpa相关jar包

                

c3p0相关jar包:                 mysql驱动包

        

          

将上面的jar包拷入第二步中新建的libs文件夹中,右键-->构建路径-->添加至构建路径,将jar包加入到classpath下。

 

第四步:新建spring配置文件,命名为applicationContext.

在配置文件中配置:数据源、JPA 的EntityManagerFactory、spring事务管理器、支持注解的事务、Spring Data 

applicationContext.

<??><beans ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/  ="http://www.springframework.org/schema/context"  ="http://www.springframework.org/schema/tx"  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-4.0.xsd    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">  <!-- 1. 配置数据源 -->  <context:property-placeholder location="classpath:db.properties"/>    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">    <property name="user" value="${jdbc.user}"></property>    <property name="password" value="${jdbc.password}"></property>    <property name="driverClass" value="${jdbc.driverClass}"></property>    <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>        <!-- 配置其他属性 -->  </bean>        <!-- 2. 配置 JPA 的 EntityManagerFactory -->    <!-- 3. 配置事务管理器 -->    <!-- 4. 配置支持注解的事务 -->    <!-- 5. 配置 SpringData --></beans>

 

 第五步:新建db.properties文件,里面用key-value形式存储数据源相关信息

db.properties

jdbc.user=rootjdbc.password=mysqljdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql:///jpa

 

此处使用的是mysql数据库,我们需要根据各自环境来配置自己的用户名、密码和url这些信息。

 

 到这一步的时候,我们可以先进行一下单元测试,看看之前的配置是否存在问题。

 

 第六步:新建SpringDataTest测试类

 SpringDataTest.java

package com.springdata.jpa.test;import java.sql.SQLException;import javax.sql.DataSource;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathpublic class SpringDataTest {  private ApplicationContext ctx = null;    {    ctx = new ClassPath);  }    /**   * 测试数据源配置是否正确   * @throws SQLException   */  @Test  public void testSpringData() throws SQLException {    DataSource dataSource = ctx.getBean(DataSource.class);    System.out.println(dataSource.getConnection());  }}

 

如果控制台打印如下信息

则说明测试成功

 

测试成功之后,我们需要继续在applicationContext.

<!-- 2. 配置 JPA 的 EntityManagerFactory -->  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">    <property name="dataSource" ref="dataSource"></property>    <property name="jpaVendorAdapter">      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>    </property>    <property name="packagesToScan" value="com.springdata.jpa"></property>    <property name="jpaProperties">      <props>        <!-- 二级缓存相关 -->        <!--         <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>        <prop key="net.sf.ehcache.configurationResourceName">ehcache-hibernate.-->        <!-- 生成的数据表的列的映射策略 -->        <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>        <!-- hibernate 基本属性 -->        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>        <prop key="hibernate.show_sql">true</prop>        <prop key="hibernate.format_sql">true</prop>        <prop key="hibernate.hbm2ddl.auto">update</prop>      </props>    </property>  </bean>

 

 

配置玩EntityManagerFactory后,我们可以建一个Person类来验证一下,配置是否正确

Person.java

package com.springdata.jpa.entity;import java.util.Date;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;@Table(name="JPA_PERSONS")@Entitypublic class Person {  private Integer id;  private String lastName;  private String email;  private Date birth;    @GeneratedValue  @Id  public Integer getId() {    return id;  }  public void setId(Integer id) {    this.id = id;  }  public String getLastName() {    return lastName;  }  public void setLastName(String lastName) {    this.lastName = lastName;  }  public String getEmail() {    return email;  }  public void setEmail(String email) {    this.email = email;  }  public Date getBirth() {    return birth;  }  public void setBirth(Date birth) {    this.birth = birth;  }   }

 

 

 

测试:在SpringDataTest测试类中添加tespJpa方法

@Testpublic void testJpa(){    }

 

以junit方式运行testJpa方法,运行之后查看数据库中是否生成了jpa_persons表,如果有则配置成功,可以继续下一步。

下面的图片中是jpa_persons表结构

 

接下来我们需要继续在applicationContext.

<!-- 3. 配置事务管理器 -->  <bean id="transactionManager"    class="org.springframework.orm.jpa.JpaTransactionManager">    <property name="entityManagerFactory" ref="entityManagerFactory"></property>    </bean>  <!-- 4. 配置支持注解的事务 -->  <!-- 此处transaction-manager属性值与事务管理器的bean的id保持一致 -->  <tx:annotation-driven transaction-manager="transactionManager"/>

到这里,Spring 整合 JPA这一步就结束了。

 

 

接下来我们开始配置第二步:在 Spring 配置文件中配置 Spring Data

过程如下:

第一步:引入spring data 相关jar包

将上面的jar包拷入第二步中新建的libs文件夹中,右键-->构建路径-->添加至构建路径,将jar包加入到classpath下。

 

第二步:在applicationContext.

<!-- 5. 配置 SpringData --><!-- 加入 jpa 的命名空间 --><!-- base-package: 扫描 Repository Bean 所在的 package --><jpa:repositories base-package="com.springdata.jpa"  entity-manager-factory-ref="entityManagerFactory"></jpa:repositories>

 

第三步:创建PersonRepository接口来测试一下配置是否正确

package com.springdata.jpa.repository;import org.springframework.data.repository.Repository;import com.springdata.jpa.entity.Person;public interface PersonRepository extends Repository<Person, Integer>{  //根据 lastName 来获取对应的 Person  Person getByLastName(String lastName);}

 

在测试之前我们需要先向数据库表jpa_persons中插入一条数据,例如:

 

然后在在SpringDataTest测试类中添加testGetByLastName方法

@Testpublic void testGetByLastName(){  PersonRepository personRepository = ctx.getBean(PersonRepository.class);  Person person = personRepository.getByLastName("AA");  System.out.println(person);}

以junit方式运行testGetByLastName方法,发现报了如下错误:

Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory  at java.net.URLClassLoader$1.run(URLClassLoader.java:366)  at java.net.URLClassLoader$1.run(URLClassLoader.java:355)  at java.security.AccessController.doPrivileged(Native Method)  at java.net.URLClassLoader.findClass(URLClassLoader.java:354)  at java.lang.ClassLoader.loadClass(ClassLoader.java:425)  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)  at java.lang.ClassLoader.loadClass(ClassLoader.java:358)  ... 46 more

原因是Spring Data依赖slf4j的jar包,所以我们还需要引入如下jar包,并将其加入classpath下

再次以junit方式运行testGetByLastName方法,控制台打印消息如下:

 

到此为止,在 Spring 配置文件中配置 Spring Data这一步也完成了。

利用第一个小程序helloworld的搭建到此也就完成了。

 

 此博文是观看尚硅谷的jpa教学视频后所做学习笔记,如果有博友需要这套视频,可以访问如下网址进行下载:

http://pan.baidu.com/s/1DJHIe