JPA概述
什么是JPA
1. JPA:(Java Persistence API)用于对象持久化的API。
2. 作用:提供了标准的ORM规范,使得应用程序以统一的方式访问持久层。
JPA与Hibernate的关系
1. PA 是 hibernate 的一个抽象(就像JDBC和JDBC驱动的关系)
1) JPA 是规范:JPA 本质上就是一种 ORM 规范,不是ORM 框架 —— 因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由 ORM 厂商提供实现
2) Hibernate 是实现:Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现
2. 从功能上来说, JPA 是 Hibernate 功能的一个子集
JPA技术内容
1. ORM 映射元数据:JPA 支持XML 和 JDK 5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
2. JPA 的 API:用来操作实体对象,执行CRUD操作,框架在后台完成所有的事情,开发者从繁琐的JDBC和 SQL代码中解脱出来。
3. 查询语言(JPQL):这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序和具体的 SQL 紧密耦合
JPA基本使用方法
1.创建JPA工程
2.导入JPA底层依赖的实现类的包及数据库驱动包
3. 配置JPA的配置文件persistence.xml
1) persistence.xml文件必须在META-INF目录下,且文件名称固定。
2) 配置内容如下:
4. 创建持久化类
1) 需要指定实体化类所对应的表。
2) 表中的主键,及主键增长方式。
3) 也可也可以指定属性所对应表中的列名称,不指定列名称默认与属性名相同。
5. 实现持久化操作
1) 创建EntityManagerFactory对象
String persistenceUnitName = "jpa-1";
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
2) 创建EntityManager对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
3) 开启事务
EntityTransaction transaction =entityManager.getTransaction();
transaction.begin();
4) 持久化操作
entityManger.persist(customer);
5) 提交事务
entityTransaction.commit();
6) 关闭
entityManger.close();
entityMangerFactory.close();
小结
1. 创建persistence.xml, 在这个文件中配置持久化单元
1) 需要指定跟哪个数据库进行交互;
2) 需要指定 JPA 使用哪个持久化的框架以及配置该框架的基本属性
2. 创建实体类, 使用 annotation 来描述实体类跟数据库表之间的映射关系.
3. 使用 JPA API 完成数据增加、删除、修改和查询操作
1) 创建EntityManagerFactory (对应 Hibernate 中的SessionFactory);
2) 创建 EntityManager(对应 Hibernate 中的Session);
JPA基本注解
@Entity
作用:@Entity标注用于实体类声明语句之前,指出该Java类我实体类,将映射到指定的数据库表。
@Table
1. 作用:该标注与@Entity标注并列使用,用于指定实体类对象所对应的表名称。
1) Name属性:用于指明数据库的表名称。
2) Catalog和schema属性:用于设置表所属的数据库目录或模式,通常为数据库名。
2. @Table可省略,生成的表名与实体类名称相同。
@Id
1. 作用:用于声明一个实体类的属性映射为数据库的主键列。
2. 位置:置于属性的getter方法之前。
@GeneratedValue
1. 作用:用于标注主键的生成策略,通过strategy属性指定。在默认情况下,自动选择一个最合适底层数据库的主键生成策略。
1) IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式。
2) AUTO: JPA自动选择合适的策略,是默认选项。
3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql 不支持这种方式
4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
@Basic
1. 作用:表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的 getXxxx()方法,默认即为@Basic。
1) fetch: 表示该属性的读取策略,有 EAGER 和 LAZY 两种,分别表示主支抓取和延迟加载,默认为 EAGER。
2) optional:表示该属性是否允许为null, 默认为true
@Column
1. 作用:为实体类的属性设置其映射的数据库表的列名称。省略不写属性名=列名称。
1) Name:用于设置映射数据库表的列名。此外,该标注还包含其它多个属性,如:unique 、nullable、length 等。
2) columnDefinition:表示该字段在数据库中的实际类型。通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型。
a) 对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP.。
b) String的默认映射类型为VARCHAR, 如果要将 String 类型映射到特定数据库的 BLOB 或TEXT 字段类型
2. 位置:置于属性的getter方法之前。
@Transient
1. 作用:表示所标注的属性不映射为表中的列。
@Temporal
1. 作用:在核心的 Java API中并没有定义 Date 类型的精度(temporal precision). 而在数据库中,表示 Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者两者 兼备).在进行属性映射时可使用@Temporal注解来调整精度。