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

JPA是一套规范,不是某个ORM产品,它主要包括以下3方面的技术:

    1. ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
    2. Java持久化API:用来操作实体对象,执行CRUD操作
    3. 查询语言:JPQL。通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

@Entity用来标注实体

@Table用来指定实体对应的表名

@Id用来标注实体的标示,即主键。@GeneratedValue用来标注主键的生成方式。主要有以下几种:
     * GenerationType.AUTO---由ORM产品根据数据库方言决定--AUTO是默认值,可以省略,即@Id @GeneratedValue
     * GenerationType.IDENTITY---常用于Mysql、Sqlserver
     * GenerationType.SEQUENCE---常用于Oracle
     * GenerationType.TABLE--通用,但是效率不高

@Column标注实体的属性,对应数据库表中的字段,包括length,name,nullable等设置

@Temporal标注时间类型的属性,@Temporal(TemporalType.DATE),@Temporal(TemporalType.TIME),@Temporal(TemporalType.TIMESTAMP)

@Enumerated标注索引,包括@Enumerated(EnumType.ORDINAL)//保存枚举的索引值,@Enumerated(EnumType.STRING) //保存枚举的字面值(而非索引值)

@Lob //对应数据库大文本字段,还可以保存文件

@Transient //表示不与数据库映射

实例说明:

package com.yl.demo1.bean;

import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient; @Entity
@Table(name="t_person") public class Person { private Integer id;
private String name;
private Date birthday;//日期类型
private Sex sex = Sex.MAN;//枚举类型,并设置默认值
private String info;
private String notinvoke;//不希望映射到数据库的字段
private Byte[] bigfile; public Person(){} public Person(String name) {
this.name = name;
}
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=10, nullable=false, name="personName")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Temporal(TemporalType.DATE)
public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Enumerated(EnumType.STRING) //保存枚举的字面值(而非索引值)
@Column(length=5, nullable=false)
public Sex getSex() {
return sex;
} public void setSex(Sex sex) {
this.sex = sex;
}
@Lob //对应数据库大文本字段,还可以保存文件
public String getInfo() {
return info;
} public void setInfo(String info) {
this.info = info;
} @Transient //表示不与数据库映射
public String getNotinvoke() {
return notinvoke;
} public void setNotinvoke(String notinvoke) {
this.notinvoke = notinvoke;
}
/***
* FetchType.EAGER---立即加载
* FetchType.LAZY----延迟加载,没有访问get方法时不会加载
*/
@Lob @Basic(fetch=FetchType.EAGER)
public Byte[] getBigfile() {
return bigfile;
} public void setBigfile(Byte[] bigfile) {
this.bigfile = bigfile;
} }

上面类中用到的枚举

public enum Sex {
MAN, WOMAN
}

对实体的各种操作行为,包括保存,查询,更新,删除等。

 @Test public void save() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Person p = new Person("老子");
em.persist(p);
em.getTransaction().commit();
em.close();
factory.close();
} @Test public void getPerson() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 1);//相当于hibernate的get方法
/**
* 这里执行了一个占时较长的任务时,其他部分可能修改了数据库中的对象,如果下面想要继续使用这个对象,可以使用refresh方法获取最新的数据
*此时调用查询方法只能是在EntityManager的一级缓存中获取刚才查询到的数据,无法获取最新的数据
*/
em.refresh(person);
System.out.println(person.getName());
em.close();
factory.close();
} @Test public void getPerson2() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager(); Person person = em.getReference(Person.class, 1);//相当于hibernate的load方法,延迟加载
System.out.println(person.getName()); em.close();
//System.out.println(person.getName());//获取出错
factory.close();
}
/**实体的状态
* new
* 托管
* 游离
* 删除
*
*/ @Test public void updatePerson() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Person person = em.find(Person.class, 1);
person.setName("孔子");
em.getTransaction().commit();
em.close();
factory.close();
} @Test public void updatePerson2() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 1);
em.clear();//把实体管理器中的所有实体变成游离状态
person.setName("lao jia");
em.merge(person);//把游离状态的实体同步到实体管理器
em.close();
//person.getName();//此时无法查询到数据
factory.close();
} @Test public void deletePerson() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Person person = em.find(Person.class, 1);
em.remove(person);
em.getTransaction().commit();
em.close();
factory.close();
} @Test public void query() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
Query query = em.createQuery("select o from Person o where o.id = ?1");//?后指定参数的索引
query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
Person person = (Person) query.getSingleResult();
System.out.println(person.getName());
em.close();
factory.close();
} @Test public void deleteQuery() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Query query = em.createQuery("delete from Person o where o.id = ?1");//?后指定参数的索引
query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
} @Test public void updateQuery() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Query query = em.createQuery("update Person o set o.name = :name and o.id = :id");//?后指定参数的索引
query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}

最新文章

  1. jQuery省市区三级联动插件
  2. PHP的几个常用加密函数
  3. 安卓 NEXUS6 修改分辨率,density
  4. Puppet安装与配置简介(附视频教程)
  5. Android or iOS 运行 meteor App 屏幕一片空白 White screen的解决方法
  6. 最好最实用的PHP二次开发教程
  7. SimpleHttpServer的学习之UML
  8. 24篇Delphi文件操作文章
  9. HDU 2639 (01背包第k优解)
  10. ServiceStack 入门(一)
  11. 写一个MyList
  12. R语言快速深度学习进行回归预测(转)
  13. url重定向或者重写
  14. C#7.0中的解构功能---Deconstruct
  15. 关于kubernetes使用私有仓库一点说明
  16. 【php】php实现数组分块
  17. 如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)
  18. Hadoop生态圈-大数据生态体系快速入门篇
  19. 关系型数据库之Mysql
  20. 铁乐学python_day28_模块学习3

热门文章

  1. 纯CSS实现多选组件
  2. pdf增加水印
  3. 解决.net定时器在iis7上不执行问题
  4. Hibernate从入门到精通(七)多对一单向关联映射
  5. mysql建表且某字段内不允许出现重复值
  6. MSMQ(消息队列)续
  7. 【搜索】BZOJ 3990: 【Sdoi 2015】排序
  8. ppshu
  9. Flume学习——BasicChannelSemantics
  10. 微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同。