欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
JPA入門(mén)例子(采用JPA的hibernate實(shí)現版本)

(1)、JPA介紹:

      JPA全稱(chēng)為Java Persistence API ,Java持久化API是Sun公司在Java EE 5規范中提出的Java持久化接口。JPA吸取了目前Java持久化技術(shù)的優(yōu)點(diǎn),旨在規范、簡(jiǎn)化Java對象的持久化工作。使用JPA持久化對象,并不是依賴(lài)于某一個(gè)ORM框架。

     為什么要使用JAP?
      在說(shuō)為什么要使用JPA之前,我們有必要了解為什么要使用ORM技術(shù)。

ORM 是Object-Relation-Mapping,即對象關(guān)系影射技術(shù),是對象持久化的核心。ORM是對JDBC的封裝,從而解決了JDBC的各種存在問(wèn)題:

a) 繁瑣的代碼問(wèn)題

用JDBC的API編程訪(fǎng)問(wèn)數據庫,代碼量較大,特別是訪(fǎng)問(wèn)字段較多的表的時(shí)候,代碼顯得繁瑣、累贅,容易出錯。例如:PreparedStatement pstmt=con.prepareStatment("insert into account value(?,?,?,?,?,?,?,?,?)");

ORM則建立了Java對象與數據庫對象之間的影射關(guān)系,程序員不需要編寫(xiě)復雜的SQL語(yǔ)句,直接操作Java對象即可,從而大大降低了代碼量,也使程序員更加專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現。

b) 數據庫對象連接問(wèn)題

關(guān)系數據對象之間,存在各種關(guān)系,包括1對1、1對多、多對1、多對多、級聯(lián)等。在數據庫對象更新的時(shí)候,采用JDBC編程,必須十分小心處理這些關(guān)系,以保證維持這些關(guān)系不會(huì )出現錯誤,而這個(gè)過(guò)程是一個(gè)很費時(shí)費力的過(guò)程。

ORM建立Java對象與數據庫對象關(guān)系影射的同時(shí),也自動(dòng)根據數據庫對象之間的關(guān)系創(chuàng )建Java對象的關(guān)系,并且提供了維持這些關(guān)系完整、有效的機制。

c) 系統架構問(wèn)題

JDBC屬于數據訪(fǎng)問(wèn)層,但是使用JDBC編程時(shí),必須知道后臺是用什么數據庫、有哪些表、各個(gè)表有有哪些字段、各個(gè)字段的類(lèi)型是什么、表與表之間什么關(guān)系、創(chuàng )建了什么索引等等與后臺數據庫相關(guān)的詳細信息。

使用ORM技術(shù),可以將數據庫層完全隱蔽,呈獻給程序員的只有Java的對象,程序員只需要根據業(yè)務(wù)邏輯的需要調用Java對象的Getter和 Setter方法,即可實(shí)現對后臺數據庫的操作,程序員不必知道后臺采用什么數據庫、有哪些表、有什么字段、表與表之間有什么關(guān)系。

d) 性能問(wèn)題

采用JDBC編程,在很多時(shí)候存在效率低下的問(wèn)題。

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();
       }

以上程序將向后臺數據庫發(fā)送1000次SQL語(yǔ)句執行請求,運行效率較低。

采用ORM技術(shù),ORM框架將根據具體數據庫操作需要,會(huì )自動(dòng)延遲向后臺數據庫發(fā)送SQL請求,ORM也可以根據實(shí)際情況,將數據庫訪(fǎng)問(wèn)操作合成,盡量減少不必要的數據庫操作請求。

 

JPA是目前比較流行的一種ORM技術(shù)之一,所以他擁有ORM技術(shù)的各種特點(diǎn),當然他還有自己的一些優(yōu)勢:

1 標準化
  JPA 是 JCP 組織發(fā)布的 Java EE 標準之一,因此任何聲稱(chēng)符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪(fǎng)問(wèn) API,這保證了基于JPA開(kāi)發(fā)的企業(yè)應用能夠經(jīng)過(guò)少量的修改就能夠在不同的JPA框架下運行。
