(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,没有太多特别的规则和设计模式的要求,开发人员可以非常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測试代码里的对应方法即可能够。

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

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

    Spring Boot入门样例-001-Java和Maven安装配置 本文说明Java和Maven在windows下的安装和配置 前言 本Spring Boot入门样例准备工作参考: Spring B ...

  2. jbpm入门样例

    1.      jBPM的简介 jBPM是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储.    參考 http://www.jbos ...

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

    VC6下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demoproject和glut库下载 http://pan.baidu. ...

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

    经典的请假样例: 流程例如以下,首先须要部门经理审批.假设请假天数大于2天,则须要总经理审批,否则HR审批就可以 一:创建maven项目,项目结构例如以下: watermark/2/text/aHR0 ...

  5. Direct3D 9 入门样例程序 圆锥体

    介绍 Directx3D 9 什么是DirectX,非常好说了,Win32 C++ API.主要是多媒体编程方面的,长处体如今高性能了,如今我知道的版本号最高是D3D11,可是我是学习入门的,从D3D ...

  6. 支付宝即时到帐接口的python实现,演示样例採用django框架

    因工作须要研究了支付宝即时到帐接口.并成功应用到站点上,把过程拿出来分享. 即时到帐仅仅是支付宝众多商家服务中的一个,表示客户付款,客户用支付宝付款.支付宝收到款项后,立即通知你,而且此笔款项与交易脱 ...

  7. kafka入门样例 for java

    1,生产者 import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.Key ...

  8. Flume入门样例

    Flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 clo ...

  9. RAD 极速应用开发 Spring ROO 入门样例

    官网                                      http://projects.spring.io/spring-roo/ Spring ROO in action   ...

随机推荐

  1. HDU 2066 一个人的旅行(dijkstra水题+判重边)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066 题目大意:输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有 ...

  2. linux下设置opencv环境变量

    一.安装opencv(这里不再讲述) 二.添加库路径(创建opencv.conf文件) 输入命令:vi /etc/ld.so.conf.d/opencv.conf 输入/usr/local/lib,并 ...

  3. OpenCV3学习笔记

    http://blog.csdn.net/u010429424/article/details/73691001 http://blog.csdn.net/zhaoxfxy/article/detai ...

  4. EasyUi – 5.修改$.messager.show() 弹出窗口在浏览器顶部中间出现

    由于在easyui中$.messager.show() 只有一种弹出方式(在浏览器的或下角弹出),我最近在做一个项目的时候需要在浏览器的顶部中间出现.由于自己写花那么多的时间,所以就去修改了原码(不推 ...

  5. Fresco 获得Bitmap

    ImageRequest imageRequest = ImageRequestBuilder .newBuilderWithSource( Uri.parse(getFeedItem(positio ...

  6. GUC-1 volatile

    /* * 一.volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见. * 相较于 synchronized 是一种较为轻量级的同步策略. * * 注意: * 1. vola ...

  7. Java学习(运算符,引用数据类型)

    一.  运   算    符 1.算数运算符 运算符是用来计算数据的符号.数据可以是常量,也可以是变量.被运算符操作的数我们称为操作数. 算术运算符最常见的操作就是将操作数参与数学计算,具体使用看下图 ...

  8. Linux的shell终端常用快捷键

    参考: http://www.360doc.com/content/17/0627/09/44797135_666854802.shtml https://linux.cn/article-5660- ...

  9. java总结(方法与对象)

    包 1.用于管理类 2.包名采用公司的域名倒序+项目名+模块名 3.包的引入 类 1.main方法用static 它调用的方法也要static 2.程序要运行必须要main方法 3.类是一种引用数据类 ...

  10. 【WPF】OnApplyTemplate

    操作模板控件 在做WPF开发的时候,我们通常因为满足不同的需求会开发一些自定义控件来满足需要,我们会自定义模板来定义控件的外观,添加命令和路由事件来给控件添加行为,那如何在模板中查找元素并关联事件处理 ...