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编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错。例如: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的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
4 可媲美JDBC的查询能力
  JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
5 支持面向对象的高级特性
  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的不同实现版本会导致配置内容不同)

   

[xhtml] view plain copy
  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,如下:

   

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

   

 

 

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

  

    

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

 

 

 

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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA详细配置与使用

文章目录一、IntelliJ IDEA 介绍二、查看安装目录结构三、查看设置目录结构3.1 config目录3.2 system目录四、设置显示常见的视图1.工程界面展示2.如何删除模块3.查看项目配置五、常用配置1.Appearance & Behavior2. Editor - General3. Editor – Font4. Editor – Color …

M1905

11.09 11&#xff1a;00------102万                          11.09 14:00---103万 11.12 16:00------103万                          11.19 16:00---94万 11.20 16:00----94.9万          …

前端又要失失失失失失失失失业了!

1. 祸起 看到标题&#xff0c;切图仔们又是菊花一紧。前几天微软刚刚开源Sketch2Code&#xff0c;让UI草图转化成HTML代码。切图仔瑟瑟发抖。 还没等切图仔调整好心情&#xff0c;号称H5代码生成工具的H5DS也开源了最新的代码。 尼玛&#xff0c;H5代码都可以一键生成了&#x…

SpringBoot 之环境搭建

见: http://bbs.itmayiedu.com/article/1491835651684 1. 什么是**SpringBoot&#xff1f;** Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人…

vue项目中axios的封装

1.安装 1 npm install axios --save 2.新建http.js&#xff0c;封装拦截器以及多种请求方式 1 import axios from axios;2 import { Message } from element-ui;3 4 // 请求拦截器5 axios.interceptors.request.use( 6 config > {7 //发送请求前需要做什么&#xff0c…

【2022】Java基础面试真题

文章目录1. Java基础1.1 为什么Java代码可以实现一次编写、到处运行&#xff1f;1.2 一个Java文件里可以有多个类吗&#xff08;不含内部类&#xff09;&#xff1f;1.3 说一说你对Java访问权限的了解1.4 介绍一下Java的数据类型1.5 int类型的数据范围是多少&#xff1f;1.6 请…

IntelliJ IDEA 中 右键新建时,选项没有Java class的解决方法和具体解释

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我是在别人问我的时候&#xff0c;才发现还可以有这个问题&#xff0c;主要是他新项目直接打开&#xff0c;什么都没配置&#xff0c;就打…

设计模式大集锦 程序员面试全攻略

摘要&#xff1a;无论你是参与Java面试还是C#面试&#xff0c;设计模式和软件设计问题在程序员面试中是必不可少的一部分。编程和设计技两者相得益彰&#xff0c;一名出色的程序员也是一名出色的设计师&#xff0c;他们懂得如何利用代码来解决问题或者软件设计&#xff0c;但是…

【2022】多线程并发编程面试真题

文章目录4. 多线程4.1 创建线程有哪几种方式&#xff1f;4.2 说说Thread类的常用方法4.3 run()和start()有什么区别&#xff1f;4.4 线程是否可以重复启动&#xff0c;会有什么后果&#xff1f;4.5 介绍一下线程的生命周期4.6 如何实现线程同步&#xff1f;4.7 说一说Java多线程…

苹果面试8大难题及答案

摘要&#xff1a;苹果这样的公司通常会在面试过程中向求职者抛出一些逻辑的问题来考研面试者&#xff0c;所以&#xff0c;如果你对进入苹果感兴趣&#xff0c;或者向往类似的公司&#xff0c;又或者只是对逻辑问题感兴趣&#xff0c;这些面试难题值得你仔细研究。 导读&#x…

ROS系统玩转自主移动机器人(3)-- 开源机器人结构介绍

ROS系统玩转自主移动机器人&#xff08;3&#xff09;-- 开源机器人结构介绍 本机器人机械结构设计相关的所有设计文件下载地址为&#xff1a;传送门 其中包含&#xff1a;三维造型设计文件&#xff08;所有零件装配效果&#xff09;&#xff08;tips&#xff1a;基于Solidwork…

【2022】JVM常见面试真题详解

文章目录5. JVM5.1 JVM包含哪几部分&#xff1f;5.2 JVM是如何运行的&#xff1f;5.3 Java程序是怎么运行的&#xff1f;5.4 本地方法栈有什么用&#xff1f;5.5 没有程序计数器会怎么样&#xff1f;5.6 说一说Java的内存分布情况5.7 类存放在哪里&#xff1f;5.8 局部变量存放…

如何在面试时写出高质量的代码

摘要&#xff1a;有些程序员由于平时没有养成良好的编程习惯&#xff0c;在面试时写出的代码质量不高&#xff0c;最终遗憾地与心仪的公司和职位失之交臂。如何在面试时能写出高质量的代码&#xff0c;是很多程序员关心的问题。 程序员在职业生涯中难免要接受编程面试。有些程序…

IntelliJ IDEA添加jar包

见&#xff1a;http://blog.csdn.net/a153375250/article/details/50851049 以JDBC-MySQL驱动包为例 1、在IntelliJ IDEA中打开要添加jar包的Project 2、File – Project Structure如下图 3、选择Moudules – 再选择Dependencies如下图 4、选中Moudule source – 然后点击2处号…

Python3 与 C# 并发编程之~ 进程篇

上次说了很多Linux下进程相关知识&#xff0c;这边不再复述&#xff0c;下面来说说Python的并发编程&#xff0c;如有错误欢迎提出&#xff5e; 如果遇到听不懂的可以看上一次的文章&#xff1a;https://www.cnblogs.com/dotnetcrazy/p/9363810.html 官方文档&#xff1a;https…

Spring全家桶面试真题

文章目录1. Spring Boot1.1 说说你对Spring Boot的理解1.2 Spring Boot Starter有什么用&#xff1f;1.3 介绍Spring Boot的启动流程1.4 Spring Boot项目是如何导入包的&#xff1f;1.5 请描述Spring Boot自动装配的过程1.6 说说你对Spring Boot注解的了解2. Spring2.1 请你说说…

WSDL测试webservice接口记录

收到一个事情&#xff0c;需要对接第三方API&#xff0c;对方给了个service&#xff0c;看了一下&#xff0c;原来是webservices的。 上一次测试webervice的接口&#xff0c;还是至少八九年前的时候了&#xff0c;这种相对比较老旧的也好久不在使用。 于是&#xff0c;简单搞了…

idea窗口下方滚动条不明显设置

在使用idea时&#xff0c;下方的滚动条老是显示不明显&#xff0c;每次点击拖拽都很费劲&#xff0c;在网上找了很多相关设置&#xff0c;最后确定了一个最好的办法解决问题&#xff1a; Shift &#xff08;上档&#xff09; 鼠标滚动&#xff0c;这样就可以横向翻滚了&#…

把握本质规律——《数学之美》作者吴军

无论是互联网&#xff0c;还是手机、电视&#xff0c;现代通信都遵循信息论的规律&#xff0c;整个信息论的基础都是数学。搜索引擎、语音识别、机器翻译也都是我们生活中离不开的技术&#xff0c;数学也是解决这些问题的最好工具。在《浪潮之巅》出版后&#xff0c;吴军将蕴含…

Hibernate4 注解方法说明

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.类级别注解 Entity 映射实体类 Table 映射数句库表 Entity(name"tableName") - 必须&#xff0c;注解将一个类声明…