本文参考了Spring Data JPA官方文档,引用了部分文档的代码。
Spring Data JPA是Spring基于Hibernate开发的一个JPA框架。如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便。但是Spring Data JPA框架功能更进一步,为我们做了 一个数据持久层框架几乎能做的任何事情。下面来逐步介绍它的强大功能。
添加依赖
我们可以简单的声明Spring Data JPA的单独依赖项。以Gradle为例,依赖项如下,Spring Data JPA会自动添加它的Spring依赖项。当前版本需要Spring框架版本为4.3.7.RELEASE
或更新,使用旧版本的Spring框架可能会出现bug。由于Spring Data JPA基于Hibernate,所以别忘了添加Hibernate的依赖项。
compile group: 'org.springframework.data', name: 'spring-data-jpa', version: '1.11.1.RELEASE'
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.8.Final'
基本使用
创建环境
Spring Data JPA也是一个JPA框架,因此我们需要数据源、JPA Bean、数据库驱动、事务管理器等等。下面以XML配置为例,我们来配置一下所需的Bean。重点在于<jpa:repositories base-package="yitian.study.dao"/>
一句,它告诉Spring去哪里寻找并创建这些接口类。
<!--启用注解配置和包扫描-->
<context:annotation-config/>
<context:component-scan base-package="yitian.study"/>
<!--创建Spring Data JPA实例对象-->
<jpa:repositories base-package="yitian.study.dao"/>
<!--数据源-->
<bean id="dataSource"
class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<property name="useSSL" value="false"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="user" value="root"/>
<property name="password" value="12345678"/>
</bean>
<!--JPA工厂对象-->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="yitian.study.entity"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true"/>
<property name="showSql" value="true"/>
</bean>
</property>
</bean>
<!--事务管理器-->
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!--事务管理-->
<tx:advice id="transactionAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="daoPointCut" expression="execution(* yitian.study.dao.*.*(..))"/>
<aop:advisor advice-ref="transactionAdvice" pointcut-ref="daoPointCut"/>
</aop:config>
创建DAO对象
前几天学了一点Groovy,再回头看看Java,实在是麻烦。所以这里我用Groovy写的实体类,不过语法和Java很相似。大家能看懂意思即可。不过确实Groovy能比Java少些很多代码,对开发挺有帮助的。有兴趣的同学可以看看我的Groovy学习笔记。
Groovy类的字段默认是私有的,方法默认是公有的,分号可以省略,对于默认字段Groovy编译器还会自动生成Getter和Setter,可以减少不少代码量。只不过equals等方法不能自动生成,多少有点遗憾。这里使用了JPA注解,建立了一个实体类和数据表的映射。
@Entity
class User {
@Id
@GeneratedValue