本文主体
- 1. 介绍什么是JPA,ORM,JPA优缺点/;
- 2. JPA CRUD;(重点掌握)
- 3. JPA的核心API认识(理解)
- 4. 配置自动生成表;(掌握)
- 5. 单表映射细节(掌握)
1. 介绍什么是JPA,ORM,JPA优缺点/;
(1)JPA Java Persistence([pəˈsɪstəns] 持久) API
Java EE 5.0 平台标准的 对象关系映射(ORM) 规范(规范就是为第三方定义标准)
对象关系映射(ORM) 规范:entity类对应一张表,一个对象一行,一个属性对应表字段
(2)ORM 对象关系映射(Object Relational Mapping,简称ORM)
是通过使用描述对象(Entity)和数据库之间映射,将面向对象语言程序中的对象自动持久化到关系数据库中。
(3) Hibernate和JPA的关系
Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级(相对于EJB这一套)的对象封装,它将POJO(就是咱们的domain)与数据库表建立映射关系,Hibernate可以自动生成SQL语句.
简单一句话:JPA是持久化规范,而Hibernate是其实现。
(3)JPA优缺点对照jdbc
jdbc:
本质:处理Java对象和关系型数据库表之间的转换
优点:操作数据库最底层,性能最高(前提是你要有相应的经验,并且是一个数据库高手)
缺点:
- 使用复杂(重复代码太多)
- 移植数据库很麻烦,改动比较多
- 性能优化得自己处理,没有提供数据的缓存,需要自己实现
- 面向sql语句操作,不是面向对象的
JPA:
本质:处理Java对象和关系型数据库表之间的转换,只是对JDBC再次做了一层封装
优点:
- 程序员操作很简单,代码简单 entityManager.persist(employee);
- 直接面向持久对象操作
- 提供世界级数据缓存(现在几乎所有的ORM框架的缓存都是学的Hibernate)
一级缓存,二级缓存,查询缓存(空间换速度)
4.数据库移植性很强,很少的修改(通过配置方言搞定)把各种数据库抽取了一个方言接口
缺点:
1.不能干预sql语句的生成
2.不适合做高要求sql语句
3.高数量不适合sql语句
2. JPA CRUD;(重点掌握)
a)增加
创建一个EMTITY实体类,
核心配置文件在wnb-mata下persistence.xml
b)抽取工具类
c)更改何删除
d)查询
3自动生成表
update没有表生成表以后 直接更改不在每次操作都生成
create每一次给你创建一个表
4核心APA
(1) EntityManagerFactory
EntityManagerFactory中应保存了对应的persistence unit中的数据库配置信息和所有实体及关系以及预定义的JPQL语句。同时,EntityManagerFactory还负 责维护二级缓存。线程安全
应用中针对一个持久化单元可以共享一个EntityManagerFactory实例。
注意:一个应用程序对应一个EntityManagerFactory:一个数据库
1.)数据库配置信息它里面有一个连接池(本身就重,创建与销毁太费时间)
2.)二级缓存(查询缓存,...)
3.)预定义的JPQL语句(JPQL,SQL)
4.)所有实体及关系
重量级对象 -> 它的创建与销毁是非常非常非常的费时费性能的
由于它如此,以后我们项目在使用过程中是不关闭的(只有项目关闭的时候才关它)
一个对象如果不能随时创建销毁,我们又要使用它,那么它就只有一个 -> 如果不设计成线程安全对象,就要出问题
(2) EntityManager(重点,掌握)
使用最广泛,类似于Hibernate的Session对象。
它提供和持久化相关的操作。增、删、改、查等。不是线程安全的,
因此,一个EntityManager对象只可以由一个线程使用。
创建与销毁不怎么费性能(可以随时创建与销毁)
一个EntityManager对象只可以由一个线程使用(后面非常有用)
一个请求,一个响应
它里面还装了一个一级缓存
(3)EntityTransaction
处理不同数据库不同表的事务管理
5单表映射
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;//主键,自动生成
@Column(length = 20, nullable = false, unique = true)
private String name;//varchar(20);不允许覆盖 唯一
private String password;
// default="25"还必须同时配置一个属性insertable ="false",表示不出现在insert语句
@Column(insertable = false, columnDefinition = "int(11) default '25'")
private Integer age = 25;
private Boolean sex;// 数据库没有布尔类型,bit对象
@Column(columnDefinition = "decimal(19,2) ")
private BigDecimal salary;// 19,2长度19保留两位小数
// update=false:一经保存就不能修改属性:身份证号码,创建时间
// 如果填错了,客户不能改,上传身份证照片,找客服,客服验证:程序员留后台hql:
// update Employee set idcart=? where id=?
// 创建时间:年月日时分秒
@Column(updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;
// 生日:年月日
@Temporal(TemporalType.DATE)
private Date birthday;
// 开会时间:时分秒
@Temporal(TemporalType.TIME)
private Date time;
// 大文本
@Lob
private String text;
// 如果name属性希望不持久化数据库
// @Transient// 临时属性
private String temp;