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,没有太多特别的规则和设计模式的要求,开发人员可以非常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实现版本号)的更多相关文章
- Spring Boot入门样例-001-Java和Maven安装配置
Spring Boot入门样例-001-Java和Maven安装配置 本文说明Java和Maven在windows下的安装和配置 前言 本Spring Boot入门样例准备工作参考: Spring B ...
- jbpm入门样例
1. jBPM的简介 jBPM是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储. 參考 http://www.jbos ...
- 图解VC++ opengl环境配置和几个入门样例
VC6下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demoproject和glut库下载 http://pan.baidu. ...
- Activiti的简单入门样例(经典的请假样例)
经典的请假样例: 流程例如以下,首先须要部门经理审批.假设请假天数大于2天,则须要总经理审批,否则HR审批就可以 一:创建maven项目,项目结构例如以下: watermark/2/text/aHR0 ...
- Direct3D 9 入门样例程序 圆锥体
介绍 Directx3D 9 什么是DirectX,非常好说了,Win32 C++ API.主要是多媒体编程方面的,长处体如今高性能了,如今我知道的版本号最高是D3D11,可是我是学习入门的,从D3D ...
- 支付宝即时到帐接口的python实现,演示样例採用django框架
因工作须要研究了支付宝即时到帐接口.并成功应用到站点上,把过程拿出来分享. 即时到帐仅仅是支付宝众多商家服务中的一个,表示客户付款,客户用支付宝付款.支付宝收到款项后,立即通知你,而且此笔款项与交易脱 ...
- kafka入门样例 for java
1,生产者 import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.Key ...
- Flume入门样例
Flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 clo ...
- RAD 极速应用开发 Spring ROO 入门样例
官网 http://projects.spring.io/spring-roo/ Spring ROO in action ...
随机推荐
- Quartz任务调度入门
Quartz任务调度入门 了解Quartz体系结构Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念 ...
- hbase学习(一)hbase简介
1.hadoop生态系统 2.hbase简介 非关系型数据库知识面扩展 cassandra.hbase.mongodb.redis couchdb,文件存储数据库 Neo4j非关系型图数据库 3.hb ...
- 强大的PHP一句话后门
强悍的PHP一句话后门 这类后门让网站.服务器管理员很是头疼,经常要换着方法进行各种检测,而很多新出现的编写技术,用普通的检测方法是没法发现并处理的. 今天我们细数一些有意思的PHP一句话木马. 1 ...
- 洛谷 P1957 口算练习题 题解
题目传送门 这道题是考字符串处理,另外输入要使用c++的cin的神奇功能. #include<bits/stdc++.h> using namespace std; int n;char ...
- MVC公开课 – 2.查询,删除 (2013-3-15广州传智MVC公开课)
查询 /Controller/HomeController.cs /// <summary> /// 查询 文章 列表 /// </summary> /// <retur ...
- [BZOJ3150][Ctsc2013]猴子 期望dp+高斯消元
3150: [Ctsc2013]猴子 Time Limit: 20 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 163 Solved: 10 ...
- js中post中文参数转码和解码
作为基础知识和血淋林的教训,前端一定要记得post请求时将参数中带有中文的部分进行转码!! var str='宋宇·特弱夫斯基'; //转码: encodeURI(encodeURI(str)) ; ...
- 免费的.NET混淆和反编译工具
免费的.NET代码混淆工具: Eazfuscator.NET http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.as ...
- 【51nod】1340 地铁环线
今天头非常疼,躲在家里没去机房 反正都要颓废了,然后花了一上午研究了一下这道神题怎么做-- 题解 首先我们发现,如果我们设\(dis[i]\)为从\(0\)节点走到\(i\)节点的距离 那么题目中给出 ...
- mysql左连接,右连接,内连接