1. 开发JPA依赖的jar文件
Hiberante核心包(8个文件)
hibernate-distribution-3.3.1.GA
---------------------------------------------
hibernate3.jar
lib\bytecode\cglib\hibernate-cglib-repack-2.1_3.jar
lib\required\*.jar
Hiberante注解包(3个文件):hibernate-annotations-3.4.0.GA
------------------------------------------------------------------------------------
hibernate-annotations.jar
lib\ejb3-persistence.jar、hibernate-commons-annotations.jar
Hibernate针对JPA的实现包(3个文件):hibernate-entitymanager-3.4.0.GA
------------------------------------------------------------------------------------------------------
hibernate-entitymanager.jar
lib\test\log4j.jar、slf4j-log4j12.jar
2. 项目的组织结构
jpa直接使用java项目即可,具体包组织结构如下
3.JPA的配置文件
JPA规范要求在类路径的META-INF目录下放置persistence.xml,文件的名称是固定的,配置模版如下:
<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.driver_class" value="org.gjt.mm.mysql.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.max_fetch_depth" value="1" />
</properties>
</persistence-unit>
</persistence>
4.单个实体对象映射的例子
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.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
/**
* Person 用户实体类
*/
@Entity
public class Person {
/** 主键 */
private int id;
/** 姓名 */
private String name;
/** 生日 */
private Date birthday;// 1987-12-10
/** 性别 */
private Gender gender = Gender.MAN;// 枚举类型(设置该列的默认值,在字段后面赋初始值)
/** 信息 */
private String info;
/** 文件 */
private Byte[] file;
/** 图片路径 */
private String imagePath;
public Person() {}
public Person(String name) {
this.name = name;
}
@Id // 注解可以放在get方法上面或字段上面
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "person_name", length = 10, nullable = false)
public String getName() {// 设置该列在数据中列名,长度,非空
return name;
}
public void setName(String name) {
this.name = name;
}
@Temporal(TemporalType.TIMESTAMP)
public Date getBirthday() {// 设置日期的格式为yyyy-MM-dd
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Enumerated(EnumType.STRING)// 取其枚举的值 @Enumerated(EnumType.ORDINAL); 取其枚举的索引
@Column(length = 5, nullable = false, unique = false)
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@Lob @Basic(fetch = FetchType.LAZY)// @Lob表示大的文本字段 @Basic(fetch=FetchType.LAZY)设置该字段是否懒加载
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Lob @Basic(fetch = FetchType.LAZY)//大的二进制字段
public Byte[] getFile() {
return file;
}
public void setFile(Byte[] file) {
this.file = file;
}
@Transient//非持久化字段(数据库中没有字段与之对应)
public String getImagePath() {
return imagePath;
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", gender=" + gender + ", birthday=" + birthday + "]";
}
}
枚举类Gender
package cn.itcast.bean;
/**
* Gender性别
*/
public enum Gender {
MAN {
public String getName() {return "男";}
}, WOMAN{
public String getName() {return "女";}
};
public abstract String getName();
}
(2)实体bean测试类PersonTest
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.Test;
import cn.itcast.bean.Gender;
import cn.itcast.bean.Person;
/**
* Person 用户实体类JPA操作单元测试类
*/
public class PersonTest {
@Test
public void testSave() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em = factory.createEntityManager();// -->SessionFactory-->session-->begin事务
em.getTransaction().begin();// 开始事务
Person person = new Person("张三");
person.setBirthday(new Date());
person.setGender(Gender.MAN);
person.setInfo("张三是一个语文老师");
person.setImagePath("/upload/user/images");
em.persist(person);
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void testSaves() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em = factory.createEntityManager();// -->SessionFactory-->session-->begin事务
em.getTransaction().begin();// 开始事务
for (int i = 0; i < 20; i++) {
Person person = new Person("张三" + i);
person.setBirthday(new Date());
person.setGender(Gender.MAN);
person.setInfo("张三是一个语文老师");
person.setImagePath("/upload/user/images");
em.persist(person);
}
em.getTransaction().commit();
em.close();
factory.close();
}
// new
// managed 托管
// 游离(脱管)
// 删除状态
@Test
public void testUpdate() {
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 testUpdate2() {
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 testUpdate3() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();// 开始事务
Person person = em.getReference(Person.class, 1);
// person.setName("王少杰111");
// em.clear();
// em.merge(person);
System.out.println("person:" + person);
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void testDelete() {
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();
}
@Test
public void testGetById() {
EntityManagerFactory fatory = Persistence.createEntityManagerFactory("itcast");
EntityManager em = fatory.createEntityManager();
Person person = em.find(Person.class, 1);// 相当于hibernate的get方法,会直接访问数据库
System.out.println(person);
em.close();
fatory.close();
}
@Test @SuppressWarnings("unchecked")
public void testGetAll() {
EntityManagerFactory fatory = Persistence.createEntityManagerFactory("itcast");
EntityManager em = fatory.createEntityManager();
Query query = em.createQuery("from Person o");
List<Person> personList = query.getResultList();
for (Person person : personList) {
System.out.println(person);
}
em.close();
fatory.close();
}
@Test
public void testUpdateQuery() {
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", "xxx");
query.setParameter("id", 3);
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void testDeleteQuery() {
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", 2);
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
@Test @SuppressWarnings("unchecked")
public void testQuery() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em = factory.createEntityManager();
Query query = em.createQuery("select o from Person o where o.id=?1");
query.setParameter(1, 2);
List<Person> persons = query.getResultList();
for (Person person : persons) {
System.out.println(person.getName());
}
em.close();
factory.close();
}
}
总结:
搭建一个jpa的开发环境过程如上述所示。首先,下载相关的第三方的开发包并解压;其次,新建一个java项目,将开发需要的jar包添加的类路径中;然后,在src目录下的META-INF目录下建立一个persistence.xml的配置文件;最后,开发只需要编写实体类和相关的单元测试类即可。其中在测试类中,需要对增改删查的api方法进行测试。