006、店主推荐springjpashiro国际物流云商项目jpa_第1页
006、店主推荐springjpashiro国际物流云商项目jpa_第2页
006、店主推荐springjpashiro国际物流云商项目jpa_第3页
006、店主推荐springjpashiro国际物流云商项目jpa_第4页
006、店主推荐springjpashiro国际物流云商项目jpa_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Spring Data JPA博客分类:SpringMVC、Spring Data 是什么Spring Data 是一个用于简化数据库,并支持云服务的开源框架。其主要目标是使得对数据的变得方便快捷,并支持map-reduce 框架和云计算数据服务。 Spring Data 包含多个子项目: Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化JPA - 简化创建 JPA 数据层和跨的持久层功能Hadoop - 基于 Spring 的 Hadoop 作业配置和一个 POJO 编程模型的 MapReduce 作业Key-Value - 集成了 Redis 和 Riak ,

2、提供多个常用场景下的简单封装- 集成文档数据库:CouchDB 和 MongoDB 并提供基本的配置和资料库支持Graph - 集成 Neo4j 提供强大的基于 POJO 的编程模型Graph Roo AddOn - Roo support for Neo4jJDBC Extens - 支持 Oracle RAD、高级队列和高级数据类型 Map- 基于 Grails 的提供对象框架,支持不同的数据库 Exles - 示例程序、文档和图数据库Guidance - 高级文档Spring Data JPA 是什么由Spring 提供的一个用于简化JPA 开发的框架nSpring Data JPA 能

3、干什么可以极大的简化JPA 的写法,可以在几乎不用写实现的情况下,实现对数据的和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。Spring Data JPA主要来看看Spring Data JPA 提供的接口,也是Spring Data JPA 的概念:1:Reitory:最顶层的接口,是一个空的接口,目的是为了所有Reitory 的类型,且能让组件扫描的时候自动识别。2:CrudReitory :是Reitory 的子接口,提供CRUD 的功能3:PagingAndSortingReitory:是CrudReitory 的子接口,添加分页和排序的功能 4:JpaReitory:是

4、PagingAndSortingReitory 的子接口,增加了一些实用的功能,比如:批量操作等。5:JpaSpecificationExecutor:用来做负责查询的接口6:Specification:是Spring Data JPA 提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可oWorldn 环境构建在Eclipse 里面构建一个普通的Java 工程,主要就是要加入一堆的jar 包。1:首先去官网Spring Dommon 和 Spring Data JPA 的包,把里面dist 的jar 包加入到工,这里是mons-1.5.0.RELEASE.jar 和spri

5、ng-data-jpa-1.3.2.RELEASE.jar 2:把Spring3.2.3 的jar 包添加到工3:JPA 的实现选用的是Hibernate4.2.0,总共还需要额外加入如下的jar:antlr-2.7.7.jar、aopalliance-1.0.jar、asm-3.2.jar、aspectjrt-1.7.1.jar、aspectjweaver- mons-beanmonmons-collections-momons-fileumons-io-2.4.jar、 commonmons-lomons-pool-1.6.jar、dom4j- 1.6.1.jar 、mons-anno i

6、ons-4.0.1.Final.jar 、hibernate-core-4.2.0.Final.jar hibernate-entitymanager-4.2.0.Final.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、javassist- 3.15.0-GA.jar、js-logging-3.1.0.GA.jar、js-tran ion-api_1.1_spec-1.0.0.Final.jar-connector-java-5.1.9.jar、slf4j-api-1.7.3.jar实体对象,就是以前的实现方式Java 代码1. 2. beans xml

7、ns=3. xmlns:xsi=4. xmlns:context=xmlns:aop=xmlns:tx=xmlns:jpa=同样需要在Spring 的配置文件中配置,基本跟使用注解的配置类似:Xml 代码ServiceTranionalpublic class Cnt Autowiredprivate UserReitory ur; 6.7. public void testAdd(UserMum) ur.save(um); 8.public sic void main(String args) ApplicationContext ctx = new ClassPathXmlApplicat

