`
丶折子戏
  • 浏览: 12668 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

[转] JPA入门例子(采用JPA的hibernate实现版本)

 
阅读更多

(1)、JPA介绍:

      JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。

     为什么要使用JAP?
      在说为什么要使用JPA之前,我们有必要了解为什么要使用ORM技术。

ORM 是Object-Relation-Mapping,即对象关系影射技术,是对象持久化的核心。ORM是对JDBC的封装,从而解决了JDBC的各种存在问题:

a) 繁琐的代码问题

用JDBC的API编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错。例如:PreparedStatement pstmt=con.prepareStatment("insert into account value(?,?,?,?,?,?,?,?,?)");

ORM则建立了Java对象与数据库对象之间的影射关系,程序员不需要编写复杂的SQL语句,直接操作Java对象即可,从而大大降低了代码量,也使程序员更加专注于业务逻辑的实现。

b) 数据库对象连接问题

关系数据对象之间,存在各种关系,包括1对1、1对多、多对1、多对多、级联等。在数据库对象更新的时候,采用JDBC编程,必须十分小心处理这些关系,以保证维持这些关系不会出现错误,而这个过程是一个很费时费力的过程。

ORM建立Java对象与数据库对象关系影射的同时,也自动根据数据库对象之间的关系创建Java对象的关系,并且提供了维持这些关系完整、有效的机制。

c) 系统架构问题

JDBC属于数据访问层,但是使用JDBC编程时,必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、创建了什么索引等等与后台数据库相关的详细信息。

使用ORM技术,可以将数据库层完全隐蔽,呈献给程序员的只有Java的对象,程序员只需要根据业务逻辑的需要调用Java对象的Getter和 Setter方法,即可实现对后台数据库的操作,程序员不必知道后台采用什么数据库、有哪些表、有什么字段、表与表之间有什么关系。

d) 性能问题

采用JDBC编程,在很多时候存在效率低下的问题。

pstmt =conn.prepareStatement("insert into user_info values(?,?)");
       for (int i=0; i<1000; i++) {
          pstmt.setInt(1,i);
          pstmt.setString(2,"User"+i.toString());
          pstmt.executeUpdate();
       }

以上程序将向后台数据库发送1000次SQL语句执行请求,运行效率较低。

采用ORM技术,ORM框架将根据具体数据库操作需要,会自动延迟向后台数据库发送SQL请求,ORM也可以根据实际情况,将数据库访问操作合成,尽量减少不必要的数据库操作请求。

 

JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势:

1 标准化
  JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
2 对容器级特性的支持
  JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
3 简单易用,集成方便
  JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
4 可媲美JDBC的查询能力
  JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
5 支持面向对象的高级特性
  JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。

 

 

(2)、具体例子

    完成工程后工程结构如下图:

    

 (注意:persistence.xml文件的位置决定持久性的根(Persistence Root)。持久性的根为JAR文件或者包含META-INF目录(前提是persistence.xml位于此)的目录。一般将这个persistence.xml文件放在src下的META-INF中。命名及位置都不能变)

 

a)、导入相关jar包(见上图)和创建META-INF和persistence.xml文件.

persistence.xml配置如下:(我用的数据为mysql,采用不同数据库及JPA的不同实现版本会导致配置内容不同)

   

[xhtml] view plaincopy
 
  1. <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_version=1">  
  4.     <persistence-unit name="mysqlJPA" transaction-type="RESOURCE_LOCAL">  
  5.         <properties>  
  6.             <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />  
  7.             <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />  
  8.             <property name="hibernate.connection.username" value="root" />  
  9.             <property name="hibernate.connection.password" value="123456" />  
  10.             <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db1" />  
  11.             <property name="hibernate.max_fetch_depth" value="3" />  
  12.             <property name="hibernate.hbm2ddl.auto" value="update" />  
  13.         </properties>  
  14.     </persistence-unit>  
  15. </persistence>  

 

 

b)、编写实体bean,如下:

   

[c-sharp] view plaincopy
 
  1. package com.hmk.bean;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Entity;  
  5. import javax.persistence.GeneratedValue;  
  6. import javax.persistence.Id;  
  7.   
  8. @Entity  
  9. public class Person {  
  10.     private int id;  
  11.     private String name;  
  12.       
  13.     @Id @GeneratedValue  
  14.     public int getId() {  
  15.         return id;  
  16.     }  
  17.     public void setId(int id) {  
  18.         this.id = id;  
  19.     }  
  20.     @Column(length=12)  
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.     public void setName(String name) {  
  25.         this.name = name;  
  26.     }  
  27.       
  28. }  

   

 

 

c)、编写junit测试代码,如下:

  

    

[java] view plaincopy
 
  1. package junit.test;  
  2.   
  3.   
  4. import javax.persistence.EntityManager;  
  5. import javax.persistence.EntityManagerFactory;  
  6. import javax.persistence.Persistence;  
  7.   
  8. import org.junit.BeforeClass;  
  9. import org.junit.Test;  
  10.   
  11. import com.hmk.bean.Person;  
  12.   
  13. public class JpaTest {  
  14.   
  15.     @BeforeClass  
  16.     public static void setUpBeforeClass() throws Exception {  
  17.     }  
  18.       
  19.     @Test public void createTable(){  
  20.         //可以验证生成表是否正确  
  21.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");  
  22.         factory.close();  
  23.     }  
  24.   
  25.     @Test public void save(){  
  26.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");  
  27.         EntityManager em = factory.createEntityManager();  
  28.         em.getTransaction().begin();  
  29.         Person person = new Person(); //person为new状态  
  30.         person.setName("zhang san");  
  31.         em.persist(person); //持久化实体  
  32.         em.getTransaction().commit();  
  33.         em.close();  
  34.         factory.close();  
  35.     }  
  36.     //new 、托管、脱管、删除  
  37.       
  38.     @Test public void update(){  
  39.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");  
  40.         EntityManager em = factory.createEntityManager();  
  41.         em.getTransaction().begin();  
  42.         Person person = em.find(Person.class1);  
  43.         person.setName("hmk"); //person为托管状态  
  44.         em.getTransaction().commit();  
  45.         em.close();  
  46.         factory.close();  
  47.     }  
  48.       
  49.     @Test public void update2(){  
  50.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");  
  51.         EntityManager em = factory.createEntityManager();  
  52.         em.getTransaction().begin();  
  53.         Person person = em.find(Person.class1);  
  54.         em.clear(); //把实体管理器中的所有实体变为脱管状态  
  55.         person.setName("hmk2");  
  56.         em.merge(person); //把脱管状态变为托管状态,merge可以自动选择insert or update 数据  
  57.         em.getTransaction().commit();  
  58.         em.close();  
  59.         factory.close();  
  60.     }  
  61.   
  62.     @Test public void remove(){  
  63.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");  
  64.         EntityManager em = factory.createEntityManager();  
  65.         em.getTransaction().begin();  
  66.         Person person = em.find(Person.class1);  
  67.         em.remove(person); //删除实体  
  68.         em.getTransaction().commit();  
  69.         em.close();  
  70.         factory.close();  
  71.     }  
  72.       
  73.     @Test public void find(){  
  74.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");  
  75.         EntityManager em = factory.createEntityManager();  
  76.         Person person = em.find(Person.class2); //类似于hibernate的get方法,没找到数据时,返回null  
  77.         System.out.println(person.getName());  
  78.         em.close();  
  79.         factory.close();  
  80.     }  
  81.     @Test public void find2(){  
  82.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");  
  83.         EntityManager em = factory.createEntityManager();  
  84.         Person person = em.getReference(Person.class2); //类似于hibernate的load方法,延迟加载.没相应数据时会出现异常  
  85.         System.out.println(person.getName()); //真正调用时才查找数据  
  86.         em.close();  
  87.         factory.close();  
  88.     }  
  89. }  

 

 

 

d)、运行junit测试代码里的相应方法就行可以。

 

分享到:
评论

相关推荐

    hibernate+strut+jpa入门例子.zip

    【描述】:“Hibernate+Struts+JPA入门例子”旨在帮助开发者理解如何在Java应用程序中实现数据持久化、业务逻辑控制和用户界面管理。Hibernate是一个强大的对象关系映射(ORM)工具,它简化了数据库操作;Struts是...

    Spring Data JPA 入门例子极简代码

    **Spring Data JPA 入门详解** Spring Data JPA 是 Spring 框架的一个模块,它简化了数据库访问...以上是 Spring Data JPA 入门的例子,如果你想要深入了解,可以参考给定的博客地址或其他相关教程,持续学习和实践。

    针对MySQL数据库做的JPA的小例子

    1. **配置JPA**: 在项目中引入JPA的依赖,配置数据源和JPA供应商,如Hibernate。 2. **创建实体类**: 设计实体类并添加必要的注解,例如`@Entity`、`@Table`、`@Id`等。 3. **编写Repository**: 创建接口继承自JPA...

    hibernate jpa

    描述提到"hibernate jpa 入门测试例子程序,可以直接运行,看结果。适合初学者",意味着这个压缩包可能包含了一个简单的示例项目,用于教学目的,让初学者能够快速理解如何在实际项目中配置和使用Hibernate JPA。...

    jpa开发实例和文档

    快速入门JPA的步骤可能包括安装和配置JPA供应商(如Hibernate、EclipseLink等),创建第一个实体,设置数据源,编写第一个查询,以及测试和调试。 **JPA.ppt**可能是一个PowerPoint演示文稿,详细介绍了JPA的基本...

    spring 入门例子学习文档

    ### Spring入门例子学习文档知识点概览 #### 一、Spring框架概述 - **Spring与控制反转(IoC)** - **依赖反转**:在面向对象编程中,一个类依赖于另一个类时,通常需要创建依赖类的实例并传递给需要它的类。这种...

    EJB3入门例子

    **jbos5**是EJB3的一个流行实现,是JBoss Application Server的第五个主要版本。它提供了一个完整的Java EE 5兼容环境,包括对EJB3的支持。JBoss AS5提供了丰富的管理和监控工具,方便开发者部署和调试EJB3应用。 *...

    Spring+Struts2+JPA

    **Spring+Struts2+JPA 整合...这个入门小例子可以帮助初学者理解如何将这三大框架集成在一起,实现一个简单的CRUD应用,从而加深对Java Web开发的理解。通过学习和实践,你可以逐步掌握如何在实际项目中运用这些技术。

    Beginning Hibernate, 3rd Edition

    3. Java持久化标准(JPA):书中向读者介绍了当前Java中对象关系持久化的标准——Java持久化API(JPA),以及如何在Hibernate中实现JPA规范。 4. 注解映射:详细阐述了如何使用注解(Annotations)来定义对象与...

    springBoot+springjpa.docx

    ### Spring Boot + Spring JPA 入门教程 #### 一、Spring Boot 快速入门 Spring Boot 是一种简化 Spring 应用程序开发的新框架。它旨在简化基于 Spring 的应用程序的初始设置和配置过程。 ##### 1. 创建 Maven ...

    Hibernate Annotation入门

    **Hibernate Annotation 入门** Hibernate 是一款非常流行的Java对象关系映射(ORM)框架,它允许开发者使用面向对象的方式操作数据库。而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上...

    Getting Started with JPA

    尽管像 Hibernate 和 TopLink 这样的专有对象关系映射 (ORM) 工具仍然存在,但它们现在都致力于通过 JPA API 提供其功能,从而使所有应用程序能够在不同的 JPA 实现之间移植。本文档将介绍 JPA 的基础知识,并指导...

    JBPM4.4 工作流 入门 例子

    **JBPM4.4工作流入门例子 - HelloWorld** ...总之,JBPM4.4提供了一个强大且灵活的工作流平台,通过"HelloWorld"这样的入门实例,你可以逐步掌握如何构建和管理业务流程,从而实现企业流程的自动化和优化。

    hibernate3.5.0官方手册

    2. **快速入门**:通过一个简单的例子,引导开发者了解如何配置Hibernate,创建实体类,定义映射文件,并执行基本的CRUD(创建、读取、更新、删除)操作。 3. **配置**:详述了Hibernate的配置文件(hibernate.cfg....

    hibernate3.3.2 案例包

    在Hibernate3.3.2版本中,引入了若干改进和新特性,如查询语言HQL的增强、支持JPA规范、性能优化等,使得这个版本更加成熟稳定。 案例包中的"HelloWorld"是一个经典的入门示例,它展示了如何配置Hibernate环境,...

    ejb3.0+Weblogic+Jboss安装配置及入门例子

    2. 持久化:通过`@Entity`注解,EJB3.0提供了更直观的持久化模型,支持JPA(Java Persistence API),并与Hibernate等ORM框架集成。 3. 自动事务管理:EJB容器自动处理事务,开发者无需关心底层的事务控制。 4. 无...

    Struts2+Spring3+Hibernate4+Maven+EasyUI整合入门视频010

    Hibernate4在前一版本的基础上提升了性能,优化了内存使用,并引入了JPA 2.1规范的支持,使得数据库交互更加便捷。 4. **Maven**:Maven是Java项目管理和综合工具,通过一个配置文件(pom.xml)来管理项目的构建、...

    springboot例子

    例如,如果你的类路径下有`hibernate-validator`,那么SpringBoot会自动配置Bean验证。 4. **内嵌Web服务器**:SpringBoot默认使用内嵌的Tomcat或Jetty服务器,无需额外部署war文件,大大简化了开发和部署流程。 5...

    《EJB 3.0入门经典》 源码

    3. **实践JPA**:通过具体的例子了解如何使用JPA进行数据持久化。 4. **掌握依赖注入**:理解CDI如何自动装配Bean及其依赖。 5. **实现事务管理**:学习如何控制事务的边界和属性。 6. **探索并发与安全性**:了解...

Global site tag (gtag.js) - Google Analytics