Hibernate-01

来源:https://www.cnblogs.com/jackerzhou/archive/2018/10/27/9862110.html
-Advertisement-
Play Games

一、What is Hibernate? 1、hibernate框架可以理解為一個半成品項目,hibernate就是一個持久層的ORM的框架 ORM >對象關係映射(Object Relational Mapping),是對JDBC進行輕量級的對象封裝,也就是你可以按照java面向對象思路來操作。 ...


一、What is Hibernate?

  1、hibernate框架可以理解為一個半成品項目,hibernate就是一個持久層的ORM的框架

    ORM  -------->對象關係映射(Object Relational Mapping),是對JDBC進行輕量級的對象封裝,也就是你可以按照java面向對象思路來操作。

        -------->  hibernate屬於4級:完全面向對象操作資料庫、mybatis屬於2級、dbutils屬於1級(瞭解)

    java持久層框架之一,開源既免費

    目的:提高開發效率

  2、優勢:

    1. hibernate相對jdbc 訪問數據使用的代碼輕量化,採用緩存機制減少記憶體消耗、減小數據訪問的壓力、加快運行效率
    2. hibernate基於jdbc 的持久化框架,簡化啦對DAO層的編碼
    3. hibernate 性能那就沒得說啦,(會在後面的章節詳細說明)
    4. hibernate的可擴展性,別忘記他是開源的當然API也是開放的

二、準備工作

      1、導包

         2、構建資料庫

        (可以不寫入資料庫,hibernate 是可以通過對象映射生成資料庫表的

         類似於mybatis的逆向工程但是相對的)

      3、創建實體包

      4、創建配置映射文件

        1、編寫對象數據源Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
   <!-- 配置表與實體對象的關係 -->
   <!-- package屬性:填寫一個包名.在元素內部凡是需要書寫完整類名的屬性,可以直接寫簡答類名了. -->
<hibernate-mapping package="cn.itheima.domain" >
    <!-- 
        class元素: 配置實體與表的對應關係的
            name: 完整類名
            table:資料庫表名
     -->
    <class name="Customer" table="cst_customer" >
        <!-- id元素:配置主鍵映射的屬性
                name: 填寫主鍵對應屬性名
                column(可選): 填寫表中的主鍵列名.預設值:列名會預設使用屬性名
                type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
                        每個類型有三種填法: java類型|hibernate類型|資料庫類型
                not-null(可選):配置該屬性(列)是否不能為空. 預設值:false
                length(可選):配置資料庫中列的長度. 預設值:使用資料庫類型的最大長度
         -->
        <id name="cust_id"  >
            <!-- generator:主鍵生成策略(明天講) -->
            <generator class="native"></generator>
        </id>
        <!-- property元素:除id之外的普通屬性映射
                name: 填寫屬性名
                column(可選): 填寫列名
                type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
                        每個類型有三種填法: java類型|hibernate類型|資料庫類型
                not-null(可選):配置該屬性(列)是否不能為空. 預設值:false
                length(可選):配置資料庫中列的長度. 預設值:使用資料庫類型的最大長度
         -->
        <property name="cust_name" column="cust_name" ></property>
        <property name="cust_source" column="cust_source" ></property>
        <property name="cust_industry" column="cust_industry" ></property>
        <property name="cust_level" column="cust_level" ></property>
        <property name="cust_linkman" column="cust_linkman" ></property>
        <property name="cust_phone" column="cust_phone" ></property>
        <property name="cust_mobile" column="cust_mobile" ></property>
    </class>
</hibernate-mapping>

      2.hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
    
        <!-- 
    name屬性取值: #hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect #hibernate.connection.driver_class com.mysql.jdbc.Driver #hibernate.connection.url jdbc:mysql:///test #hibernate.connection.username gavin #hibernate.connection.password