8、ionContext(applicationContext. xml);Cnt c = (Cnt)ctx.getBean(cnt);UserMum = new UserM();um.setAge(1);um.setName();um.setUuid(1); 17.18. c.testAdd(um);19. 20.21. 无需提供实现,Spring Data JPA 会为搞定一切写个逻辑层的Service,其实就相当于的客户端,用来测试Java 代码/的接口publicerface TenantReitory extends JpaReitory, JpaSp ecificationExecut

9、or ModifyingQuery(delete from SmTenant s where s.id in ?1)void deleteByIds(List id); 6. Java 代码EntityTable(name=tbl user)public claserMIdprivateeger uuid;private String name;privateeger age;/省略 getter/setter 9. .springframework./schema/beans/spring-beans-3.0.xsdg/schema/context/spring-context-3.0.xs

10、dhema/aop/sprinp-3.0.xsdema/tx/spring-tx-3.0.xsdfilter type=annoion“ expres=.springframework.stereotype.Controller/ 17. 18. 19. 20. 25. 26.bean id=entityManagerFactory 27.class=.springframework.orm.jpa.LocalContainerEntityManagerFactoryBe 31.34.bean class=.springframework.orm.jpa.vendor.HibernateJpa

11、VendorAd 36.37.property name=databasePlatform value=.hibernate.dialect.MyS 42.bean class=.springframework.orm.jpa.vendor.HibernateJpaDialect/ 49.12. rg/schema/data/jpa/spring-jpa.xsd 13. context:exclude-QL5InnoDBDialect/apter35.an16. 11. 10. 9. 8. xsi:schemaLocation=配置完成后,可以去运行Cnt 测试一下了,当然数据库和表需要先准备

