Jpa入門

本文主体

  • 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) HibernateJPA的关系

  Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级(相对于EJB这一套)的对象封装,它将POJO(就是咱们的domain)与数据库表建立映射关系,Hibernate可以自动生成SQL语句.

简单一句话:JPA是持久化规范,而Hibernate是其实现。

(3)JPA优缺点对照jdbc

jdbc:

本质:处理Java对象和关系型数据库表之间的转换

优点:操作数据库最底层,性能最高(前提是你要有相应的经验,并且是一个数据库高手)

缺点:

  1. 使用复杂(重复代码太多)
  2. 移植数据库很麻烦,改动比较多
  3. 性能优化得自己处理,没有提供数据的缓存,需要自己实现
  4. 面向sql语句操作,不是面向对象的

 JPA:

本质:处理Java对象和关系型数据库表之间的转换,只是对JDBC再次做了一层封装

优点:

  1. 程序员操作很简单,代码简单 entityManager.persist(employee);
  2. 直接面向持久对象操作
  3. 提供世界级数据缓存(现在几乎所有的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(重点,掌握)

使用最广泛,类似于HibernateSession对象。

它提供和持久化相关的操作。增、删、改、查等。不是线程安全的,

因此,一个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;

 

原文地址:https://www.cnblogs.com/13438145925xiaozheng/p/11234979.html