JPA快速入门 - 环境搭建

来源:互联网 发布:书签淘宝 编辑:程序博客网 时间:2024/04/30 15:35

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.单个实体对象映射的例子

(1)实体类Person
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 用户实体类 */@Entitypublic 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;}@Overridepublic 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 {@Testpublic 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();}@Testpublic 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 托管// 游离(脱管)// 删除状态@Testpublic 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();}@Testpublic 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();}@Testpublic 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();}@Testpublic 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();}@Testpublic 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();}@Testpublic 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();}@Testpublic 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方法进行测试。

0 0
原创粉丝点击