--> <!-- 資料庫驅動 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 資料庫url --> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property> <!-- 資料庫連接用戶名 --> <property name="hibernate.connection.username">root</property> <!-- 資料庫連接密碼 --> <property name="hibernate.connection.password">root</property> <!-- 資料庫方言 不同的資料庫中,sql語法略有區別. 指定方言可以讓hibernate框架在生成sql語句時.針對資料庫的方言生成. sql99標準: DDL 定義語言 庫表的增刪改查 DCL 控制語言 事務 許可權 DML 操縱語言 增刪改查 註意: MYSQL在選擇方言時,請選擇最短的方言. --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- #hibernate.show_sql true #hibernate.format_sql true --><!-- 將hibernate生成的sql語句列印到控制台 --> <property name="hibernate.show_sql">true</property> <!-- 將hibernate生成的sql語句格式化(語法縮進) --> <property name="hibernate.format_sql">true</property> <!-- ## auto schema export 自動導出表結構. 自動建表 #hibernate.hbm2ddl.auto create 自動建表.每次框架運行都會創建新的表.以前表將會被覆蓋,表數據會丟失.(開發環境中測試使用) #hibernate.hbm2ddl.auto create-drop 自動建表.每次框架運行結束都會將所有表刪除.(開發環境中測試使用) #hibernate.hbm2ddl.auto update(推薦使用) 自動生成表.如果已經存在不會再生成.如果表有變動.自動更新表(不會刪除任何數據). #hibernate.hbm2ddl.auto validate 校驗.不自動生成表.每次啟動會校驗資料庫中表是否正確.校驗失敗. --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 引入orm元數據 路徑書寫: 填寫src下的路徑 --> <mapping resource="cn/itheima/domain/Customer.hbm.xml" /> </session-factory> </hibernate-configuration>

3、Test

//測試Hibernate框架
public class Demo {

    @Test
    //保存客戶
    public void function1(){
        Configuration conf_test = new Configuration().configure();
        
        SessionFactory sessionFactory = conf_test.buildSessionFactory();
        
        Session session = sessionFactory.openSession();
    
        Transaction tx = session.beginTransaction();
        //----------------------------------------------
        Customer c = new Customer();
        c.setCust_name("阿裡");
        
        session.save(c);//執行保存
        
        //----------------------------------------------
        tx.commit();//提交
        session.close();//關閉session緩存
        sessionFactory.close();//關閉sessionFactory對象
    }
}

三、參數介紹(API)

1、Configuration(瞭解)

  

 //Configuration功能: 配置載入類.用於載入主配置,orm元數據載入
public void dome(){
  // 創建空構造
  Configuration conf_add = new Confguration();
  //讀取hibernate.cfg.xml
  conf_add.configure();
  //創建SessionFactory 對象
  SessionFactory sf = conf.buildSessionFactory();
}

 

2、SessionFactory------>session工廠

/* SessionFactory功能: 用於創建操作資料庫核心對象session對象的工廠.
  創建session對象
  註意:1.sessionFactory 負責保存和使用所有配置信息.消耗記憶體資源非常大.
     2.sessionFactory屬於線程安全的對象設計.
  結論: 保證在web項目中,只創建一個sessionFactory.

*/

public void fun(){

  Configuration conf = new Configuration();

  SessionFactory sf = conf.buildSessionFactory();

  //打開一個新的session對象
   sf.openSession();
  //獲得一個與線程綁定的session對象
  sf.getCurrentSession();

}

 

 

3、Session

重點

/*
缺陷:
    Session 的線程並是安全的,多併發同時操作一個session時會導致類似於幻讀
解決:在設計軟體架構時因避免多個線程共用一個session
優勢(jdbc):
輕量,實例的創建和銷毀不消耗過多資源
Session 緩存(hibernate一級緩存):
    目的:存放當前工作單元載入的對象
    常用方法:
           save(),update() 和 saveOrUpdate():
          delete()
        createQuery() 和 createSQLQuery:用於操作資料庫
       create Criteria()條件插詢
*/            
Session介紹

 

