JPA介绍


JPA(Java Persistence API, java 持久化api).JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA维护一个Persistence Context(持久化上下文),在持久化上下文中维护实体的生命周期。主要包含三个方面的内容:

  1. ORM(Object-Relation-Mapping即对象关系影射技术)元数据。JPA支持annotion或xml两种形式描述对象-关系映射。

  2. 实体操作API。实现对实体对象的CRUD操作。

  3. 查询语言。约定了面向对象的查询语言JPQL(Java Persistence Query Language)

实体生命周期:

  1. New,新创建的实体对象,没有主键(identity)值

  2. Managed,对象处于Persistence Context(持久化上下文)中,被EntityManager管理

  3. Detached,对象已经游离到Persistence Context之外,进入Application Domain

  4. Removed, 实体对象被删除

EntityManager所提供管理实体对象的生命周期的方法,包括

  1. persist, 将新创建的或已删除的实体转变为Managed状态,数据存入数据库。

  2. remove,删除受控实体

  3. merge,将游离实体转变为Managed状态,数据存入数据库。

      注:  如果使用了事务管理,则事务的commit/rollback也会改变实体的状态

实体关系映射

      1 id生成策略:

          a:GeneratorType.AUTO ,由JPA自动生成

          b:GenerationType.IDENTITY,使用数据库的自增长字段,需要数据库的支持(如SQL Server、MySQL、DB2、Derby等)

          c:GenerationType.SEQUENCE,使用数据库的序列号,需要数据库的支持(如Oracle)

          d:GenerationType.TABLE,使用指定的数据库表记录ID的增长 需要定义一个TableGenerator,在@GeneratedValue中引用。例如:

  1. @TableGenerator( name="myGenerator", table="GENERATOR table", pkColumnName = "ENTITY name", pkColumnValue="MyEntity",
    valueColumnName = "PKvalue", allocationSize=1 )

  2. @GeneratedValue(strategy = GenerationType.TABLE,generator="myGenerator")

     2 关系映射

         JPA定义了one-to-one、one-to-many、many-to-one、many-to-many 4种关系

查询   

  JPA提供两种查询方式,一种是根据主键查询,使用EntityManager的find方法:T find(Class entityClass, Object primaryKey)

 另一种就是使用JPQL查询语言。JPQL是完全面向对象的,具备继承、多态和关联等特性,和hibernate HQL很相似。

  使用EntityManager的createQuery方法:Query createQuery(String ql)

JPQL  

1使用参数:

可以在JPQL语句中使用参数。JPQL支持命名参数位置参数两种参数,但是在一条JPQL语句中所有的参数只能使用同一种类型。

举例如下:

  命名参数:Query query = e.createQuery("select e from Entity e  where e.id=:Id"); query.setParameter("Id",new Integer(1));

 位置参数:Query query = e.createQuery("select e from Entity e where e.id=?1"); query.setParameter(1,new Integer(1));

2 命名查询:

如果某个JPQL语句需要在多个地方使用,还可以使用@NamedQuery 或者 @NamedQueries在实体对象上预定义命名查询。

在需要调用的地方只要引用该查询的名字即可。

例如:

@NamedQuery(name="getEntity", query= "FROM Entity WHERE id=?1")

@NamedQueries({ @NamedQuery(name="getPerson1", query= "FROM Entity WHERE id=?1"), @NamedQuery(name="getPersonList", query= "FROM Entity WHERE age>?1") })

Query query = em.createNamedQuery("getEntity");

3 排序:

JPQL也支持排序,类似于SQL中的语法。例如: Query query = em.createQuery("select e from Entity e order by e.age, e.birthday desc");

4 聚合查询:

JPQL支持AVG、SUM、COUNT、MAX、MIN五个聚合函数。例如:

Query query = em.createQuery("select max(e.age) from Entity e"); Object result = query.getSingleResult(); String maxAge = result.toString();

5 更新和删除:

JPQL不仅用于查询,还可以用于批量更新和删除。如:

Query query = em.createQuery("update Order as o set o.amount=o.amount+10"); //update 的记录数 int result = query.executeUpdate();

Query query = em.createQuery("delete from OrderItem item where item.order in(from Order as o where o.amount<100)"); query.executeUpdate();

query = em.createQuery("delete from Order as o where o.amount<100"); query.executeUpdate();//delete的记录数




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值