分类: j2se2011-03-30 16:09 45838人阅读 评论(9) 收藏 举报
  1. 1)、JPA介绍:
  2.  
  3. JPA全称为Java Persistence API Java持久化APISun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。
  4.  
  5. 为什么要使用JAP?
  6. 在说为什么要使用JPA之前,我们有必要了解为什么要使用ORM技术。
  7.  
  8. ORM Object-Relation-Mapping,即对象关系影射技术,是对象持久化的核心。ORM是对JDBC的封装,从而解决了JDBC的各种存在问题:
  9.  
  10. a) 繁琐的代码问题
  11.  
  12. JDBCAPI编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错。例如:PreparedStatement pstmt=con.prepareStatment("insert into account value(?,?,?,?,?,?,?,?,?)");
  13.  
  14. ORM则建立了Java对象与数据库对象之间的影射关系,程序员不需要编写复杂的SQL语句,直接操作Java对象即可,从而大大降低了代码量,也使程序员更加专注于业务逻辑的实现。
  15.  
  16. b) 数据库对象连接问题
  17.  
  18. 关系数据对象之间,存在各种关系,包括111对多、多对1、多对多、级联等。在数据库对象更新的时候,采用JDBC编程,必须十分小心处理这些关系,以保证维持这些关系不会出现错误,而这个过程是一个很费时费力的过程。
  19.  
  20. ORM建立Java对象与数据库对象关系影射的同时,也自动根据数据库对象之间的关系创建Java对象的关系,并且提供了维持这些关系完整、有效的机制。
  21.  
  22. c) 系统架构问题
  23.  
  24. JDBC属于数据访问层,但是使用JDBC编程时,必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、创建了什么索引等等与后台数据库相关的详细信息。
  25.  
  26. 使用ORM技术,可以将数据库层完全隐蔽,呈献给程序员的只有Java的对象,程序员只需要根据业务逻辑的需要调用Java对象的Getter Setter方法,即可实现对后台数据库的操作,程序员不必知道后台采用什么数据库、有哪些表、有什么字段、表与表之间有什么关系。
  27.  
  28. d) 性能问题
  29.  
  30. 采用JDBC编程,在很多时候存在效率低下的问题。
  31.  
  32. pstmt =conn.prepareStatement("insert into user_info values(?,?)");
  33. for (int i=0; i<1000; i++) {
  34. pstmt.setInt(1,i);
  35. pstmt.setString(2,"User"+i.toString());
  36. pstmt.executeUpdate();
  37. }
  38.  
  39. 以上程序将向后台数据库发送1000SQL语句执行请求,运行效率较低。
  40.  
  41. 采用ORM技术,ORM框架将根据具体数据库操作需要,会自动延迟向后台数据库发送SQL请求,ORM也可以根据实际情况,将数据库访问操作合成,尽量减少不必要的数据库操作请求。
  42.  
  43. JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势:
  44.  
  45. 1 标准化
  46.   JPA JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
  47. 2 对容器级特性的支持
  48.   JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
  49. 3 简单易用,集成方便
  50.   JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
  51. 4 可媲美JDBC的查询能力
  52.   JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQLJava Persistence Query Language),JPQLEJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOINGROUP BYHAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
  53. 5 支持面向对象的高级特性
  54.   JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。

(2)、具体例子

完成工程后工程结构如下图:

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

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

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

  1. <persistence xmlns="http://java.sun.com/xml/ns/persistence"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_version=1">
  4. <persistence-unit name="mysqlJPA" transaction-type="RESOURCE_LOCAL">
  5. <properties>
  6. <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
  7. <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
  8. <property name="hibernate.connection.username" value="root" />
  9. <property name="hibernate.connection.password" value="123456" />
  10. <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db1" />
  11. <property name="hibernate.max_fetch_depth" value="3" />
  12. <property name="hibernate.hbm2ddl.auto" value="update" />
  13. </properties>
  14. </persistence-unit>
  15. </persistence>

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

  1. package com.hmk.bean;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.Id;
  6. @Entity
  7. public class Person {
  8. private int id;
  9. private String name;
  10. @Id @GeneratedValue
  11. public int getId() {
  12. return id;
  13. }
  14. public void setId(int id) {
  15. this.id = id;
  16. }
  17. @Column(length=12)
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. }

c)、编写junit测试代码,如下:

  1. package junit.test;
  2. import javax.persistence.EntityManager;
  3. import javax.persistence.EntityManagerFactory;
  4. import javax.persistence.Persistence;
  5. import org.junit.BeforeClass;
  6. import org.junit.Test;
  7. import com.hmk.bean.Person;
  8. public class JpaTest {
  9. @BeforeClass
  10. public static void setUpBeforeClass() throws Exception {
  11. }
  12. @Test public void createTable(){
  13. //可以验证生成表是否正确
  14. EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
  15. factory.close();
  16. }
  17. @Test public void save(){
  18. EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
  19. EntityManager em = factory.createEntityManager();
  20. em.getTransaction().begin();
  21. Person person = new Person(); //person为new状态
  22. person.setName("zhang san");
  23. em.persist(person); //持久化实体
  24. em.getTransaction().commit();
  25. em.close();
  26. factory.close();
  27. }
  28. //new 、托管、脱管、删除
  29. @Test public void update(){
  30. EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
  31. EntityManager em = factory.createEntityManager();
  32. em.getTransaction().begin();
  33. Person person = em.find(Person.class, 1);
  34. person.setName("hmk"); //person为托管状态
  35. em.getTransaction().commit();
  36. em.close();
  37. factory.close();
  38. }
  39. @Test public void update2(){
  40. EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
  41. EntityManager em = factory.createEntityManager();
  42. em.getTransaction().begin();
  43. Person person = em.find(Person.class, 1);
  44. em.clear(); //把实体管理器中的所有实体变为脱管状态
  45. person.setName("hmk2");
  46. em.merge(person); //把脱管状态变为托管状态,merge可以自动选择insert or update 数据
  47. em.getTransaction().commit();
  48. em.close();
  49. factory.close();
  50. }
  51. @Test public void remove(){
  52. EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
  53. EntityManager em = factory.createEntityManager();
  54. em.getTransaction().begin();
  55. Person person = em.find(Person.class, 1);
  56. em.remove(person); //删除实体
  57. em.getTransaction().commit();
  58. em.close();
  59. factory.close();
  60. }
  61. @Test public void find(){
  62. EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
  63. EntityManager em = factory.createEntityManager();
  64. Person person = em.find(Person.class, 2); //类似于hibernate的get方法,没找到数据时,返回null
  65. System.out.println(person.getName());
  66. em.close();
  67. factory.close();
  68. }
  69. @Test public void find2(){
  70. EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
  71. EntityManager em = factory.createEntityManager();
  72. Person person = em.getReference(Person.class, 2); //类似于hibernate的load方法,延迟加载.没相应数据时会出现异常
  73. System.out.println(person.getName()); //真正调用时才查找数据
  74. em.close();
  75. factory.close();
  76. }
  77. }