12、好也可以在下面添加 filter,形如:第二章:JpaReitory 基本功能JpaReitory 的基本功能示范具体的看代码演示其中:Pageable 接口的实现类是 PageRequest,Page 接口的实现类是PageImpl。示例如下:Page p = ur.findAll(negeRequest(0,2,new Sort(new Order(Direction. DESC,uuid);System. out.prln(list=+p.getContent();第三章:JpaReitory 的查询直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:

13、60.gjt.mm.Driverjdbc:/localhost:3306/cc?useUnicode=true &;characterEncoding=UTF-8 root ;Spring Data JPA 框架在进行方法名时,会先把方法名多余的前缀截取掉,比如 find、findBy、 read、readBy、get、getBy,然后对剩下部分进行。假如创建如下的查询:findByUserDepUuid(),框架在该方法时,首先剔除 findBy,然后对剩下的属性进行,假设查询实体为Doc1:先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如

14、果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;2:从右往左截取第一个大写字母开头的字符串此处为Uuid),然后检查剩下的字符串是否为查询实体 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取最后假设user 为查询实体的一个属性;3:接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有depUuid 属性,如果有,则表示该方法最终是根据 “ Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Doc.user.dep.uuid” 的值进行查询。4:可能会存在一

15、种特殊情况,比如 Doc 包含一个 user 的属性,也有一个 userDep 属性,此时会存在。可以明确在属性之间加上 _ 以显式表达意图,比如 findByUser_DepUuid() 或者findByUserDep_uuid()特殊的参数: 还可以直接在方法的参数上加入分页或排序的参数,比如: Page findByName(String name, Pageable pageable); List findByName(String name, Sort sort);,也可以使用 JPA 的 NamedQueries,方法如下: 1:在实体类上使用NamedQuery,示例如下:Nam

16、edQuery(name = UserM.findByAge,query = select o from UserMo where o.age = ?1)2:在自己实现的的 Reitory 接口里面定义一个同名的方法,示例如下:public List findByAge(age);3:然后就可以使用了,Spring 会先找是否有同名的 NamedQuery,如果有,那么就不会按照接口定义的方法来。使用Query可以在自定义的查询方法上使用Query 来指定该方法要执行的查询语句,比如:Query(select o from UserMo where o.uuid=?1) public List

17、 findByUuidOrAge(uuid);注意:1:方法的参数个数必须和Query 里面需要的参数个数一致2:如果是 like,后面的参数需要前面或者后面加“%”,比如下面都对: Query(select o from UserMo where like ?1%) public List findByUuidOrAge(String name);Query(select o from UserMo where like %?1) public List findByUuidOrAge(String name);Query(select o from UserMo

18、 where like %?1%) public List findByUuidOrAge(String name);当然,这样在传递参数值的时候就可以不加%了,当然加了也不会错n 还可以使用Query 来指定本地查询,只要设置nativeQuery 为true,比如: Query(value=select * from tbl_user where name like %?1 ,nativeQuery=true) public List findByUuidOrAge(String name);注意:当前版本的本地查询不支持翻页和动态的排序使用命名化参数,使用Param 即可,

19、比如:Query(value=select o from UserMo where like %:nn) public List findByUuidOrAge(Param(nn) String name);同样支持更新类的Query 语句,添加Modifying 即可,比如:ModifyingQuery(value=update UserMo set =:newName where like %:nn) publicfindByUuidOrAge(Param(nn) String name,Param(newName) String newName);

20、注意:1:方法的返回值应该是,表示更新语句所影响的行数2:在调用的地方必须加事务,没有事务不能正常执行JpaReitory 的查询功能创建查询的顺序Spring Data JPA 在为接口创建对象时,如果发现同时存在多种上述情况可用,它该优先采用哪种策略呢? 提供了 query-lookup-strategy 属性,用以指定查找的顺序。它有如下三个取值: 1:create-if-not-found:如果方法通过Query 指定了查询语句,则使用该语句实现查询;如果没有 则查找是否定义了符合条件名查询,如果找到,则使用该命名查询;如果两者都没有找到,则通过解 析方法名字来创建查询。这是 quer

21、y-lookup-strategy 属性的默认值2:create:通过方法名字来创建查询。即使有符合名查询,或者方法通过 Query 指定的查询语句,都将会被忽略3:use-declared-query:如果方法通过Query 指定了查询语句,则使用该语句实现查询;如果没有,则查找是否定义了符合条件名查询,如果找到,则使用该命名查询;如果两者都没有找到,则抛出异 常第五章:Specifications 查询Spring Data JPA 支持JPA2.0 的Criteria 查询,相应的接口是JpaSpecificationExecutor。 Criteria 查询:是一种类型安全和更面象的查

22、询这个接口基本是围绕着Specification 接口来定义的, Specification 接口中只定义了如下一个方法:Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb);要理解这个方法,以及正确的使用它,就需要对JPA2.0 的Criteria 查询有一个足够的熟悉和理解,因为这个方法的参数和返回值都是JPA 标准里面定义的对象。Criteria 查询基本概念Criteria 查询是以元模型的概念为基础的,元模型是为具体持久化单元的受管实体定义的,这些实体可以是实体类,嵌入类或者的父类。Crit

23、eriaQuery 接口:代表一个specific 的顶层查询对象,它包含着查询的各个部分,比如:select 、from、where、group by、order by 等注意:CriteriaQuery 对象只对实体类型或类型的Criteria 查询起作用Root 接口:代表Criteria 查询的根对象,Criteria 查询的查询根定义了实体类型,能为将来导航获得想要的结果,它与SQL 查询中的FROM 子句类似1:Root 实例是类型化的,且定义了查询的FROM 子句中能够出现的类型。 2:查询根实例能通过传入一个实体类型给 AbstractQuery.from 方法获得。 3:Cr

24、iteria 查询,可以有多个查询根。4:AbstractQuery 是CriteriaQuery 接口的父类,它提供得到查询根的方法。CriteriaBuilder 接口:用来构建CritiaQuery 的构建器对象Predicate:一个简单或复杂的谓词类型,其实就相当于条件或者是条件组合。public claserReitoryImpl PersistenceContextprivate EntityManager em;public Page getByCondition(UserQueryMu)String hql = select o.uuid, from UserMo

25、 where 1=1 and o.uuid=:uu id;Query q = em.createQuery(hql);q.setParameter(uuid, u.getUuid();q.setResult(0);q.setMaxResults(1);Page page = negeImpl(q.getResultList(),negeReque st(0,1),3);return page; 12. 第四章:客户化扩展 JpaReitory如果你不想那么多的方法,可以自己订制自己的Reitory,还可以在自己的Reitory 里面添加自己使用的公共方法当然更灵活的是自己写一个实现类,来实现自

26、己需要的方法1:写一个与接口同名的类,加上后缀为Impl,这个面xml 里面配置过,可以自动被扫描到。这个类不需要实现任何接口。2:在接口中加入自己需要的方法,比如:public Page getByCondition(UserQueryMu); 3:在实现类中,去实现这个方法就好了,会被自动找到java 代码:Specification spec = new Specification() public Predicate toPredicate(Root root,CriteriaQuery query, CriteriaBuilder cb) Predicate p1 = cb.like

27、(root.get(name).as(String.class), %+um.get Name()+%);Predicate p2 = cb.equal(root.get(uuid).as(eger.class), um.getUu id();Predicate p3 = cb.gt(root.get(age).as(eger.class), um.getAge();也可以使用CriteriaQuery 来得到最后的Predicate,示例如下:java 代码:Specification spec = new Specification() public Predicate toPredica

28、te(Root root,CriteriaQuery query, CriteriaBuilder cb) List list = new ArrayList(); 5.if(um.getName()!=null & um.getName().trim().length()0)list.add(cb.like(root.get(name).as(String.class), %+um.getName()+%);8.if(um.getUuid()0)list.add(cb.equal(root.get(uuid).as(eger.class), um.getUuid();11.Predicate

29、 p = new Predicaist.size();return cb.and(list.toArray(p);14. 15. ;Criteria 查询基本对象的构建1:通过EntityManager 的getCriteriaBuilder 或EntityManagerFactory 的getCriteriaBuilder 方法可以得到CriteriaBuilder 对象2:通过调用CriteriaBuilder 的createQuery 或createTupleQuery 方法可以获得CriteriaQuery 的实例3:通过调用CriteriaQuery 的from 方法可以获得Root

30、 实例过滤条件1:过滤条件会被应用到SQL 语句的FROM 子句中。在criteria 查询中,查询条件通过Predicate 或Expres实例应用到CriteriaQuery 对象上。2:这些条件使用 CriteriaQuery .where 方法应用到CriteriaQuery 对象上3:CriteriaBuilder 也作为Predicate 实例的工厂,通过调用CriteriaBuilder 的条件方法( equal, notEqual, gt, ge,lt,etn,like 等)创建Predicate 对象。4:复合的Predicate 语句可以使用CriteriaBuilder

31、的and, or andnot 方法构建。构建简单的Predicate 示例:Predicate p1=cb.like(root.get(“name”).as(String.class), “%”+uqm.getName()+“%”);Predicate p2=cb.equal(root.get(uuid).as(eger.class), uqm.getUuid(); Predicate p3=cb.gt(root.get(age).as(eger.class), uqm.getAge();构建组合的Predicate 示例:Predicate p = cb.and(p3,cb.or(p1,p

32、2);当然也可以形如前面动态拼接查询语句的方式,比如:java 代码:多表联接n 多表连接查询稍微麻烦一些,下面演示一下常见的 1:M,顺带演示一下 1:1 n 使用Criteria 查询实现 1 对多的查询1:首先要添加一个实体对象DepM,并设置好UserM和它的 1 对多关系,如下:Entity Table(name=tbl user) public claserM Idprivate eger uuid; private String name; private eger age;OneToMany(mappedBy = um, fetch = FetchType. LAZY, cas

33、cade =CascadeType. ALL)private Set setDep;/省略 getter/setterEntity Table(name=tbl dep) public class DepM Idprivate eger uuid; private String name; ManyToOne()JoinColumn(name = user_id, nullable = false)/表示在 tbl_dep 里面有user_id 的字段private UserMum = new UserM();/省略 getter/setter2:配置好M及其关系后,就可以在构建Specification 的时候使用了,示例如下:Specification spec = new Specification() public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) Predicate p1 = cb.like(root.get(name).as(String.class), %+um.getName()+%); Predicate p2 = cb.equal(root.get(uuid).as(ege

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论