`
x125521853
  • 浏览: 72656 次
  • 性别: 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是一套规范,不是产品。


二:JPA包括以下三个方面技术
   1. ORM映射元数据
       JPA支持XML和JDK5.0注释。
   2.Java持久化API
       用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者可以从繁琐的JDBC和SQL代码中解脱出来。
   3. 查询语言
       这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。


三:JPA依赖的jar包
Hibernate-distribution-3.3.1.GA:
    hibernate3.jar、hibernate-cglib-repack-2.1_3.jar、antlr-2.7.6.jar、commons-collections-3.1.jar、dom4j-1.6.1.jar、javassist-3.4.GA.jar、jta-1.1.jar、slf4j-api-1.5.2.jar
Hibernate-annotations-3.4.0.GA:
    hibernate-annotations.jar、ejb3-persistence.jar、hibernate-commons-annotations.jar
Hibernate-entitymanager-3.4.0.GA:
    Hibernate-entitymanager.jar、log4j.jar、slf4j-log4j12.jar

 

四:JPA的配置文件
     JPA规范要求在类路径的META-INF目录下放置persistence.xml,文件名称是固定的。

     注意:这个META-INF不是WebRoot目录下的,而是在src下面创建这个META-INF。

   persistence.xml 

<?xml version="1.0"?>
<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">
  		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name=" hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
			<property name=" hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
			<property name=" hibernate.connection.username" value="root" />
			<property name=" hibernate.connection.password" value="wdpc" />
			<property name=" hibernate.connection.url"
				value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8" />
			<property name="hibernate.max_fetch_depth" value="3" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.jdbc.fetch_size" value="18" />
			<property name="hibernate.jdbc.batch_size" value="10" />
			<property name="hibernate.show_sql" value="false" />
			<property name="hibernate.format_sql" value="false" />
		</properties>
	</persistence-unit>
</persistence>

     先建表,后再根据表来编写配置文件和实体bean,使用这种方案的开发人员受到了传统数据库建模的影响。
      先编写配置文件和实体bean,然后再生成表,使用这种方案的开发人员采用的是领域建模思想,这种思想相对前一种思想更加oop(面向对象).

 

 五:数据库表是与实体同名的,也是类名
      数据库的字段是根据类属性同名的。

 

六:示例
     建Java工程,添加jar包    

 

   Person.java   

package cn.wdpc.bean;

import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
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.Persistence;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@Entity //标注了这个类是实体bean,默认的实体名称就是Person
//@Table 将数据库表名为xxx
@Table(name="xxx")
public class Person {
	private Integer id;
	private String name;
	private Date birthday; //生日
	private Gender gender = Gender.MAN; //默认为男
	private String info; //信息
	private Byte[] file; //字节数组文件
	private String imagepath;

	//因为这个对象是由hibernate内部反射技术创建的,需要默认构造
	public Person() {
		super();
	}	

	public Person(String name) {
		this.name = name;
	}

	//@Id 实体标示 ,可以标在字段上,也可以标在属性get方法上
	@Id @GeneratedValue //(strategy=GenerationType.AUTO)
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	//length数据库表字段长度为10
	//nullabel 表示数据库字段不能为空
	//name 表示将数据库name字段改为username
	@Column(length=10,nullable=false,name="username") 
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}	
	
	//@Temporal 存放时间格式
	@Temporal(TemporalType.DATE)
	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}	

	//@Enumerated枚举类型
	@Enumerated(EnumType.STRING)
	@Column(length=5,nullable=false)
	public Gender getGender() {
		return gender;
	}

	public void setGender(Gender gender) {
		this.gender = gender;
	}	
	//@Lob 用来声明属性为大文本类型
	@Lob
	public String getInfo() {
		return info;
	}

	public void setInfo(String info) {
		this.info = info;
	}
	
	@Lob //用来存储二进制文件
	@Basic(fetch=FetchType.LAZY) //是否延迟初始化,一般用在大数据上 1BM以上
	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;
	}

	public static void main(String[] args) {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("wdpc");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		em.persist(new Person("张三"));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
}

 

  创建枚举Gender.java 

package cn.wdpc.bean;

public enum Gender {
	MAN,WOMEN
}

 

 测试类PersonTest.java 

package com.wdpc.junit.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.wdpc.bean.Person;

public class PersonTest {
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}
	
	//创建数据库,并插入数据
	@Test
	public void save(){
		//相当于sessionFactory		
		//createEntityManagerFactory 创建持久化单元的名称,要和xml文件里persistence-unit name="wdpc"对应
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("wdpc");
		//相当于session
		EntityManager em = factory.createEntityManager();
		//事务的开始begin();
		em.getTransaction().begin();
		//持久化方法==事务session.save()
		em.persist(new Person("张三"));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
	
	//从数据库里获取数据
	@Test
	public void getPerson(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("wdpc");
		EntityManager em = factory.createEntityManager();
		//读取数据库的数据不需要开启事务
		Person person = em.find(Person.class, 1);//如果将1改为2,打印出null
		System.out.println(person.getName());
		em.close();
		factory.close();
	}
	
	//从数据库里获取数据
	@Test
	public void getPerson2(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("wdpc");
		EntityManager em = factory.createEntityManager();
		//读取数据库的数据不需要开启事务
		Person person = em.getReference(Person.class, 1);//如果将1改为2,抛异常
		System.out.println(person.getName());
		em.close();
		factory.close();
	}
	
	//数据跟新,数据插入和数据跟新需要用到事务
	//new 
	//managed 托管
	//游离(脱管)
	//删除
	@Test
	public void updatePerson(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("wdpc");
		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("wdpc");
		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("wdpc");
		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("wdpc");
		EntityManager em = factory.createEntityManager();
		Query query= em.createQuery("select o from Person o where o.id=?");
		query.setParameter(1, 2);
		Person person =(Person)query.getSingleResult();
		System.out.println(person.getName());
		em.close();
		factory.close();
	}

//跟新查询
   @Test
	public void queryupdate(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("wdpc");
		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", 4);
		query.executeUpdate();
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

 

 创建配置文件persistence.xml
 在src下创建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">
	<!-- 持久化单元,实体bean -->
	<!-- transaction-type:有 JTA全局事务;RESOURCE_LOCAL本地事务-->
	<persistence-unit name="wdpc" transaction-type="RESOURCE_LOCAL">
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
			<property name="hibernate.connection.username" value="root" />
			<property name="hibernate.connection.password" value="admin" />
			<property name="hibernate.connection.url"
				value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8" />
			<property name="hibernate.jdbc.fetch_size" value="18" />
			<property name="hibernate.jdbc.batch_size" value="10" />
			<property name="hibernate.show_sql" value="false" />
			<property name="hibernate.format_sql" value="false" />
		</properties>
	</persistence-unit>
</persistence>

 

 Jar包:hibernate-cglib-repack-2.1_3.jar,commons-collections-3.1.jar,dom4j-1.6.1.jar,javassist-3.4.GA.jar,jta-1.1.jar,slf4j-api-1.5.2.jar,antlr-2.7.6.jar,hibernate-annotations.jar,hibernate-commons-annotations.jar,ejb3-persistence.jar,hibernate-entitymanager.jar,slf4j-log4j12.jar,log4j.jar,ehcache-1.2.3.jar,hibernate3.jar,commons-logging.jar,cglib-2.1.3.jar,cglib-nodep-2.1_3.jar,asm.jar,asm-attrs.jar,asm-commons-2.2.3.jar,asm-util-2.2.3.jar,spring.jar,commons-dbcp.jar

  • 大小: 17.1 KB
  • lib.rar (4.8 MB)
  • 下载次数: 47
分享到:
评论

相关推荐

    Spring Data JPA 笔记

    本笔记将深入探讨Spring Data JPA的核心概念、功能以及如何在实际项目中应用。 首先,我们需要理解JPA的概念。JPA是Java平台上的一个标准,用于管理关系数据库中的数据。它提供了一种面向对象的方式来操作数据库,...

    传智博客 黎活明 jpa 笔记

    JPA(Java Persistence API)是Sun公司提出的一种Java持久化规范,旨在简化Java应用程序中关系数据的管理。它提供了一种对象/关系映射(ORM)工具,允许开发人员以面向对象的方式处理数据库操作,而不是直接编写SQL...

    Spring Data JPA笔记.zip

    JPA 的全称是 Java Persistence API, 即 Java 持久化 API,是 SUN 公司推出的一套基于 ORM 的规范,内部是由一系列的接口和抽象类构成。JPA 的查询语言是面向对象而非面向... 本文档包含了JPA的课件笔记与学习标注。

    SpringData JPA笔记.docx

    SpringData JPA笔记

    Spring data JPA笔记资料

    Spring Data JPA 是一个强大的框架,它简化了与Java持久层的交互,允许开发者以声明式的方式处理数据库操作。这个框架是Spring生态的一部分,专门用于简化JPA(Java Persistence API)的使用。下面将详细解释Spring ...

    传智播客JPA学习笔记.pdf

    **Java Persistence API (JPA)** 是Java平台上的...以上就是JPA学习笔记中的关键知识点,涵盖了JPA的基本概念、环境配置、对象关系映射、查询语言、事务管理、关联关系等多个方面,对于理解和应用JPA有重要的指导作用。

    超全面综合笔记!Spring Data Jpa 学习

    综合多家视频,超全面综合笔记!Spring Data Jpa 学习

    JPA学习代码资料

    这是一个jpa(hibernate)的学习代码,是我学习JPA的总结,包含三个案例,一对一、一对多、多对多 。 eclipse工具编码为utf-8

    JPA学习笔记

    【JPA学习笔记】 JPA(Java Persistence API)是Java平台上的一个ORM(Object-Relational Mapping)规范,它提供了一种将Java对象与数据库表进行映射的机制,简化了数据库操作。JPA允许开发者使用面向对象的方式...

    jpa学习笔记

    ### JPA 学习笔记详解 #### 一、JPA 概述 Java Persistence API (JPA) 是 Sun 公司提出的一种 Java 持久层标准,它为 Java 开发者提供了一种对象关系映射 (ORM) 的工具来管理 Java 应用程序中的关系型数据。JPA ...

    传智播客——JPA学习笔记

    传智播客——JPA学习笔记 网络上有一份pdf格式的《JPA学习笔记》,但是内容排版有点乱,而且有缺失的部分,小弟从原来的blog处拷贝出来,并加以排版,制作成了chm格式的,大家应该知道chm格式比较适合作为参考资料或...

    jpa学习笔记 介绍了jpa中state的概念和应用

    本篇学习笔记主要探讨了JPA中实体的状态及其转换,包括New、Managed、Detached和Removed四种状态。 首先,实体(Entity)是JPA中的核心概念,它代表数据库中的一个记录。实体的身份(Identity Fields)用于唯一标识...

    spring 使用 Jpa的笔记

    ### Spring 使用 JPA 的知识点详解 #### 一、Spring与JPA简介 Spring框架与Java Persistence API (JPA)的结合使用是当前企业级应用开发中的常见实践之一。Spring为JPA提供了很好的集成支持,使得开发者能够更加...

    JPA学习笔记-EJB-04JPA关联映射总结

    本篇笔记主要聚焦于JPA的关联映射,这是JPA中一个重要的概念,用于定义实体之间的关系。 关联映射允许我们将数据库中的表关系映射到Java对象的关联上。在Hibernate中,这些关系通常通过XML配置文件来定义,而在JPA...

Global site tag (gtag.js) - Google Analytics