d)、运行junit测试代码里的相应方法就行可以。

JPA入门例子(采用JPA的hibernate实现版本) --- 会伴随 配置文件:persistence.xml的更多相关文章

  1. JPA入门例子(采用JPA的hibernate实现版本) 转

    JPA入门例子(采用JPA的hibernate实现版本) jpahibernate数据库jdbcjava框架(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化 ...

  2. JPA入门例子(采用JPA的hibernate实现版本)

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

  3. JavaEE学习之JPA中配置文件persistence.xml

    下面是我从网上找到的关于JPA配置文件persistence.xml的相关描述: <?xml version="1.0" encoding="UTF-8" ...

  4. JPA的配置文件persistence.xml参数详解

    <?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0&q ...

  5. Spring Data JPA入门

    1. Spring Data JPA是什么 它是Spring基于ORM框架.JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常用功能, ...

  6. JPA 入门程序及相关注解

    1. 概述 JPA(Java Persistence API):用于对象持久化的API; JPA本质上是一种ORM规范,不是ORM框架;提供了一些编程的API接口; Hibernate是实现; 1.1 ...

  7. Spring Data JPA 入门篇

    Spring Data JPA是什么 它是Spring基于ORM框架(如hibernate,Mybatis等).JPA规范(Java Persistence API)封装的一套 JPA应用框架,可使开 ...

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

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

  9. JPA学习笔记1——JPA基础

    1.JPA简介: Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现.JPA是sun提出的一 ...

随机推荐

  1. Journal of Proteome Research | Quantitative Subcellular Proteomics of the Orbitofrontal Cortex of Schizophrenia Patients (精神分裂症病人眶额叶皮层亚细胞结构的定量蛋白质组学研究)(解读人:王聚)

    期刊名:Journal of Proteome Research 发表时间:(2019年10月) IF:3.78 单位: 里约热内卢联邦大学 坎皮纳斯州立大学 坎皮纳斯州立大学神经生物学中心 卡拉博大 ...

  2. Topshelf+Quartz3.0基于控制台应用程序快速开发可调度windows服务

    1.TopShelf TopShelf是一个开源的跨平台的宿主服务框架.可通过.Net Core/.Net Framwork控制台应用程序快速开发windows服务,更加便于服务调试. 本文基于.Ne ...

  3. vunlhub-DC-1-LinuxSuid提权

    将靶场搭建起来 桥接看不到IP 于是用masscan 进行C段扫描 试试80 8080 访问之后发现是个drupal 掏出msf搜索一波 使用最近年限的exp尝试 exploit/unix/webap ...

  4. 洛谷3834 hdu2665主席树模板,动态查询区间第k小

    题目链接:https://www.luogu.com.cn/problem/P3834 对于区间查询第k小的问题,在区间数量达到5e5的时候是难以用朴素数据结构实现的,这时候主席树就应运而生了,主席树 ...

  5. 为arm-unknown-linux-gnueabi-gcc工具链添加常用库(zlib、libpng、libjpeg、libtiff、libtool)(转载)

    主机环境: RHEL6.0 kernel 2.6.32-220.2.1.el6.i686 gcc-4.4.6   1.zlib http://sourceforge.net/projects/libp ...

  6. Git提交代码的流程——新手适用

    pull:是下拉代码,相等于将远程的代码下载到你本地,与你本地的代码合并push:是推代码,将你的代码上传到远程的动作完整的流程是: 第一种方法:(简单易懂) 1.git add .(后面有一个点,意 ...

  7. pywin32解析office文档

    from win32com.client import Dispatch xlApp = Dispatch("Excel.Application") xlApp.Visible = ...

  8. ​GAN的五大有趣应用

    引言 你能看出这张照片中面部的共同点吗? 这些人都不是真实存在的!这些面部图像都是由GAN技术生成的. "GAN"这个词是由Ian Goodfellow在2014年提出的,但相关概 ...

  9. 【Pytest01】全网最全最新的Pytest框架快速入门

    一.Pytest简介pytest是一个非常成熟的全功能的Python测试框架,主要有一下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,还可以用来做seleni ...

  10. coding++:java-HashMap的负载因子为什么默认是0.75?

    本篇文章基于JDK1.8,特在此说明 1):负载因子的作用 负载因子是和扩容机制有关的,意思是如果当前容器的容量,达到了我们设定的最大值,就要开始执行扩容操作.举个例子来解释,避免小白听不懂: 比如说 ...