淺談對象關系映射框架Hibernate

      網友投稿 799 2022-05-30

      一、什么是hibernate

      Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,是一個全自動的orm框架,它可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的JavaEE架構中取代CMP,完成數據持久化的重任。

      ORM(對象關系映射)思想,所謂的ORM就是利用描述對象和數據庫表之間的映射元數據,自動把Java應用程序的對象,持久化到關系型數據庫的表中。通過操作Java對象,就可以完成對數據庫的操作,可以把ORM理解為關系型數據庫和對象的一個紐帶,開發人員只需要關注紐帶一端映射的對象即可。

      二、Hibernate優勢

      1. Hibernate對JDBC訪問數據庫的代碼做了一個輕量級的封裝,大大簡化了數據訪問層的繁瑣操作,減少代碼的復雜度,和減少內存消耗,加快了運行速度

      2. Hibernate是一個基于JDBC的主流框架,是一個優秀ORM實現,很大程度上簡化了DAO層操作

      3. Hibernate性能較好,靈活性較高,它可以支持一對一、一對多、多對多

      4. 可擴展性強,當本身功能不夠時,可以自行編碼進行擴展

      三、Hibernate下載

      1、下載Hibernate框架

      點擊上方進入官網下載,目前最新開發版本為6.0,建議先下載5.6穩定版進行使用,新版本可能存在不確定因素。

      點擊進去后選擇zip archive即可下載

      2、hibernate解壓后的目錄

      四、創建Hibernate項目

      1、創建工程

      修改項目文件編碼格式

      在打開IDEA時點擊configure 點setting 然后找到file Encodings 將編碼全改成UTF-8 然后打勾

      創建普通的java工程項目

      2、導入jar包

      在項目目錄下新建lib目錄,將下面的jar包導入lib目錄

      導入hibernate核心jar包

      導入數據庫驅動jar包

      導入日志包

      創建一個包,把這些jar包放進去,并將全部應用到整個項目依賴庫 當前面出現的小箭頭 就說明成功了

      3、創建實體類

      package com.hbnu.pojo; public class User { //hibernate 要求實體類必須要有一個唯一屬性值 private int uid; //id號 private String username;//用戶名 private String address;//地址 public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "uid=" + uid + ", username='" + username + '\'' + ", address='" + address + '\'' + '}'; } }

      五、Hibernate配置文件

      1、映射關系配置文件

      映射關系配置文件路徑沒有限制,官方建議將映射配置文件和實體類放在同一路徑下

      映射關系配置文件名稱沒有限制,但后綴為.xml,官方建議映射關系配置文件命名為:實體類名.hbm.xml

      2、核心配置文件

      淺談對象關系映射框架Hibernate

      核心配置文件路徑必須在src目錄下

      核心配置文件名稱必須為hibernate.cfg.xml

      hibernate在工作時,會直接加載核心配置文件,不會直接加載映射關系配置文件

      com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/class1912? serverTimezone=GMT&useSSL=false&characterEncoding=utf8 root chendikai true true org.hibernate.dialect.MySQL5Dialect update

      六、hibernate運行測試

      package test; import com.hbnu.pojo.User; import com.hbnu.util.HibernateUtils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class HibernateTest { /** * 添加數據到表中 */ @Test public void insertData(){ //1. 加載hibernate配置文件(解析核心配置文件) Configuration configure = new Configuration().configure(); //2. 根據配置對象configure構建會話工廠 SessionFactory sessionFactory = configure.buildSessionFactory(); //3. 根據會話工廠創建會話對象 Session session = sessionFactory.openSession(); //4. 通過調用會話對象的相關方法執行數據庫的CRUD操作 User user = new User(); user.setUsername("123456"); user.setAddress("huangshi"); session.save(user); //操作Java中的對象,保存對象中的數據到數據庫表中 //5. 關閉會話和會話工廠 session.close(); sessionFactory.close(); }

      七、Hibernate執行過程

      1. 通過Configuration對象加載hibernate核心配置文件,間接加載映射關系配置文件

      2. 通過Configuration對象構建會話工廠SessionFactory

      3. 通過會話工廠SessionFactory對象創建會話對象Session

      4. 通過調用會話對象Session的相關方法執行數據庫的CRUD操作

      5. 關閉會話對象和會話工廠

      核心相關API

      Hibernate的API一共有6個,分別為:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通過這些接口,可以對持久化對象進行存取、事務控制。

      Session

      Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同于JSP應用中的HttpSession。這里當使用session這個術語時,其實指的是Hibernate中的session,而以后會將HttpSession對象稱為用戶session。

      1. session對象類似于JDBC中的Connection

      2. session對象有操作數據庫的相關方法

      添加 save()

      修改 update()

      刪除 delete()

      根據主鍵id查詢 get(id)

      3. session是單線程的

      SessionFactory

      SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,并負責創建Session對象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以為每個數據庫指定一個SessionFactory。sessionFactory對象的創建是通過Configruation對象,根據配置文件的配置信息創建會話工廠,同時在創建會話工廠的過程中自動創建數據庫表,這個過程是比較耗資源的。在hibernate項目中,建議一個項目只創建一次SessionFactory對象,可以通過工具類來實現

      package com.hbnu.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static Configuration configuration; private static SessionFactory sessionFactory; static { configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } public static SessionFactory getSessionFactory() { return sessionFactory; } }

      Transaction

      Transaction 接口是一個可選的API,可以選擇不使用這個接口,取而代之的是Hibernate 的設計者自己寫的底層事務處理代碼。 Transaction 接口是對實際事務實現的一個抽象,這些實現包括JDBC的事務、JTA 中的UserTransaction、甚至可以是CORBA 事務。之所以這樣設計是能讓開發者能夠使用一個統一事務的操作界面,使得自己的項目可以在不同的環境和容器之間方便地移植。

      Query

      Query接口讓你方便地對數據庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數據庫的SQL語句。Query經常被用來綁定查詢參數、限制查詢記錄數量,并最終執行查詢操作。

      Criteria

      Criteria接口與Query接口非常類似,允許創建并執行面向對象的標準化查詢。值得注意的是Criteria接口也是輕量級的,它不能在Session之外使用。

      Configuration

      Configuration 類的作用是對Hibernate 進行配置,以及對它進行啟動。在Hibernate 的啟動過程中,Configuration 類的實例首先定位映射文檔的位置,讀取這些配置,然后創建一個SessionFactory對象。雖然Configuration 類在整個Hibernate 項目中只扮演著一個很小的角色,但它是啟動hibernate 時所遇到的第一個對象。

      九、主鍵生成策略

      increment

      適用于long、short或int類型主鍵,由Hibernate提供自動遞增的方式生成唯一標識符,每次增量為1。只有當沒有其他進程向同一張表中插入數據時才可以使用,不能再多線程環境下使用

      identity

      適用于long、short或int類型主鍵,采用底層數據庫本身提供的主鍵生成標識符。在DB2、MySQL、MS SQL Server、Sybase和HypersonicSQL數據庫中可以使用該生成器,該生成器要求在數據庫中把主鍵定義成為自增類型。Oracle沒有自動增長

      sequence

      適用于long、short或int類型主鍵,Hibernate根據底層數據庫序列生成標識符。條件是數據庫支持序列。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence,MySQL這種不支持sequence

      native(掌握)

      根據底層數據庫對自動生成標識符的能力來選擇identity、sequence、hilo三種生成器中的一種,適合跨數據庫平臺開發

      uuid(掌握)

      Hibernate采用128位的UUID算法來生成標識符。該算法能夠在網絡環境中生成唯一的字符串標識符,其UUID被編碼為一個長度為32位的十六進制字符串。按照開放軟件基金會(OSF)制定的標準計算,用到了以太網卡地址、納秒級時間、芯片ID碼和許多可能的數字,uuid長度大,占用空間大,跨數據庫,不用訪問數據庫就生成主鍵值,所以效率高且能保證唯一性,移植非常方便,推薦使用。

      assigned

      由Java程序負責生成標識符,Hibernate不管理主鍵,用戶手動設置主鍵的值。如果不指定id元素的generator屬性,則默認使用該主鍵生成策略

      十、對象的CRUD

      1、查詢數據庫

      /** * *查詢數據庫表中的信息 */ @Test public void queryData(){ SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); Session session =sessionFactory.openSession(); //調用seesion中的方法查詢數據庫表 User user = session.get(User.class,1); System.out.println(user); session.close();; sessionFactory.close(); }

      可以看出hibernate此時的優勢就是自動生成sql語句,查詢到了數據庫里的數據

      2、修改數據庫

      先查詢要修改的數據,再修改數據,只要我們改變數據庫中的數據,則必須添加事務

      /** * * 修改數據庫表中的信息 */ @Test public void updateData(){ SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); Session session =sessionFactory.openSession(); Transaction transaction =session.beginTransaction(); //先查詢數據,再修改數據 只要我們對數據庫中的數據改變 則必須添加事務 User user = session.get(User.class, 1); user.setAddress("wuhan"); user.setUsername("yang"); session.update(user); transaction.commit();//提交事務 session.close();; sessionFactory.close(); }

      3.刪除數據庫的數據

      /** * 刪除數據表中信息 */ @Test public void deleteData(){ SessionFactory sessionFactory =HibernateUtils.getSessionFactory(); Session session =sessionFactory.openSession(); Transaction transaction =session.beginTransaction(); User user = session.get(User.class,1); session.delete(user); transaction.commit(); //關閉資源 sessionFactory.close(); session.close(); }

      總結

      Hibernate是關于Java對象和關系數據庫之間的聯系的話,也就是我們MVC中的數據持久層->在編寫程序中的DAO層...

      感恩能與大家在華為云遇見!希望能與大家一起在華為云社區共同成長。

      JAR Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel數據快速輸入有什么技巧
      下一篇:Redis擴展數據類型詳解
      相關文章
      国产亚洲Av综合人人澡精品| 亚洲 欧洲 自拍 另类 校园| 亚洲国产精品18久久久久久| 亚洲免费中文字幕| 4480yy私人影院亚洲| 亚洲最大福利视频网站| 亚洲国产精品无码久久SM| 亚洲中文字幕久久精品无码喷水 | 亚洲精品中文字幕乱码| 亚洲视频在线观看网址| 久久狠狠高潮亚洲精品| 亚洲视频免费在线看| 亚洲毛片免费视频| 亚洲一区二区三区91| 国产v亚洲v天堂a无| 亚洲另类无码一区二区三区| 亚洲欧美成人综合久久久| 亚洲国产精华液2020| 亚洲Aⅴ无码一区二区二三区软件| 日韩在线视精品在亚洲| 国产亚洲精品精品精品| 久久影视综合亚洲| 亚洲精品成人片在线观看精品字幕| 国产亚洲一区二区精品| 亚洲人成网站影音先锋播放| 亚洲精品欧洲精品| 亚洲精品国产精品国自产网站 | 国产偷v国产偷v亚洲高清| 亚洲成AV人片一区二区| 亚洲色偷偷偷网站色偷一区| 亚洲人成免费电影| 亚洲美国产亚洲AV| 亚洲va中文字幕无码| 337p日本欧洲亚洲大胆裸体艺术| 亚洲国产精彩中文乱码AV| 亚洲美女中文字幕| 亚洲国产乱码最新视频| 老牛精品亚洲成av人片| 久久亚洲国产成人精品无码区| 国产AV无码专区亚洲AV毛网站 | 亚洲av无码成人精品区在线播放|