spring data jpa实战

上传人:第*** 文档编号:33550527 上传时间:2018-02-15 格式:DOCX 页数:12 大小:121.41KB
返回 下载 相关 举报
spring data jpa实战_第1页
第1页 / 共12页
spring data jpa实战_第2页
第2页 / 共12页
spring data jpa实战_第3页
第3页 / 共12页
spring data jpa实战_第4页
第4页 / 共12页
spring data jpa实战_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《spring data jpa实战》由会员分享,可在线阅读,更多相关《spring data jpa实战(12页珍藏版)》请在金锄头文库上搜索。

1、Spring data jpa 实战一、 概述 .1二、 配置 maven.1三、 配置持久化单元 .4四、 配置 applicationContext.xml 文件 .4五、 spring data jpa 详解 .5六、 spring data jpa 1.1 新特性及分页介绍 .9一、 概述对于我们以前实现数据操作层,我们大部分是通过手工来创建,创建的过程一般分为下面几个步骤:1. 创建一个具有公共增、删、改、查及分页的基类 dao 接口2. 创建实现基类 dao 接口及各个方法的抽象类3. 创建具体的 dao 层,并继承基类 dao 接口4. 实现具体的 dao 层,继承基类的抽象类现

2、在我们有更好的方法替代这些工作了,spring Data 家族给我们提供了一个现成的 dao 层框架,这里面有不同的项目,如 Spring Data JPA, Spring Data Neo4j and Spring Data MongoDB,他们的共同特点是他们给我们提供了框架代码,不再需要我们自己去实现了。而且,spring Data 能自动创建实体 dao 的实现类和自定义查询。因此基于以前写得程序,我们几乎不再需要第四步骤了。在这一章我们会学到如何利用 spring Datajpa 来调整我们的 dao 层。我们的项目是基于maven 实现的,所以首先我们将配置 pom,然后我们再进入

3、实际的仓库代码。二、 配置 maven在 maven 中的 pom 中加入如下的依赖3.1.1.RELEASE3.6.10.Final1.0.3.RELEASEorg.springframeworkspring-webmvc$spring.versionorg.springframeworkspring-core$spring.versionorg.springframeworkspring-web$spring.versionorg.springframeworkspring-beans$spring.versionorg.springframeworkspring-context$spri

4、ng.versionorg.springframeworkspring-aop$spring.versionorg.springframeworkspring-context-support$spring.versionorg.springframeworkspring-tx$spring.versionorg.springframeworkspring-orm$spring.versionorg.springframeworkspring-jdbc$spring.versionorg.springframeworkspring-test$spring.versionorg.springfra

5、mework.dataspring-data-jpa$spring.data.versionorg.hibernatehibernate-core $hibernate.versionorg.hibernatehibernate-entitymanager$hibernate.versionorg.hibernatehibernate-ehcache$hibernate.versionorg.slf4jslf4j-log4j121.6.1mysqlmysql-connector-java5.1.20commons-dbcpcommons-dbcp1.4junitjunit4.10jstljst

6、l1.2servletapiservletapi2.4providedjavax.servlet.jspjsp-api2.2providedorg.aspectjaspectjweaver1.6.12三、 配置持久化单元在类路径底下新建 META-INF,在 META-INF 中建一个 persistence.xml,其内容如下:org.hibernate.ejb.HibernatePersistence 四、 配置 applicationContext.xml 文件在 resources 加入 spring 的配置文件 applicationContext.xml,日志配置和 jdbc 配置

7、详情请参考源码。applicationContext.xml 中的内容如下classpath:jdbc.properties 其中: 在服务启动时,将dao层接口通过动态代理加入到容器管理中。即类似于我们以前配置的service然后通过组建扫描机制,加入到容器管理中。五、 spring data jpa 详解接下去我们来写 spring data jpa 的代码,让 Spring Data JPA 来帮助我们完成业务逻辑。在着手写代码之前,开发者需要先 下载 Spring Data JPA 的发布包(需要同时下载 Spring Data Commons 和 Spring Data JPA 两个

8、发布包,Commons 是 Spring Data 的公共基础包) ,并把相关的依赖 JAR 文件加入到 CLASSPATH 中。首先我们来看看 Spring data jpa 执行过程如下:在看上面 Bean 定义的时候,其实已经明白了执行过程:1. 将 JPA CRUD 规范相关的方法交给 SimpleJpaRepository 这个类执行2. 将特殊查询相关的交给 QueryExecutorMethodInterceptor 执行。主要做自定义实现的部分,method query 部分和 named query 部分。具体查询类详见下图。第二、我们来看接口类public interfac

9、e UserDao extends JpaRepository public void findByUserName(String userName);通过上面的列子,我们来总结一下使用 spring Data jpa 进行持久化开发大致需要的三个步骤:1. 声明持久层的接口,该接口继承 Repository,Repository 是一个标记型接口,它不包含任何方法,当然如果有需要,Spring Data 也提供了若干 Repository 子接口,其中定义了一些常用的增删改查(CrudRepository),以及分页相关的方法(PagingAndSortingRepository),当然在我

10、们的列子中我们实现了JpaRepository。2. 在接口中声明需要的业务方法。Spring Data 将根据给定的策略(具体策略稍后讲解)来为其生成实现代码。3. 在 Spring 配置文件中增加一行声明,让 Spring 为声明的接口创建代理对象。配置了 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。对于上面的接口我们还可以有一种写法,即通过注解RepositoryDefinit

11、ion(domainClass = User.class, idClass = Integer.class) public interface UserDaopublic void findByUserName(String userName); 效果与上面通过接口实现一样。前面提到,Spring Data JPA 在后台为持久层接口创建代理对象时,会解析方法名字,并实现相应的功能。除了通过方法名字以外,它还可以通过如下两种方式指定查询语句:1. Spring Data JPA 可以访问 JPA 命名查询语句。开发者只需要在定义命名查询语句时,为其指定一个符合给定格式的名字,Spring Da

12、ta JPA 便会在创建代理对象时,使用该命名查询语句来实现其功能。2. 开发者还可以直接在声明的方法上面使用 Query 注解,并提供一个查询语句作为参数,Spring Data JPA 在创建代理对象时,便以提供的查询语句来实现其功能。下面我们分别讲述三种创建查询的方式。 根据方法名来查询,即我们刚开始给出的列子public List findByUserName(String userName);框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。并且如果方法的最后一个参数是 Sort 或

13、者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。在创建查询时,我们通过在方法名中使用属性名称来表达,比如 findByUserAddressZip ()。框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为 AccountInfo 类型): 先判断 userAddressZip (根据 POJO 规范,首字母变为小写,下同)是否为 AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步; 从右往左截取第一个大写字母开头的字符串(此处为 Zip),然后检查剩下的字

14、符串是否为 AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为 AccountInfo 的一个属性; 接着处理剩下部分( AddressZip ),先判断 user 所对应的类型是否有 addressZip 属性,如果有,则表示该方法最终是根据 AccountInfo.user.addressZip 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 AccountInfo.user.address.zip 的值进行查询。可能会存在一种特殊情况,比如 AccountInfo 包含一个 user 的属性,也有一个 userAddress 属性,此时会存在混淆。读者可以明确在属性之间加上 _ 以显式表达意图,比如 findByUser_AddressZip() 或者 findByUserAddress_Zip()。在查询时

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号