• 1. 第6部分 JPA第25章 JPA概述; 第26章 JPA基础应用; 第27章 使用JPA完成实体的增删改查; 第28章 使用JPA完成查询; 第29章 JPA进阶; 第30章 JPA QL; 第31章 综合实例:订单管理
  • 2. 第25章 JPA概述 教材:Java EE实用教程
  • 3. 主要内容25.1 相关概念 25.2 什么是JPA 25.3 为什么要使用JPA 25.4 如何使用JPA 25.5 如何学习JPA
  • 4. 25.1 相关概念文件 计算机中的文件用于存储各种各样的信息,使用文件存储信息的好处就是文件可以长期保存,即使把电脑关掉了,信息也不会丢失。 应用程序中的信息 程序在运行的时候会生成很多信息,这些信息是程序在运行过程中所需要的。但是当游戏结束的时候,这些信息就没有了,除非把它们存储在文件中。
  • 5. 25.1 相关概念持久操作 如果不想让程序运行过程中的信息丢失,就必须想办法保存这些信息。这些信息可以存储在文件中,也可以存储在数据库中; 把程序中的状态信息进行保存供以后使用,称为持久化。 把程序中的信息存储到文件中的方式通常适用于信息量比较少的情况,可以直接通过文件操作来完成。如果存储在XML文件中,也可以通过对XML文件进行操作的相关接口来实现。 如果信息量比较大的时候,通常使用数据库的方式来存储信息,可以使用数据库管理系统强大的管理功能。持久操作指的是对存储在数据库中的信息的操作。
  • 6. 25.1 相关概念持久提供者 JDBC,JDBC提供了应用程序与数据库之间交互的统一接口; 通过JDO进行操作; 通过标准标签库中的SQL标签; 通过O/R映射工具实现,包括Oracle的TopLink,Apache的Torque和ObjectRelationalBridge,hibernate的Hibernate。 EJB2.X实体Bean,可以把实体Bean分为BMP(Bean-Managed Persistence)实体Bean和CMP(Container Managed Persistence)实体Bean。
  • 7. 25.2 什么是JPAJPA是Java Persistence API的缩写,是Java应用通过持久提供者访问数据库的一组标准的API。 用户与数据库的交互是通过中间的持久提供者来转发的,用户首先把对数据库的操作请求提交给持久提供者,持久性提供者需要提供对该接口的实现,把请求发送给数据库,通常需要使用JDBC驱动程序,数据库管理系统执行相应的操作,然后把操作结果返回给持久提供者,持久提供者把结果再返回给用户。
  • 8. 25.2 什么是JPA
  • 9. 25.3 为什么要使用JPA25.3.1 JDBC存在的问题 大量的重复代码,参见教材例子; 不必要的SQL语句,增删改操作所使用的SQL语句格式固定,可以由系统生成; 面向对象编程与关系型数据库的矛盾,在数据库中数据是按照表格存储的,每个实体对应一条记录,而内存中每个实体表现为一个对象。
  • 10. 25.3 为什么要使用JPA25.3.2 各种持久层框架的出现及存在的问题 正是因为JDBC存在一些问题,在Java世界中出现了大量的持久层框架,这些框架对JDBC操作进行了封装,通过这些框架可以简化对数据的访问。代码与原来相比都变得简单。 但是这些框架很多,学习每一种框架都需要时间,如果能用一种通用的方式来使用这些框架就好了,这就是JPA。JPA可以让用户采用统一的方式来使用各种不同的持久层框架。
  • 11. 25.4 如何使用JPA使用JPA包括如下几个主要过程: 准备工作; 编写实体类; 编写配置文件; 使用JPA提供的接口完成对实体的操作。
  • 12. 25.4.1 准备工作数据库准备,根据需要创建数据库表以及其他对象; 准备驱动程序,持久层框架在对数据库进行操作的时候会使用JDBC驱动程序; 必要的时候配置数据源(连接池); 知道数据库的基本信息,包括:数据库的驱动程序、URL(用于定位数据库)、用户名和口令。 明确持久提供者以及获取持久提供者压缩包,最好能得到配置的例子,因为每种持久提供者可能会使用不同的属性名。
  • 13. 25.4.2 编写配置文件配置信息包括基本配置信息和映射信息: 基本配置信息通过配置文件提供; 映射信息通过在实体类中使用注释提供。 配置文件中需要提供如下信息: 持久单元的基本信息,包括持久单元名字和事务类型等。 持久性提供者,JPA仅仅是接口,需要通过持久性提供者完成持久操作。 数据库或者数据源的基本信息,这样它帮助我们完成对数据库的操作。 实体类相关信息,该持久单元包括哪些实体类。
  • 14. 1 2 6 8 9 oracle.toplink.essentials.PersistenceProvider 10 11 com.neu.entity.Book 12 13 15 17 18 19 20 21
  • 15. 25.4.3 编写实体类与普通类没有区别,属性通常与数据库中的列对应,并且属性名可以和数据库表中的列名相同。 实体类中通常需要提供对属性进行操作的set和get方法。 实体类应该提供无参数的构造方法。 实体类中必须设置主键。 实体类中可以通过注释描述实体类和表的对应关系以及属性和列的对应关系。 为了与其他普通类区分,实体类使用@Entity表示。
  • 16. 25.4.3 编写实体类定义实体类: @Entity @Table(name = "book", catalog = "entitytest", uniqueConstraints = {}) public class Book implements java.io.Serializable {
  • 17. 25.4.3 编写实体类声明属性: private String bid; private String bname; private Float price; private String author; private String press;
  • 18. 25.4.3 编写实体类提供无参数构造方法: public Book() { } public Book(String bid, String bname) { this.bid = bid; this.bname = bname; } public Book(String bid, String bname, Float price, String author, String press) { this.bid = bid; this.bname = bname; this.price = price; this.author = author; this.press = press; }
  • 19. 25.4.3 编写实体类定义主键、属性与列的对应关系 @Id @Column(name = "BID", unique = true, nullable = false, insertable = true, updatable = true, length = 13) public String getBid() { return this.bid; } set方法和get方法 public void setBid(String bid) { this.bid = bid; }
  • 20. 25.4.3 编写实体类完整的代码,参见教材。
  • 21. 25.4.4 使用JPA相关接口JPA的主要接口包括: javax.persistence.Persistence javax.persistence.EntityManagerFactory javax.persistence.EntityManager javax.persistence.Query
  • 22. 25.4.4 使用JPA相关接口Persistence类用于获取EntityManagerFactory,主要有两个方法: createEntityManagerFactory(String persistenceUnitName),创建并返回参数所指定的持久单元名字所对应的EntityManagerFactory。 createEntityManagerFactory(String persistenceUnitName,Map properties),创建并返回EntityManagerFactory,第一个参数是持久单元的名字,第二个参数是创建EntityManagerFactory所需要的属性,这些属性会覆盖其他地方设置的属性。
  • 23. 25.4.4 使用JPA相关接口EntityManagerFactory,称为实体管理器工厂,用于管理实体管理器。主要方法: createEntityManager(),创建实体管理器。 createEntityManager(Map map),根据指定的属性创建实体管理器。 close(),关闭实体管理器工厂,释放资源。 isOpen(),判断实体管理器工厂是否关闭。
  • 24. 25.4.4 使用JPA相关接口EntityManager,称为实体管理器,对实体的操作由实体管理器完成。包括实体的创建、修改、删除,并且可以创建Query对象,完成实体的查询。主要方法如下: persist(Object entity),持久化操作,相当于增加操作; remove(Object entity),删除实体; merge(T entity),修改实体; createNamedQuery(String name),根据查询语句的名字创建查询对象;
  • 25. 25.4.4 使用JPA相关接口createNativeQuery(String sqlString),根据SQL语句创建查询对象; createNativeQuery(String sqlString, Class resultClass),根据SQL语句创建查询对象,并指出结果类型; createNativeQuery(String sqlString, String resultSetMapping),根据SQL语句创建查询对象,并指出对结果如何映射; createQuery(String qlString),根据查询语句创建查询对象; find(Class entityClass, Object primaryKey),根据主键查询实体对象。
  • 26. 25.4.4 使用JPA相关接口Query接口用于管理查询,由实体管理器创建。通过Query可以对查询中的参数赋值,可以从中获取查询的结果,对实体的查询主要通过Query接口完成。Query接口的主要方法如下: getSingleResult(),得到单个查询结果; getResultList(),得到查询的结果集; executeUpdate(),执行更新或者删除操作; setMaxResults(int maxResult),设置结果集中结果的最大数量; setFirstResult(int startPosition),设置结果集中的第一条记录; setParameter方法,用于对查询中的变量赋值,有多种形式。
  • 27. 25.5 如何学习JPAJPA的学习主要包括如下几个部分: 如何配置数据库信息; 如何创建实体类,包括配置与数据库表、列的对应关系; 如何完成对实体的增删改操作; 如何完成对实体的查询; 如何处理关系; 如何进行批量处理; 如何处理安全和事务问题。
  • 28. 25.5.1数据库信息配置需要提供的配置信息包括: 数据库的位置,包括数据库所在的服务器以及DBMS所使用的端口 数据库的名字,需要指定当前应用所需要的数据库。 连接数据库所需要的用户名和口令。 连接数据库所使用的驱动程序。 通常都把这些信息写在配置文件中,主要在persistence.xml配置文件中进行。 该配置文件中还可以包含安全、事务的配置,以及当前应用包含哪些实体。
  • 29. 25.5.2 实体类的创建实体类的创建包括多个方面的问题: 类本身的创建 如何表示为实体类 如何声明与数据库表的对应关系 如何声明属性与数据库表的列之间的对应关系
  • 30. 25.5.3 实体增删改掌握如何通过JPA提供的接口完成对实体的增删改操作。 前提是需要创建实体类以及对数据源信息进行配置,而操作本身是通过JPA的几个主要接口完成的。主要是EntityManager接口的使用,需要掌握该接口的常用方法。
  • 31. 25.5.4 实体的查询需要根据各种条件进行查询,需要学习如下几个方面: 如果构造查询语句,需要使用JPA的查询语言; 如何处理查询条件,在什么地方以及如何执行查询语句,主要是Query接口的使用; 查询的结果如何处理,查询的结果可能是一个也可能是多个,如果是一个就直接修改对象的信息,如果是多个需要分别处理。也是Query接口的使用。
  • 32. 25.5.5 关系的管理在实体上使用注释@OneToOne、@OneToMany、@ManyToOne和@ManyToMany设置一对一、一对多、多对一和多对多的关系。 另外在进行JPA一个实体进行操作的时候,必须考虑对关联实体的影响。
  • 33. 25.5.6 批量处理如何构造这些批量更新或者批量删除的语句。 如何执行这些语句。
  • 34. 25.5.7安全和事务任何应用都会有安全性问题,对于持久性来说需要对数据库进行操作,不安全的操作可能会带来灾难性的后果,所以持久性的安全问题必须进行处理。 与安全相同,事务问题对于持久性来说也是非常重要的,对于数据库的操作,事务处理是不能少的,持久性处理的问题多数与数据库相关,所以事务是必须要研究的问题。 安全和事务可以采用配置的方式,也可以采用编码的方式。具体内容将在后面介绍。
  • 35. Java EE实用教程(第二版)——电子工业出版社——李绪成——http://blog.csdn.net/javaeeteacher小结25.1 相关概念 25.2 什么是JPA 25.3 为什么要使用JPA 25.4 如何使用JPA 25.5 如何学习JPA
  • 36. 谢谢!