(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. python和C语言的差别

    之前在公司一直做的是C语言的开发,然后做的都是业务方面的东西,做的是sdk,因为最近在找工作,然后今天面试的时候被问到C语言和Python的区别,自己只是简单的说了C是静态语言,在变量在使用前进行声明 ...

  2. mac pro上安装docker

    1.进入一下地址进行下载docker https://download.docker.com/mac/stable/Docker.dmg 进入后进行下载后进行安装 2.将其拖动到Appliaction ...

  3. 新版Java为什么要修改substring的实现

    Java字符串的截取操作可以通过substring来完成.有意思的是,这个方法从jdk1.0开始,一直到1.6都没有变化,但到了1.7实现方式却发生了改变.你可能会认为之所以要对一个成熟且稳定的方法做 ...

  4. 专题-Delphi/C++ Builder多线程编程与调试

    [目录] Delphi.C++ Builder多线程程序编码调试的一点经验谈 多线程程序的填坑笔记和多线程编程应该遵循的规则(天地弦) 多线程编程中死锁问题的跟踪与解决 临界.多重读独占写多线程同步测 ...

  5. 刽子手游戏(UVa489)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...

  6. Python爬虫-request的用法

    import requests if __name__ == '__main__': #基本用法 #response = requests.get("http://httpbin.org/g ...

  7. spring_150904_hibernatetemplate

    实体类: package com.spring.model; import javax.persistence.Entity; import javax.persistence.Id; import ...

  8. Centos7中一次性安装开发者工具

    这里使用组安装包,一次性安装所有开发者工具. 1.查看有那些组安装包可用. yum grouplist | more 2.搜索一下有哪些和development有关. yum grouplist | ...

  9. ApplicationContext中getBean详解

    在org.springframework.context包中有一个接口叫 applicationContext applicationContext中有一个getBean方法,此方法继承之BeanFa ...

  10. XINCLUDE

    前言 导入外部xml文档,类似于php的include,将外部定义的dtd引入当前文件,因为引入外部实体具有局限性,所以使用xinclude来引入 语法 导入外部文档: <xi:include ...