/*
session對象功能: 表達hibernate框架與資料庫之間的連接(話).
session類似於JDBC年代的connection對象.
還可以完成對數據/庫中數據的增刪改查操作session是hibernate操作資料庫的核心對象
*/ @Test //事務操作 public void fun1(){ //1 創建,調用空參構造 Configuration conf = new Configuration().configure(); //2 根據配置信息,創建 SessionFactory對象 SessionFactory sf = conf.buildSessionFactory(); //3 獲得session Session session = sf.openSession(); //4 session獲得操作事務的Transaction對象 //獲得操作事務的tx對象 //Transaction tx = session.getTransaction(); //開啟事務並獲得操作事務的tx對象(建議使用) Transaction tx2 = session.beginTransaction(); //---------------------------------------------- //---------------------------------------------- tx2.commit();//提交事務 tx2.rollback();//回滾事務 session.close();//釋放資源 sf.close();//釋放資源 }

 

 

4、 HibernateUtils

public class HibernateUtils {
  private static SessionFactory sf;

  static{
  //1 創建,調用空參構造
  Configuration conf = new Configuration().configure();
  //2 根據配置信息,創建 SessionFactory對象
  sf = conf.buildSessionFactory();
  }

  //獲得session => 獲得全新session
  public static Session openSession(){
  //3 獲得session
  Session session = sf.openSession();

  return session;

  }
  //獲得session => 獲得與線程綁定的session
  public static Session getCurrentSession(){
  //3 獲得session
  Session session = sf.getCurrentSession();

  return session;
  }
  public static void main(String[] args) {
  System.out.println(HibernateUtils.openSession());
  }

}

 

 

           


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mkfs 在磁碟分區上創建ext2、ext3、ext4、ms-dos、vfat文件系統,預設情況下會創建ext2。mkfs用於在設備上構建Linux文件系統,通常是硬碟分區。文件要麼是設備名稱(例如/dev/hda1,/dev/sdb2),要麼是包含文件系統的常規文件。成功返回0,失敗返回1。 實際 ...
  • 有時候,管理員終端登陸了系統,如果離開沒有退出賬戶,則會有安全隱患存在,因此需要優化終端超時。 設置終端超時: export TMOUT=10 永久生效: echo "export TMOUT=600" >>/etc/profile source /etc/profile 檢查是否生效: ...
  • 目的:表操作(表維護) 一、一對一(略過) 二、一對 1、建表原則:在多的一方創建外鍵指向一的一方的外鍵 2、建表:實體中添加 3、操作 1、參數: name屬性:集合屬性名 column屬性: 外鍵列名 class屬性: 與我關聯的對象完整類名 2、級聯操作: cascade save-updat ...
  • Spark 中有兩個類似的api,分別是 reduceByKey 和 groupByKey 。這兩個的功能類似,但底層實現卻有些不同,那麼為什麼要這樣設計呢?我們來從源碼的角度分析一下。 先看兩者的調用順序(都是使用預設的Partitioner,即defaultPartitioner) 所用 spa ...
  • 【前言】在配置主從的時候經常會用到這兩個語句,剛開始的時候還不清楚這兩個語句的使用特性和使用場景。 經過測試整理了以下文檔,希望能對大家有所幫助; 【一】RESET MASTER參數 功能說明:刪除所有的binglog日誌文件,並將日誌索引文件清空,重新開始所有新的日誌文件。用於第一次進行搭建主從庫 ...
  • 在查詢了很多資料以後,發現國內外沒有一篇關於hadoop2集群環境搭建的詳細步驟的文章。 所以,我想把我知道的分享給大家,方便大家交流。 ...
  • 一 .概述 SQL Server 將某些系統事件和用戶定義事件記錄到 SQL Server 錯誤日誌和 Microsoft Windows 應用程式日誌中。 這兩種日誌都會自動給所有記錄事件加上時間戳。 使用 SQL Server 錯誤日誌中的信息可以解決SQL Server的相關問題。 查看 SQ ...
  • 現象 新建了一張員工表,插入了少量數據,索引中所有的欄位均在where條件出現時,正確走到了idx_nap索引,但是where出現部分自左開始的索引時,卻進行全表掃描,與MySQL官方所說的最左匹配原則“相悖”。 數據背景 sql CREATE TABLE ( int(11) NOT NULL AU ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...