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编程訪问数据库,代码量较大,特别是訪问字段较多的表的时候,代码显得繁琐、累赘,easy出错。比如: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的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发人员可以非常easy的掌握。JPA基于非侵入式原则设计,因此可以非常easy的和其他框架或者容器集成。
4 可媲美JDBC的查询能力
  JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,并且可以支持批量更新和改动、JOIN、GROUP BY、HAVING 等通常仅仅有 SQL 才可以提供的高级查询特性,甚至还可以支持子查询。
5 支持面向对象的高级特性
  JPA 中可以支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这种支持可以让开发人员最大限度的使用面向对象的模型设计企业应用,而不须要自行处理这些特性在关系数据库的持久化。

(2)、详细样例

完毕project后project结构例如以下图:

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

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

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

<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_version=1">
<persistence-unit name="mysqlJPA" transaction-type="RESOURCE_LOCAL">
<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="123456" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db1" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>

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

package com.hmk.bean;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
private int id;
private String name;

@Id @GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(length=12)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}

c)、编写junit測试代码,例如以下:

package junit.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.BeforeClass;
import org.junit.Test;

import com.hmk.bean.Person;

public class JpaTest {

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@Test public void createTable(){
//能够验证生成表是否正确
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
factory.close();
}

@Test public void save(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = new Person(); //person为new状态
person.setName("zhang san");
em.persist(person); //持久化实体
em.getTransaction().commit();
em.close();
factory.close();
}
//new 、托管、脱管、删除

@Test public void update(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
person.setName("hmk"); //person为托管状态
em.getTransaction().commit();
em.close();
factory.close();
}

@Test public void update2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.clear(); //把实体管理器中的全部实体变为脱管状态
person.setName("hmk2");
em.merge(person); //把脱管状态变为托管状态,merge能够自己主动选择insert or update 数据
em.getTransaction().commit();
em.close();
factory.close();
}

@Test public void remove(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
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 find(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 2); //相似于hibernate的get方法,没找到数据时,返回null
System.out.println(person.getName());
em.close();
factory.close();
}
@Test public void find2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.getReference(Person.class, 2); //相似于hibernate的load方法,延迟载入.没对应数据时会出现异常
System.out.println(person.getName()); //真正调用时才查找数据
em.close();
factory.close();
}
}

d)、执行junit測试代码里的对应方法即可能够。

时间: 2024-11-03 20:50:14

JPA入门样例(採用JPA的hibernate实现版本号)的相关文章

Spring Boot入门样例-001-Java和Maven安装配置

Spring Boot入门样例-001-Java和Maven安装配置 本文说明Java和Maven在windows下的安装和配置 前言 本Spring Boot入门样例准备工作参考: Spring Boot入门样例-001-Java和Maven安装配置 Spring Boot入门样例-003-idea 安装配置和插件 Spring Boot入门样例-005-如何运行 1. 下载 下载地址:https://www.oracle.com/technetwork/java/javase/downloa

jbpm入门样例

1.      jBPM的简介 jBPM是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储. 參考 http://www.jboss.com/products/jbpm 2.      jBPM和myeclipse的冲突 当eclipse安装了myeclipse和jBPM时候,可能有冲突,详细表如今jBPM的流程设计器不能在eclipse中使用. 3.      Hibernate连接mysql数据库的一般參数 以下的配置參数,依据

Activiti的简单入门样例(经典的请假样例)

经典的请假样例: 流程例如以下,首先须要部门经理审批.假设请假天数大于2天,则须要总经理审批,否则HR审批就可以 一:创建maven项目,项目结构例如以下: 增加依赖 pom.xml <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>5.17.0</version> </depe

图解VC++ opengl环境配置和几个入门样例

VC6下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demoproject和glut库下载 http://pan.baidu.com/s/1pLSpKiZ 一 环境配置 參阅 http://blog.itpub.net/17267437/viewspace-545635/ 解压glut库 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize

Direct3D 9 入门样例程序 圆锥体

介绍 Directx3D 9 什么是DirectX,非常好说了,Win32 C++ API.主要是多媒体编程方面的,长处体如今高性能了,如今我知道的版本号最高是D3D11,可是我是学习入门的,从D3D9開始,不算非常是落伍. Directx3D 元素 D3D元素非常多,这里说的元素是程序中用到的元素. 1〉D3D 编程的起点.能够理解成出所用的D3D SDK程序集. 2〉D3D present parameter .呈现參数,专业的參数是通过一顿检測配置成最好的.程序中的參数简单的用默认的显示參

drools6入门样例(二)

产品规则例如以下: 1:单个产品数量超过2个,该产品打9折 2:总价格超过1000,立减50 新建maven项目.增加drools的依赖 <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>6.2.0.Final</version> </dependency> <dependenc

Flume入门样例

Flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 cloudera.但随着 FLume 功能的扩展,Flume OG 代码工程臃肿.核心组件设计不合理.核心配置不标准等缺点暴露出来,尤其是在 Flume OG 的最后一个发行版本 0.94.0 中,日志传输不稳定的现象尤为严重,为了解决这些问题,2011 年 10 月 22 号,cloudera 完成了

JPA入门例子

(1).JPA介绍: JPA全称为Java PersistenceAPI ,Java耐久化API是Sun公司在Java EE 5标准中提出的Java耐久化接口.JPA吸取了当前Java耐久化技能的长处,旨在标准.简化Java目标的耐久化作业.运用JPA耐久化目标,并不是依赖于某一个ORM结构.      为何要运用JAP?      在说为何要运用JPA之前,咱们有必要了解为何要运用ORM技能. ORM 是Object-Relation-Mapping,即目标联系暗射技能,是目标耐久化的中心.O

Spring Data 系列(二) Spring+JPA入门

通过[Spring Data 系列(一) 入门]的介绍,通过对比的方式认识到Spring提供的JdbcTemplate的强大功能.通过使用JdbcTemplate,操作数据库,不需要手动处理Connection,Statement等底层SQL对象.可是,Spring对数据库的操作还远远没有结束.本章主要介绍Spring 对JPA的支持. 主要内容 简单介绍JPA Spring Hibernate JPA整合 1.JPA简介 Java Persistence API (JPA),为开发人员提供了一