`
LC2586
  • 浏览: 25294 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JPA学习总结(一)--JPA的配置以及对数据库的操作

阅读更多
什么是JPA
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个方面的技术:


ORM映射元数据
JPA支持XML和JDK5.0注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

Java持久化API
用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有事情,开发者可以从繁琐的JDBC和SQL代码中解脱出来。
查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语句查询数据,避免程序的SQL语句紧密耦合。
提示:JPA不是一种新的ORM框架,它的出现只是用于规范现有的ORM技术,它不能取代现有的Hibernate、Toplink、JDO等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。


下面依托Hibernate做配置:

一、首先建立一个Java项目,名为JPA,然后将hibernate下的包导入进来(需要导入的hibernate的包在下面,可供下载),同时将数据库的驱动类导入(我这里用的是MySql,驱动类也在下面,可供下载)

二、在类的根目录下新建一个文件夹:META-INF,在META-INF中新建一个xml文件:persistence.xml,内容如下:
<?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&amp;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>



三、新建一个类:Person,放在cn.itcast.bean包下,代码如下:
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;
	}
	
	
	
}

在Person类中用到了枚举类型,再在该目录下新建Gender类,代码如下:
package cn.itcast.bean;

public enum Gender {
	MAN,WOMEN
}


四、测试,新建一个Junit测试类PersonTest,将其放在junit.test包下(不要忘了导入Junit的包),其代码如下:
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();	
	}

}

然后运行测试即可。
2
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics