springdatajpa实战.pdf

上传人:索**** 文档编号:76241533 上传时间:2023-03-08 格式:PDF 页数:12 大小:143.17KB
返回 下载 相关 举报
springdatajpa实战.pdf_第1页
第1页 / 共12页
springdatajpa实战.pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《springdatajpa实战.pdf》由会员分享,可在线阅读,更多相关《springdatajpa实战.pdf(12页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

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

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

3、om 中加入如下的依赖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$spring.versionorg.springframeworksp

4、ring-aop$spring.versionorg.springframeworkspring-context-support$spring.versionorg.springframeworkspring-tx$spring.versionorg.springframeworkspring-orm$spring.versionorg.springframeworkspring-jdbc$spring.versionorg.springframeworkspring-test$spring.versionorg.springframework.dataspring-data-jpa$spri

5、ng.data.versionorg.hibernatehibernate-core$hibernate.versionorg.hibernatehibernate-entitymanager$hibernate.versionorg.hibernatehibernate-ehcache$hibernate.versionorg.slf4jslf4j-log4j121.6.1mysqlmysql-connector-java5.1.20commons-dbcpcommons-dbcp1.4 junitjunit4.10jstljstl1.2 servletapiservletapi2.4 pr

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

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

8、R 文件加入到CLASSPATH 中。首先我们来看看Spring data jpa 执行过程如下:在看上面Bean 定义的时候,其实已经明白了执行过程:1.将 JPA CRUD 规范相关的方法交给SimpleJpaRepository 这个类执行2.将特殊查询相关的交给QueryExecutorMethodInterceptor执行。主要做自定义实现的部分,method query 部分和 named query 部分。具体查询类详见下图。第二、我们来看接口类publicinterface UserDao extends JpaRepository publicvoid findByUserN

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

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

11、erface UserDao publicvoid findByUserName(String userName);效果与上面通过接口实现一样。前面提到,Spring Data JPA 在后台为持久层接口创建代理对象时,会解析方法名字,并实现相应的功能。除了通过方法名字以外,它还可以通过如下两种方式指定查询语句:1.Spring Data JPA 可以访问 JPA 命名查询语句。开发者只需要在定义命名查询语句时,为其指定一个符合给定格式的名字,Spring Data JPA 便会在创建代理对象时,使用该命名查询语句来实现其功能。2.开发者还可以直接在声明的方法上面使用 Query 注解,并提供

12、一个查询语句作为参数,Spring Data JPA 在创建代理对象时,便以提供的查询语句来实现其功能。下面我们分别讲述三种创建查询的方式。根据方法名来查询,即我们刚开始给出的列子public List findByUserName(String userName);框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。并且如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。在创建查询时,我们通过在方法名中使用属性名称来表达,比如

13、findByUserAddressZip()。框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为 AccountInfo 类型):先判断 userAddressZip(根据 POJO 规范,首字母变为小写,下同)是否为AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;从右往左截取第一个大写字母开头的字符串(此处为 Zip),然后检查剩下的字符串是否为 AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user

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

15、essZip()或者 findByUserAddress_Zip()。在查询时,通常需要同时根据多个属性进行查询,且查询的条件也格式各样(大于某个值、在某个范围等等),Spring Data JPA 为此提供了一些表达条件查询的关键字,大致如下:And-等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user,Striang pwd);Or-等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user,String addr);Between-等价于 SQL 中的 between

16、关键字,比如 findBySalaryBetween(int max,int min);LessThan-等价于 SQL 中的 ,比如 findBySalaryGreaterThan(int min);IsNull-等价于 SQL 中的 is null,比如 findByUsernameIsNull();IsNotNull-等价于 SQL 中的 is not null,比如 findByUsernameIsNotNull();NotNull-与 IsNotNull 等价;Like-等价于 SQL 中的 like,比如 findByUsernameLike(String user);NotLik

17、e-等价于 SQL 中的 not like,比如 findByUsernameNotLike(String user);OrderBy-等价于 SQL 中的 order by,比如findByUsernameOrderBySalaryAsc(String user);Not-等价于 SQL 中的 !=,比如 findByUsernameNot(String user);In-等价于 SQL 中的 in,比如 findByUsernameIn(Collection userList),方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;NotIn-等价于 SQL 中的 no

