(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测试代码对应的方法也许能。

JPA示例项(J采纳PA的hibernate实现版本号)的更多相关文章

  1. 从一个简单的 JPA 示例开始

    本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例:接着重构该示例,并引入 Sp ...

  2. SpringData JPA示例

    SpringData JPA只是SpringData中的一个子模块 JPA是一套标准接口,而Hibernate是JPA的实现 SpringData JPA 底层默认实现是使用Hibernate 1.  ...

  3. 在Qt示例项目的C ++ / QML源中的//! [0]的含义是什么?

    在Qt示例项目的C ++ / QML源中的//! [0]的含义是什么? 例如:  //! [0] GLWidget :: GLWidget(Helper * helper,QWidget * pare ...

  4. JAVA JPA - 示例用法

    JPA(Java Persistence API)是JSR(Java Specification Requests)的一部分,定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate. ...

  5. Spring Data Jpa示例(IntelliJ maven项目)

    1. 在IntelliJ中新建maven项目 给出一个建好的示例,(本示例中省略了业务逻辑组件UserService) 2. 在pom.xml中配置依赖 包括: spring-context spri ...

  6. JPA入门样例(採用JPA的hibernate实现版本号)

    (1).JPA介绍: JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.JPA吸取了眼下Java持久化技术的长 ...

  7. Spring boot data jpa 示例

    一.maven pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns ...

  8. 简述 JPA 与 Spring Data JPA 与 Hibernate

    1.JPA是什么?以及相关概述 JPA的是 Java Persistence API 的简写,是Sun官方提出的一种ORM规范! Sun提出此规范有2个原因: 1.简化现有Java EE和Java S ...

  9. 12 Spring Data JPA:orm思想和hibernate以及jpa的概述和jpa的基本操作

    spring data jpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查询 d ...

随机推荐

  1. 在云平台上基于Go语言+Google图表API提供二维码生成应用

    二维码能够说已经深深的融入了我们的生活其中.到处可见它的身影:但通常我们都是去扫二维码, 曾经我们分享给朋友一个网址直接把Url发过去,如今我们能够把自己的信息生成二维码再分享给他人. 这里就分享一下 ...

  2. jquery-3 jquery选择器

    jquery-3 jquery选择器 一.总结 一句话总结:选择器使用的时候可以结合参考手册,里面都已经详细归类好了.(多用才能熟啊) 1.$(:input).css({'color':'#98765 ...

  3. centos / Linux 服务环境下安装 Redis 5.0.3

    原文:centos / Linux 服务环境下安装 Redis 5.0.3 1.首先进入你要安装的目录 cd /usr/local 2.下载目前最新稳定版本 Redis 5.0.3 wget http ...

  4. java中抽象类和空的方法体有什么区别?

    public abstract void test();抽象方法public void test(){};方法体为空这两个有什么区别? public abstract void test(); 抽象方 ...

  5. Android系统编译环境初始化时Product产品的import-nodes过程

    从运行make -f config,mk文件開始,config,mk作为当前的makefile文件.将会被make解析,一般make解析Makefile文件流程首先是载入当中include的各种其它m ...

  6. jQuery+ localStorage 实现一个简易的计时器

    原型 图片发自简书App 需求1.关闭浏览器时时间继续运行2.刷新时保持当前状态3.结束时间保存在客户端 <div class="wrapper"> <div c ...

  7. 设计模式<面向对象的常用七大设计原则>

    面向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源码的重用,另一方面要确保系统能够易于扩展和修改,具有较好的灵活性. 常用的设计原则有七个原则: 1.单一职责原则(single ...

  8. hadoop 3.x 启动过程中 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

    出现这种状况是因为当前账号没有配置ssh免密登录 进入到以下目录,查看是否生成过秘钥对,如果有的话直接ssh-copy-id 主机名 没有的话执行ssh-keygen -t rsa后再重新执行ssh- ...

  9. android studio中文乱码各种情况的解决办法

    情况一:编辑器内的中文注释乱码. 解决办法:在界面的右下角找到 UTF-8 ,单击之,在弹出的列表中选中GBK 在弹出框内选中Reload 总结:导致这样的原因是你这个.java文件本身是GBK编码的 ...

  10. RStudio 的使用

    0. 基本 路径查看和设置: getwd() ⇒ 查看路径 setwd() ⇒ 设置路径: 1. 快捷键 ctrl+shift+c:多行注释:选中待注释的代码段,按下 ctrl+shift+c(c 表 ...