[size=xx-large]什么是JPA[/size]
[size=large]JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、Toplink、JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收现有Hibernate、Toplink、JDO等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了Spring与EJB3.0的开发团队。着眼未来几年的技术走向,JPA作为ORM领域的标准化整合者的目标应该不难实现。
JPA的总体思想和现有Hibernate、Toplink、JDO等ORM框架大体一致。总体来说,JPA包括以下3个方面的技术:[/size]
[size=x-large]ORM映射元数据[/size]
[size=large]JPA支持XML和JDK5.0注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。[/size]
[size=x-large]Java持久化API[/size]
[size=large]用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有事情,开发者可以从繁琐的JDBC和SQL代码中解脱出来。[/size]
[size=x-large]查询语言[/size]
[size=large]这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语句查询数据,避免程序的SQL语句紧密耦合。
提示:JPA不是一种新的ORM框架,它的出现只是用于规范现有的ORM技术,它不能取代现有的Hibernate、Toplink、JDO等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。
[/size]
[size=large]下面依托Hibernate做配置:[/size]
[size=large]
一、首先建立一个Java项目,名为JPA,然后将hibernate下的包导入进来(需要导入的hibernate的包在下面,可供下载),同时将数据库的驱动类导入(我这里用的是MySql,驱动类也在下面,可供下载)
二、在类的根目录下新建一个文件夹:META-INF,在META-INF中新建一个xml文件:persistence.xml,内容如下:[/size]
[size=large]三、新建一个类:Person,放在cn.itcast.bean包下,代码如下:[/size]
[size=large]在Person类中用到了枚举类型,再在该目录下新建Gender类,代码如下:[/size]
[size=large]四、测试,新建一个Junit测试类PersonTest,将其放在junit.test包下(不要忘了导入Junit的包),其代码如下:[/size]
[size=large]然后运行测试即可。[/size]
[size=large]JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、Toplink、JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收现有Hibernate、Toplink、JDO等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了Spring与EJB3.0的开发团队。着眼未来几年的技术走向,JPA作为ORM领域的标准化整合者的目标应该不难实现。
JPA的总体思想和现有Hibernate、Toplink、JDO等ORM框架大体一致。总体来说,JPA包括以下3个方面的技术:[/size]
[size=x-large]ORM映射元数据[/size]
[size=large]JPA支持XML和JDK5.0注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。[/size]
[size=x-large]Java持久化API[/size]
[size=large]用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有事情,开发者可以从繁琐的JDBC和SQL代码中解脱出来。[/size]
[size=x-large]查询语言[/size]
[size=large]这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语句查询数据,避免程序的SQL语句紧密耦合。
提示:JPA不是一种新的ORM框架,它的出现只是用于规范现有的ORM技术,它不能取代现有的Hibernate、Toplink、JDO等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。
[/size]
[size=large]下面依托Hibernate做配置:[/size]
[size=large]
一、首先建立一个Java项目,名为JPA,然后将hibernate下的包导入进来(需要导入的hibernate的包在下面,可供下载),同时将数据库的驱动类导入(我这里用的是MySql,驱动类也在下面,可供下载)
二、在类的根目录下新建一个文件夹:META-INF,在META-INF中新建一个xml文件:persistence.xml,内容如下:[/size]
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd"
version="1.0">
<persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
[size=large]三、新建一个类:Person,放在cn.itcast.bean包下,代码如下:[/size]
package cn.itcast.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.GenerationType;
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="person")//对应数据库中表的名字
public class Person {
private Integer id;
private String name;
private Date date;
private Gender gender = Gender.MAN;
private String info;
private Byte[] file;
private String imagepath;
public Person(){}
public Person(String name,Date date) {
this.name = name;
this.date = date;
}
/*
* @Id标注为该属性为主键,
* @GeneratedValue(strategy=GenerationType.AUTO)
* 标注为主键的生成方式,AUTO为根据数据库类型自动设置
*/
@Id @GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
//@Column标注了对应列的名字,长度,和是否为空
@Column(name="name",length=10,nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*
* @Temporal标注Date类型,其中Temporal.DATE为只保持日期
* Temporal.TIME 只保存时间
* TemporalType.TIMESTAMP 保存日期+时间
*/
@Temporal(TemporalType.TIMESTAMP)
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
/*
* @Enumerated 标注枚举类型
* EnumType.STRING 将string类型保存在数据库中
*/
@Enumerated(EnumType.STRING) @Column(length=5,nullable=false)
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
/*
* @Lob 标注该字段为 大文本 类型,在数据库中的类型为:longtext
*/
@Lob
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
/*
* @Lob 标注该字段为 大字节 类型,在数据库中的类型为:longblob
* @Basic(fetch=FetchType.LAZY) 标注为该属性为延迟加载,
* 这样只有当调用getFile()方法时,才会加载该属性--用于存储的较大的值(>1M)
* @Basic(fetch=FetchType.EAGER)标注为该属性为立即加载
*/
@Lob @Basic(fetch=FetchType.LAZY)
public Byte[] getFile() {
return file;
}
public void setFile(Byte[] file) {
this.file = file;
}
/*
* 如果我不希望该字段映射对应数据库表的字段:
* @Transient
*/
@Transient
public String getImagepath() {
return imagepath;
}
public void setImagepath(String imagepath) {
this.imagepath = imagepath;
}
}
[size=large]在Person类中用到了枚举类型,再在该目录下新建Gender类,代码如下:[/size]
package cn.itcast.bean;
public enum Gender {
MAN,WOMEN
}
[size=large]四、测试,新建一个Junit测试类PersonTest,将其放在junit.test包下(不要忘了导入Junit的包),其代码如下:[/size]
package junit.test;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.itcast.bean.Person;
public class PersonTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
/*
* 四种状态:新建状态,托管状态,游离状态,删除状态
* 保存为新建状态
*/
@Test public void savePerson(){
//类似于Hibernate中获取SessionFactory
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
//类似于Hibernate中获取Session
EntityManager em =factory.createEntityManager();
//打开事务
em.getTransaction().begin();
em.persist(new Person("传智播客学习",new Date()));
//提交事务
em.getTransaction().commit();
//类似于Hibernate中关闭Session
em.close();
//类似于Hibernate中关闭SessionFactory
factory.close();
}
//获取一条的方法
@Test public void getPerson(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em =factory.createEntityManager();
Person person = em.find(Person.class, 1);//get()--Hibernate中,如果找不到,则会返回null
System.out.println(person.getName());
em.close();
factory.close();
}
@Test public void getPerson2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em =factory.createEntityManager();
/*
* 该方法类似于hibernate中的load()方法,先为该对象创建一个代理对象,
* 当第一次使用数据时,才会初始化该对象,如果找不到,则会在“a”处返回一个例外
*/
Person person = em.getReference(Person.class, 1);//load()--Hibernate中
System.out.println(person.getName());//a
em.close();
factory.close();
}
//修改的方法
@Test public void updatePerson(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
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("itcast");
EntityManager em =factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.clear();//将实体管理器中所有的实体变成游离状态
person.setName("老黎活明");//游离状态
em.merge(person);
em.getTransaction().commit();
em.close();
factory.close();
}
//删除的方法
@Test public void deletePerson(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em =factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.remove(person);
em.getTransaction().commit();
em.close();
factory.close();
}
//查询所有
@SuppressWarnings("unchecked")
@Test public void getPersons(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em =factory.createEntityManager();
Query query = em.createQuery("select o from Person o");//JQL语句
List<Person> persons = query.getResultList();
for(Person person : persons)
System.out.println(person.getName());
em.close();
factory.close();
}
//通过query方法查询一条
@SuppressWarnings("unchecked")
@Test public void query(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em =factory.createEntityManager();
Query query = em.createQuery("select o from Person o where id=?1");
query.setParameter(1, 1);
//方法一:
Person person = (Person) query.getSingleResult();//类似于Hibernate中的session.uniqueResult
System.out.println(person.getName());
//方法二:
/* List<Person> persons = query.getResultList();
for(Person person : persons)
System.out.println(person.getName());*/
em.close();
factory.close();
}
// 通过query方法修改
@Test public void updateQuery(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em =factory.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("update Person o set o.name=:name where o.id=:id");
query.setParameter("name", "老李");
query.setParameter("id", 1);
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
//通过query方法删除
@Test public void deleteQuery(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em =factory.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("delete from Person o where o.id=:id");
query.setParameter("id",1);
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
}
[size=large]然后运行测试即可。[/size]