18、t in,比如findByUsernameNotIn(Collection userList),方法的参数可以是Collection 类型,也可以是数组或者不定长参数;使用Query 创建查询Query(select u from User u where u.userName=?1)public List findByQuery(String userName);我们可以看到使用Query 非常的简单,就通常写jpql语句一样。JPA 命名查询语句创建查询首先创建命名查询,如下EntityNamedQuery(name=User.findName,query=select u from Us

19、er u where u.userName=?)publicclass User implements Serializable /*这里需要注意的名称,名称需要满足”DomainClass.methodName()”的命名规则,或者出现异常。Query(select u from User u where u.userName=?1)public List findByQuery(String userName);创建查询的顺序Spring Data JPA 在为接口创建代理对象时,如果发现同时存在多种上述情况可用,它该优先采用哪种策略呢?为此,提供了 query-lookup-strate

20、gy 属性,用以指定查找的顺序。它有如下三个取值:create-通过解析方法名字来创建查询。即使有符合的命名查询,或者方法通过Query 指定的查询语句,都将会被忽略。create-if-not-found-如果方法通过 Query 指定了查询语句,则使用该语句实现查询;如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该命名查询;如果两者都没有找到,则通过解析方法名字来创建查询。这是query-lookup-strategy 属性的默认值。use-declared-query-如果方法通过 Query 指定了查询语句,则使用该语句实现查询;如果没有,则查找是否定义了符合条件的命名

21、查询,如果找到,则使用该命名查询;如果两者都没有找到,则抛出异常六、spring data jpa 1.1新特性及分页介绍在 spring data jpa1.1 中加入了对原生 sql 的支持,但是这个功能还不是很完善,具有一定的局限性。对于动态的分页和排序查询还不支持。个人感觉这个功能并不是很好用,spring data jpa 有待完善。Query(value=select*from user t where t.userName=?,nativeQuery=true)需要在后面加入nativeQuery=true 即表示原生查询用于查询生成的新关键字:LessThanEqual,Gre

22、aterThanEqual,Before,After,StartsWith,EndsWith,ContainsCDI 集成(see here for details)CDI 上下文依赖注入,在 javaEE 6引入了这个概念,即 JSR 299 (Contexts and Dependency Injection for the Java EE platform)规范,简称CDI。CDI 规范吸收了来自Spring IoC容器、JBoss Seam和 Google Guice 的 最佳实践,并与Java EE开发的实际需要相结合。正如CDI的字面含义一样,CDI 中的两个核心功能是上下文信息(

23、context)和依赖注入。这两个功能的结合点是 Java 中基本的组件模型bean。在 CDI 中,bean 定义了应用的状态和逻辑,并由容器来进行管理。每个被管理的bean 都有定义好的绑定到特定上下文的作用域和生命周期。当需要注入或访问bean 时,容器会从作用域对应的上下文中获取。当作用域失效时,对应上下文中所有的对象都会被删除。CDI 中的每个bean 都可以作为依赖注入时的目标。CDI 中预定义了一些常用的作用域。默认的作用域是Dependent,表示只对被注入的对象生效。作用域ApplicationScoped 表示应用的全局作用域,用来创建全局唯一的对象。RequestScop

24、ed 和 SessionScoped 则与HTTP 相关,分别表示HTTP 请求和HTTP 会话。ConversationScoped 是由应用自定义生命周期长短的作用域,可以用来实现跨多页面的工作流。分页查询Spring data jpa 对分页做了封装,主要的类有Pageable 和 Page Query(select a from User a where a.balance?1)public Page findByBalanceGreaterThan(Integer balance,Pageable pageable);需要传入的参数PageRequest request=new PageRequest(1,5,Sort.Direction.DESC,id);Page users=userDao.findByBalanceGreaterThan(100,request);多值排序可以使用下面这个pageRequest PageRequest request2=new PageRequest(1,5,new Sort(new Order(Direction.ASC,lastName),new Order(Direction.DESC,salary);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 实施方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com