JPA入门

JPA介绍
JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。

JPA和Hibernate的关系
1.JPA 是规范:JPA 本质上就是一种 ORM 规范
2.Hibernate 是实现:Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现

JPA入门_第1张图片
image.png

ORM映射文件之前使用的是配置方式,这里可以通过JPA规范,把ORM映射使用注解来替代。

Hibernate的注解方式(HibernateJPA)

JPA 的供应商
1.Hibernate
2.OpenJPA
3.TopLink

JPA入门_第2张图片
image.png

JPA特点:
1.标准化:
2.简单易用
3.媲美JDBC
4.支持面向对象

开发流程:
第一步:创建Web项目,导入依赖
必须创建Web项目

同时放入jpa模板文件

JPA入门_第3张图片
image.png

第二步:配置JPA核心配置文件
创建JPA的核心配置文件

核心配置persistence.xml(名称是固定的), 在这个文件中配置持久化单元
1.JPA 规范要求目录结构:在META-INF中

  2.需要指定 JPA 使用哪个持久化的框架以及配置该框架的基本属性
    a)需要指定跟哪个数据库进行交互;
    b)指定方言等扩展属性
image.png
JPA入门_第4张图片
image.png

配置文件:
代码:


xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">


    
    org.hibernate.jpa.HibernatePersistenceProvider
    
    com.qf.pojo.JavaPhone
    
    
        
        
        
        
        
        
        
        
        
    
  

注意节点位置:


JPA入门_第5张图片
image.png

第三步:创建实体类和映射的注解
创建实体类, 使用 annotation 来描述实体类跟数据库表之间的映射关系.
JPA 基本注解:
1.@Entity 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。
2.@Table 映射表格
a)常和@Entity配合使用。
b)Name可选,表示表的名称,默认表名和实体名一致。
3.@Id 映射生成主键:通常置于属性声明语句之前,也可置于属性的getter方法之前。必须有,定义了映射到数据库表的主键属性
4.@GeneratedValue 用于标注主键的生成策略,通过 strategy 属性指定。
(strategy=GenerationType.AUTO)主键策略:
a)IDENTITY:采用数据库 ID自增长的方式来自增主键字段
b)AUTO: JPA自动选择合适的策略,是默认选项;
c)SEQUENCE:通过序列产生主键

  1. @Column 映射表格列 (可选):常用属性是 name,用于设置映射数据库表的列名。

表和类的关联


JPA入门_第6张图片
image.png

@Entity //声明当前类为hibernate映射到数据库中的实体类
@Table(name="qf_user") //声明在数据库中自动生成的表名

行和对象的关联
OID,在主键


JPA入门_第7张图片
image.png

@Id //声明此列为主键

字段和属性的关联


JPA入门_第8张图片
image.png

代码:
@Entity
@Table(name = "my_computer")
public class MyComputer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long comId;//主键策略
@Column(name = "com_name")
private String comName;// 属性映射
@Column(name = "com_desc")
private String comDesc;

public Long getComId() {
return comId;
}

public void setComId(Long comId) {
this.comId = comId;
}

public String getComName() {
return comName;
}

public void setComName(String comName) {
this.comName = comName;
}

public String getComDesc() {
return comDesc;
}

public void setComDesc(String comDesc) {
this.comDesc = comDesc;
}
}

注册实体别忘记:


JPA入门_第9张图片
image.png

第四步:开发DAO测试
初始化表测试:

public void initTable(){
//加载配置,得到工厂
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
entityManagerFactory.close();
}

观察控制台的输出如下所示:

create table my_computer (
comId bigint not null auto_increment,
com_desc varchar(255),
com_name varchar(255),
primary key (comId)
) engine=InnoDB

是核心配置文件中的持久化单元名称


JPA入门_第10张图片
image.png

添加测试:
public void addCom(){
//第一步:加载配置,得到工厂
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
//第二步:得到实体管理对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
//第三步:开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//第四步:操作数据
MyComputer pojo = new MyComputer();
pojo.setComName("联想");
pojo.setComDesc("支持国产");
entityManager.persist(pojo);
//第五步:提交事务
transaction.commit();
//第六步:关闭链接
entityManager.close();
entityManagerFactory.close();
}

JPA入门_第11张图片
image.png

完成CRUD(persist, find, merge, remove)

public class MyComputerDAO {

public void initTable(){
//加载配置,得到工厂
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
entityManagerFactory.close();
}

public void addCom(){
//第一步:加载配置,得到工厂
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
//第二步:得到实体管理对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
//第三步:开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//第四步:操作数据
MyComputer pojo = new MyComputer();
pojo.setComName("联想");
pojo.setComDesc("支持国产");
entityManager.persist(pojo);
//第五步:提交事务
transaction.commit();
//第六步:关闭链接
entityManager.close();
entityManagerFactory.close();
}

public void findById(Long cid){
EntityManager entityManager = JPAUtils.getEntityManager();
MyComputer myComputer = entityManager.find(MyComputer.class, cid);
System.out.println(myComputer.getComName()+"\t"+myComputer.getComDesc());
entityManager.close();
}

public void updateCom(){
EntityManager entityManager = JPAUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();

  MyComputer myComputer = entityManager.find(MyComputer.class, 1L);
  myComputer.setComDesc("中国梦");
  entityManager.merge(myComputer);

  transaction.commit();
  entityManager.close();

}

public void del(){
EntityManager entityManager = JPAUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
MyComputer myComputer = entityManager.find(MyComputer.class, 1L);
entityManager.remove(myComputer);
transaction.commit();
entityManager.close();
}

public static void main(String[] args) {
MyComputerDAO dao = new MyComputerDAO();
// dao.initTable();
// dao.addCom();
// dao.findById(1L);
// dao.updateCom();
dao.del();
}

}
可以将上面重复的代码抽象成单例的工具类

注意:删除必须在同样一个实体管理对象中才可以,一个entityManager查,一个新entityManager删除会失败。

测试:


JPA入门_第12张图片
image.png
JPA入门_第13张图片
image.png

跨Session不在同样一个事务中。
bug:


JPA入门_第14张图片
image.png

你可能感兴趣的:(JPA入门)