• 1.         JPA 简介
  • 2. 主要内容 JPA概述 使用JPA的步骤 实体 JPA的API JPQL
  • 3. 主要内容 JPA概述 使用JPA的步骤 实体 JPA的API JPQL
  • 4. JPA概述 JPA是什么 JPA的产生 为什么要使用JPA JPA和Hibernate的关系 JPA的供应商 JPA的实现 JPA的优势 JPA的缺点 JPA主要的技术
  • 5. 一、JPA概述—JPA 是什么Java Persistence API,用于对象持久化的API 是Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层
  • 6. 一、JPA概述—JPA 是什么JPA 是EJB3 Entity Bean,是一套从EJB3.0核心标准中分离出来的独立的标准文档 J2EE 4规范中最为人所熟悉的用来处理数据持久的Entity Bean, 在Java EE5中被推到重来,取而代之的是java开发的通用持久化规范Java Persistence API 1.0, 其实就是完全重新定义了的Entity Bean规范; JPA作为java中负责关系数据持久化的组件已经完全独立出来成为一个单独的规范,而不再属于Enterprise Java Bean的范畴 (EJB更多的是指Stateless/Stateful session bean和Message Driven Bean)。 使用的 Java 的版本决定了实际是否可以应用 JPA。 因为JPA 是 EJB 3.0 规范的一部分,而EJB 3.0 规范是 Java EE 5 版本的一部分。如果您未更新到 Java EE 5,则无法使用 JPA。     
  • 7. 一、JPA概述—JPA 是什么提供了以pojo编程模型为持久化对象的机制:通过 JDK 5.0 注解或 XML 描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,下图描述了 JPA 的结构:     
  • 8. 一、JPA概述—JPA的产生Sun引入新的 JPA ORM规范出于两个原因: 其一,简化现有Java EE和 Java SE应用的对象持久化的开发工作: 和实体Bean相比,不需要配置文件,提供了更好的开发体验 不同于 EJB 3.0,JPA并不是J2EE环境专用,在J2SE的环境中也可以使用(不依赖J2EE容器,是java中的通用API) 其二,Sun希望整合ORM技术,统一各种ORM框架的规范,实现天下归一。 (目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现)
  • 9. 一、JPA概述—为什么要使用JPA
  • 10. 一、JPA概述—JPA和Hibernate的关系JPA是hibernate的一个抽象或者可以理解为接口(就像JDBC和JDBC驱动的关系): JPA是规范:JPA本质上就是一种ORM规范,不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由用用服务器厂商来提供实现 Hibernate 是实现:Hibernate除了作为ORM框架之外,它也是一种JPA实现 从功能上来说, JPA现在就是Hibernate功能的一个子集
  • 11. 一、JPA概述—JPA的供应商 JPA 的目标之一是制定一个可以由很多供应商实现的API,目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现 Hibernate JPA的始作俑者就是Hibernate的作者 Hibernate 从3.2开始,就开始兼容JPA OpenJPA OpenJPA 是 Apache 组织提供的开源项目 TopLink TopLink以前需要收费,如今开源了; OpenJPA虽然免费,但功能、性能、普及性等方面更加需要加大力度。
  • 12. 一、JPA概述—JPA的实现 JPA做为Java EE5里面的新成员,跟jdbc一样就是一接口,具体实现由服务器实现 你选择什么服务器就基本上决定了用哪个JPA实现 JBoss就是用hibernate去实现的 weblogic是用OpenJPA Oracle是用TopLink
  • 13. 一、JPA概述—JPA的优势标准化 提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能 够在不同的JPA框架下运行。越来越多的提供商期待在不久的将来提供 JPA 实施。 对容器级特性的支持 JPA 框架中支持大数据集、事务、并发等容器级事务 简单易用,集成方便   JPA的主要目标之一就是提供更加简单的编程模型,在JPA框架下创建实体和创建Java 类一样简单,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单, 可媲美JDBC的查询能力 JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。 支持面向对象的高级特性 JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,最大限度的使用面向对象的模型
  • 14. 一、JPA概述—JPA的缺点 由于非常新,JPA 规范可能还需要进过重要发展才会变得很稳定。 JPA是一个规范而不是一个产品。 需要提供商提供一个实施,才能获得这些基于标准的 API 的优势。 JPA是Hibernate、TopLink,JDO等ORM框架真子集,只提供其中最好的功能,如果应用程序中需要的功能,但是规范中没有提供的功能,则使用供应商特有的API ,移植起来比较麻烦,所以要尽可能地使用JPA API。
  • 15. 一、JPA概述—JPA包括 3方面的技术 ORM映射元数据:JPA支持XML和 JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。 JPA的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的 JDBC和 SQL代码中解脱出来。 查询语言:这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的 SQL语句紧密耦合。
  • 16. 主要内容 JPA概述 使用JPA的步骤 实体 JPA的API JPQL
  • 17. 二、使用JPA持久化对象的步骤 创建persistence.xml,在这个文件中配置持久化单元(Hibernate中的hibernate.cfg.xml);; 需要指定跟哪个数据库进行交互; 需要指定JPA使用哪个持久化的框架;(因为他本身没有持久化能力); 创建EntityManagerFactory(Hibernate中的SessionFactory); 创建EntityManager(实体管理器)(Hibernate中的Session); 创建实体类,使用annotation来描述实体类跟数据库表之间的一一映射关系. 使用JPA API完成数据增加、删除、修改和查询操作
  • 18. JPA的执行过程
  • 19. persistence.xml
  • 20. 持久化单元 持久化单元 :persistence-unit 数据库相关的信息 持久化提供者信息(Hibernate、Toplink…) 厂商的一些客户化属性 其他可选的一些元数据 如果使用不同的持久化提供程序,那么需要指定提供程序类 附加的ORM映射文件 附加的ORM映射文件 附加实体的JAR文件 一个持久化单元可以创建一个EntityManagerFactory
  • 21. 持久化提供者 Persistence Provider:持久化提供者 JPA只是一套标准的持久化API,它需要通过一个ORM框架,才能进行持久化,我们把这个能和JPA集成起来的ORM框架称为持久化的提供者; 每一个支持ebj3.0 JPA的ORM框架必须提供一个实现javax.persistence.spi.PersistenceProvider接口的实现类,通过它创建EntityManager对象
  • 22. 使用JPA实现增加、删除、修改和查询操作
  • 23. EntityManagerFactory 实体管理器的工厂,类似于Hibernate 中的SessionFactory 通过持久化提供者Persistence Provider创建这个对象应用程序管理 用来创建EntityManager实例 一个数据库创建一个EntityManagerFactory对象
  • 24. EntityManager 实体管理器,类似于Hibernate的Session 由EntityManagerFacotry创建 用来访问持久化上下文中实体对象的一个接口,管理实体对象与底层数据源之间进行O/R映射,包括增删改查 一个线程一个EntityManager对象,
  • 25. EntityManager 获取EntityManager对象的方式 应用程序管理EntityManager 应用程序通过javax.persistence.EntityManagerFactory的createEntityManager创建EntityManager实例 容器管理EntityManager 通过依赖注入获取
  • 26. Persistence Context:持久化上下文其实就是JPA的一级缓存 是一系列实体的管理环境,实体对象集合 被EntityManager管理着的,通过EntityManager和持久化上下文进行交互。 持久化上下文类型 应用程序管理 应用程序来管理所需资源 持久化上下文是绑定到当前EntityManager 容器管理,又分为两种: 和事务范围相关持久化上下文 事务启动就会创建,事务结束也会结束; 在无状态session bean中使用; 扩展的持久化上下文 和有状态session bean结合使用,它的生命周期和事务无关; 当Session bean对象创建,持久化上下文就创建; 当Session bean对象销毁,持久化上下文就结束
  • 27. JPA的使用步骤
  • 28. JPA的使用步骤
  • 29. JPA的使用步骤
  • 30. 主要内容 JPA概述 使用JPA的步骤 实体 JPA的API JPQL
  • 31. 三、实体
  • 32. 三、实体
  • 33. 三、实体
  • 34. 三、实体
  • 35. 三、实体—实体的定义 实体具备以下的条件: 必须使用 javax.persistence.Entity注解或者在 XML映射文件中有对应的元素; 必须具有一个不带参的构造函数, 类不能声明为final, 方法和需要持久化的属性也不能声明为 final; 如果游离状的实体对象需要以值的方式进行传递,如通Session bean的远程业务接口传递,则必须实现 Serializable接口; 需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访问。
  • 36. 三、实体—Annotation —基本注解 基本注解 @Entity 将对象标注为一个实体,表示需要保存到数据库中 默认情况下类名即为表名,通过name属性显式指定表名 @Id 对应的属性是表的主键 @GeneratedValue 主键的产生策略,通过strategy属性指定; 默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略可供选择的策略 IDENTITY:表自增键字段(SqlServer对应策略,Oracle不支持这种方式) AUTO: JPA自动选择合适的策略,是默认选项(MySql对应策略); SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名(如Oracle的Sequence, MySql不支持这种方式); TABLE:通过表产生主键,使用该策略可以使应用更易于数据库移植。不同的 JPA实现商生成的表名是不同的。
  • 37. 三、实体—Annotation —基本注解 基本注解 @EmbeddedId或@IdClass 组合关键字 @Column 属性对应的表字段
  • 38. 三、实体—Annotation —继承关系 继承关系:  对于继承的实体,在 javax.persistence.InheritanceType定义了3种映射策略 SINGLE_TABLE 父子类都保存到同一个表中,通过字段值进行区分。 JOINED 父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连接获取完整数据。 TABLE_PER_CLASS 每一个类对应自己的表(一般不推荐采用这种方式)。
  • 39. 三、实体—Annotation —关联关系关联关系: @OneToOne @OneToMany @ManyToOne @ManyToMany
  • 40. 主要内容 JPA概述 使用JPA的步骤 实体 JPA的API JPQL
  • 41. 四、 JPA的API下面是 EntityManager的一些主要的接口方法 void persist(Object entity) 新实体实例将转换为受控状态 void remove(Object entity) 删除某个实体对象,也就是删除数据库中某条记录 void flush() 将受控态的实体数据同步到数据库中 T merge(T entity) 游离态的实体持久化到数据库中,并转换为受控态的实体 T find(Class entityClass, Object primaryKey) 以主键查询实体对象,entityClass是实体的类,primaryKey是主键值
  • 42. 四、 JPA的API--修改
  • 43. 四、 JPA的API--删除
  • 44. JPA的生命周期
  • 45. 实体的状态新建态new 新创建的实体对象,尚未拥有持久化主键,没有和一个持久化上下文关联起来 受控态managed 已经拥有持久化主键并和持久化上下文建立了联系 游离态detached 拥有持久化主键,但尚未和持久化上下文建立联系 删除态removed 拥有持久化主键,已经和持久化上下文建立联系,但已经被安排从数据库中删除
  • 46. 主要内容 JPA概述 使用JPA的步骤 实体 JPA的API JPQL
  • 47. 五、 JPQL Java Persistence Query Language(Java持久化查询语言) 是一种可移植的查询语言,可以被编译成所有主流数据库服务器上的SQL JPQL是面向对象的,通过面向对象而非面向数据库的查询语言查询数据,在Java空间对类和对象进行操作,避免程序的SQL语句紧密耦合 使用 javax.persistence.Query接口代表一个查询实例
  • 48. 五、 JPQL—创建Query实例 通过EntityManager来生成Query实例: EntityManager提供的使用JPQL(或原生SQL)创建Query的方法:
  • 49. 五、 JPQL—使用Query接口Query接口执行数据查询的部分方法: getSingleResult():单一查询结果 getResultList():多个查询结果 setParameter: Query setParameter(int position, Object value):通过参数位置号绑定查询语句中的参数 Query setParameter(String name, Object value):绑定命名参数 setMaxResults:设置返回的最大结果数 executeUpdate:新增、删除或更改的语句,通过该方法执行
  • 50. Query
  • 51. Query
  • 52. 五、 JPQL JPQL支持三种语句类型,可以在查询中使用JPQL执行选择、更新、删除操作: 定义和使用Select:
  • 53. 五、 JPQL--条件表达式和操作
  • 54. 五、 JPQL--使用JPQL函数 字符串函数
  • 55. 五、 JPQL--使用JPQL函数 算术函数 时间函数
  • 56. 五、 JPQL--投影
  • 57. 五、 JPQL 使用聚合: 聚合函数:AVG、COUNT、MAX、MIN和SUM 通过GROUP BY和HAVING分组 排序:ORDER BY 使用子查询 可以在WHERE和HAVING子句中使用子查询,EJB3.1的FROM子句中不支持; 可以在子查询中使用IN、EXISTS、ALL、ANY和SOME 联接实体 关联联结:INNER JOIN 外联结:LEFT JOIN或LEFT OUTER JOIN 获取联结:JOIN FETCH
  • 58. 五、 JPQL-- Update和Delete 大数据量的更新、删除,可以用 EntityManager进行实体的更新操作,也可以通过查询语言执行数据表的字段更新,记录删除的操作 UPDATE PollOption p SET p.optionItem = :value WHERE p.optionId = :optionId DELETE FROM PollOption p WHERE p.optionId = :optioned
  • 59. Q&A