2 對容器級特性的支持
  JPA 框架中支持大數據集、事務(wù)、并發(fā)等容器級事務(wù),這使得 JPA 超越了簡(jiǎn)單持久化框架的局限,在企業(yè)應用發(fā)揮更大的作用。
3 簡(jiǎn)單易用,集成方便
  JPA的主要目標之一就是提供更加簡(jiǎn)單的編程模型:在JPA框架下創(chuàng )建實(shí)體和創(chuàng )建Java 類(lèi)一樣簡(jiǎn)單,沒(méi)有任何的約束和限制,只需要使用 javax.persistence.Entity進(jìn)行注釋?zhuān)籎PA的框架和接口也都非常簡(jiǎn)單,沒(méi)有太多特別的規則和設計模式的要求,開(kāi)發(fā)者可以很容易的掌握。JPA基于非侵入式原則設計,因此可以很容易的和其它框架或者容器集成。
4 可媲美JDBC的查詢(xún)能力
  JPA的查詢(xún)語(yǔ)言是面向對象而非面向數據庫的,它以面向對象的自然語(yǔ)法構造查詢(xún)語(yǔ)句,可以看成是Hibernate HQL的等價(jià)物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實(shí)體的一種查詢(xún)語(yǔ)言,操作對象是實(shí)體,而不是關(guān)系數據庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢(xún)特性,甚至還能夠支持子查詢(xún)。
5 支持面向對象的高級特性
  JPA 中能夠支持面向對象的高級特性,如類(lèi)之間的繼承、多態(tài)和類(lèi)之間的復雜關(guān)系,這樣的支持能夠讓開(kāi)發(fā)者最大限度的使用面向對象的模型設計企業(yè)應用,而不需要自行處理這些特性在關(guān)系數據庫的持久化。

 

 

(2)、具體例子

    完成工程后工程結構如下圖:

   

 (注意:persistence.xml文件的位置決定持久性的根(Persistence Root)。持久性的根為JAR文件或者包含META-INF目錄(前提是persistence.xml位于此)的目錄。一般將這個(gè)persistence.xml文件放在src下的META-INF中。命名及位置都不能變)

 

a)、導入相關(guān)jar包(見(jiàn)上圖)和創(chuàng )建META-INF和persistence.xml文件.

persistence.xml配置如下:(我用的數據為mysql,采用不同數據庫及JPA的不同實(shí)現版本會(huì )導致配置內容不同)

   

  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)、編寫(xiě)實(shí)體bean,如下:

   

[c-sharp] view plaincopy
  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)、編寫(xiě)junit測試代碼,如下:

  

    

  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狀態(tài)  
  30.         person.setName("zhang san");  
  31.         em.persist(person); //持久化實(shí)體  
  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.class, 1);  
  43.         person.setName("hmk"); //person為托管狀態(tài)  
  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.class, 1);  
  54.         em.clear(); //把實(shí)體管理器中的所有實(shí)體變?yōu)槊摴軤顟B(tài)  
  55.         person.setName("hmk2");  
  56.         em.merge(person); //把脫管狀態(tài)變?yōu)橥泄軤顟B(tài),merge可以自動(dòng)選擇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.class, 1);  
  67.         em.remove(person); //刪除實(shí)體  
  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.class, 2); //類(lèi)似于hibernate的get方法,沒(méi)找到數據時(shí),返回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.class, 2); //類(lèi)似于hibernate的load方法,延遲加載.沒(méi)相應數據時(shí)會(huì )出現異常  
  85.         System.out.println(person.getName()); //真正調用時(shí)才查找數據  
  86.         em.close();  
  87.         factory.close();  
  88.     }  
  89. }  

 

 

d)、運行junit測試代碼里的相應方法就行可以。

 

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JPA重整ORM山河
JPA 一對一關(guān)聯(lián)
一起來(lái)學(xué) SpringBoot 2.x | 第六篇:整合 Spring Data JPA
Spring 與 EJB 比較
Spring——集成JPA
Java開(kāi)發(fā)者必讀的5本最佳Hibernate書(shū)籍
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久