JPA开发入门实例

一. 什么是JPA

JPA是sun官方提出的Java持久化规范, 它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据,

它的出现主要是为了简化现有的持久化开发工作和整合ORM技术.

JPA总体思想和现有的Hibernate、TopLink等ORM框架大体一致. 总的来说, JPA包括以下3方面的技术:

1. ORM映射元数据(JPA支持XML和注解两种元数据的形式) - 元数据描述对象和表之间的映射关系.

2. Java持久化API: 用来操作实体对象, 执行CRUD操作,框架在后台替我们完成所有的事情, 开发者可以从繁琐的JDBC和SQL代码中解脱出来.

3. 查询语句: 通过面向对象而非面向数据库的查询语句查询数据, 避免程序和SQL语句紧密耦合.

二. JPA实例:

1. 代码结构图:

2. 配置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="test" 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="org.gjt.mm.mysql.Driver"/>
         <property name="hibernate.connection.username" value="root"/>
         <property name="hibernate.connection.password" value="root"/>
         <property name="hibernate.connection.url"
         		value="jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8"/>
         <property name="hibernate.max_fetch_depth" value="3"/>
         <property name="hibernate.hbm2ddl.auto" value="update"/>
      </properties>
   </persistence-unit>
</persistence>

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

3. 实体类

(1) Person:

@Entity
@Table(name = "person")
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;

	public Person() {
	}

	public Person(String name, Date d) {
		this.name = name;
		this.birthday = d;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Integer getId() {
		return id;
	}

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

	@Column(length = 20, nullable = false, name = "personName")
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Temporal(TemporalType.DATE)
	public Date getBirthday() {
		return birthday;
	}

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

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

	public void setGender(Gender gender) {
		this.gender = gender;
	}

	@Lob
	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;
	}
}

(2) Gender

public enum Gender {
	MAN, WOMAN
}

4. 测试代码

public class PersonTest {
	private static EntityManager em;
	private static EntityManagerFactory factory;

	@BeforeClass
	public static void before() throws Exception {
		factory = Persistence.createEntityManagerFactory("test");
		em = factory.createEntityManager();
	}

	@AfterClass
	public static void after() throws Exception {
		em.close();
		factory.close();
	}

	@Test
	public void save() {
		em.getTransaction().begin();
		em.persist(new Person("wangwu", new Date()));
		em.getTransaction().commit();
	}

	@Test
	public void getPerson1() {
		Person person = em.find(Person.class, 1); // get()
		System.out.println(person.getName());
	}

	@Test
	public void getPerson2() {
		Person person = em.getReference(Person.class, 2); // load()
		System.out.println(person.getName());
	}

	@Test
	public void updatePerson1() {
		em.getTransaction().begin();
		Person person = em.find(Person.class, 1);
		person.setName("老张");
		em.getTransaction().commit();
	}

	@Test
	public void updatePerson2() {
		em.getTransaction().begin();
		Person person = em.find(Person.class, 1);
		em.clear(); // 把实体变成游离状态
		person.setName("老王");
		em.merge(person); // 用于把游离状态的对象更新同步到数据库
		em.getTransaction().commit();
	}

	@Test
	public void delete() {
		em.getTransaction().begin();
		Person person = em.find(Person.class, 1);
		em.remove(person); // 把托管状态的实体删掉
		em.getTransaction().commit();
	}

	@Test
	public void query() {
		Query query = em.createQuery("select o from Person o where o.id=?1");
		query.setParameter(1, 2);
		Person person = (Person) query.getSingleResult();
		System.out.println(person.getName());
	}

	@Test
	public void deletequery() {
		em.getTransaction().begin();
		Query query = em.createQuery("delete from Person o where o.id=?1");
		query.setParameter(1, 2); // id为2的删除
		query.executeUpdate();
		em.getTransaction().commit();
	}

	@Test
	public void updatequery() {
		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();
	}
}

三. 总结:

JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,他不能取代现有的Hibernate、TopLink等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。

时间: 2024-08-08 17:52:02

JPA开发入门实例的相关文章

spring mvc开发入门实例demo源代码下载,很适合新手入门学习用。

原文:spring mvc开发入门实例demo源代码下载,很适合新手入门学习用. 源代码下载:http://www.zuidaima.com/share/1550463469046784.htm Eclipse + Maven + Spring MVC - Simple Example 源代码框架截图:

IOS开发入门实例

关于如何创建第一个 iOS 应用 本篇“第一个 iOS 应用”教程将向你介绍 iOS 应用开发中的“三个T”: Tools(工具)如何利用 Xcode 创建和管理工程. Technologies(技术)如何创建能够响应用户输入的应用. Techniques(技巧)如何充分利用 iOS 应用开发的基础设计模式. 当你完成本教程的所有步骤之后,你的应用看起来会和下边图中的差不多: 从图中可以看到,你创建的应用界面上有三个主要的元素: 一个文本框(用户把文字输入到这里) 一个标签(这里可以用来显示信息

【转】Android NDK开发入门实例

写这个,目的就是记录一下我自己的NDK是怎么入门的.便于以后查看,而不会忘了又用搜索引擎一顿乱搜.然后希望能够帮助刚学的人入门. 先转一段别人说的话: “NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. * NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU.平台.ABI等差异,开发人员只需要简单修

ArcgisAdd-In开发入门实例

1.开发环境 Vs2012+Arcgis10.2+win7 64bit 2.实现代码 首先在VS2012中新建一个解决方案,命名AddInTest. 接着,给解决方案AddInTest新建一个项目: 点击[确定],出现如下界面,点击[Next]. 接着,设置相关信息,并点击[finish]完成. 上图中,class name是类的名称,caption是button显示的文字,category是所属的command的分类,tooltip是鼠标在上面时状态栏显示的文字,description是工具的

Android NDK开发入门实例

AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合. 注意: AndroidNDK只能用于Android1.5及以上版本中. I. Android NDK 目标: Android虚拟机允许你的应用在源码中通过JNI调用本地代码(c/c++)中实现的方法们.概括起来,这表示: --你的应用的java源代码中要声明一个或多个方法,这些方法前面需有'native'关键字,这表明它们被本地代码实现.如: [java] view plainc

destoon入门实例与常见问题汇总

destoon入门实例与常见问题 收集了一些destoon入门实例与常见问题,大家做个参考.转自:http://blog.csdn.net/vip_linux/article/details/37833963 链接如下: destoon忘记后台密码怎么办?destoon找回管理员密码 忘记destoon管理员后台账号密码怎么办?解决方法 destoon如何实现调用自增数字从1开始 destoon底部添加你是第几位访问者 destoon调用热门关键字的例子 destoon首页怎么调用求购供应信息的

destoon入门实例与常见问题

收集了一些destoon入门实例与常见问题,大家做个参考. 链接如下: destoon忘记后台密码怎么办?destoon找回管理员密码 忘记destoon管理员后台账号密码怎么办?解决方法 destoon如何实现调用自增数字从1开始 destoon底部添加你是第几位访问者 destoon调用热门关键字的例子 destoon首页怎么调用求购供应信息的地区名称? destoon教程之destoon数据库表说明 destoon教程之首页显示供应.企业.资讯条数 destoon开发公司新闻详细页并添加评

Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例【附详细代码】

http://blog.csdn.net/xiefu5hh/article/details/51707529 Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例[附详细代码] 标签: SparkECLIPSEJAVAMAVENwindows 2016-06-18 22:35 405人阅读 评论(0) 收藏 举报  分类: spark(5)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 前言 本文旨在记录初学Spark时,根据官网快速

《Spring Data JPA从入门到精通》内容简介、前言

内容简介 本书以Spring Boot为技术基础,从入门到精通,由浅入深地介绍Spring Data JPA的使用.有语法,有实践,有原理剖析. 本书分为12章,内容包括整体认识JPA.JPA基础查询方法.定义查询方法.注解式查询方法.@Entity实例里面常用注解详解.JpaRepository扩展详解.JPA的MVC扩展REST支持.DataSource的配置.乐观锁.SpEL表达式在Spring Data里面的应用.Spring Data Redis实现cacheable的实践.Intel