<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    superwei

    導航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    Hibernate的原理與配置快速入門(1)

    也許你聽說過Hibernate的大名,但可能一直不了解它,也許你一直渴望使用它進行開發,那么本文正是你所需要的!在本文中,我向大家重點介紹Hibernate的核心API調用庫,并講解一下它的基本配置。

      看完本文后,我相信你對什么是ORM(對像/關系映射)以及它的優點會有一個深刻的認識,我們先通過一個簡單的例子開始來展現它的威力。

      正如一些傳統的經典計算機文章大都會通過一個“hello,world”的例子開始講解一樣,我們也不例外,我們也將從一個相對簡單的例子來闡述Hibernate的開發方法,但如果要真正闡述Hibernate的一些重要思想,僅僅靠在屏幕上打印一些字符是遠遠不夠的,在我們的示例程序中,我們將創建一些對象,并將其保存在數據庫中,然后對它們進行更新和查詢。

    “Hello World” “Hello world”示例程序讓您對Hibernate有一個簡單的認識
    理解Hibernate的架構 介紹Hibernate接口的主要功能。
    核心接口 Hibernate有5個核心接口,通過這幾個接口開發人員可以存儲和獲得持久對象,并且能夠進行事務控制
    一個重要的術語:Type Type是Hibernate發明者發明的一個術語,它在整個構架中是一個非常基礎、有著強大功能的元素,一個Type對象能將一個Java類型映射到數據庫中一個表的字段中去。
    策略接口 Hibernate與某些其它開源軟件不同的還有一點――高度的可擴展性,這通過它的內置策略機制來實現。
    基礎配置 Hibernate可以配置成可在任何Java環境中運行,一般說來,它通常被用在2-3層的C/S模式的項目中,并被部署在服務端。
    創建一個SessionFactory對象 要創建一個SessionFactory對象,必須在Hibernate初始化時創建一個Configuration類的實例,并將已寫好的映射文件交由它處理。

      “Hello World”

      Hibernate應用程序定義了一些持久類,并且定義了這些類與數據庫表格的映射關系。在我們這個“Hello world”示例程序中包含了一個類和一個映射文件。讓我們看看這個簡單的持久類包含有一些什么?映射文件是怎樣定義的?另外,我們該怎樣用Hibernate來操作這個持久類。

      我們這個簡單示例程序的目的是將一些持久類存儲在數據庫中,然后從數據庫取出來,并將其信息正文顯示給用戶。其中Message正是一個簡單的持久類:,它包含我們要顯示的信息,其源代碼如下:

      列表1 Message.Java 一個簡單的持久類

    package hello;
    public class Message {
     private Long id;
     private String text;
     private Message nextMessage;
     private Message() {}
     public Message(String text) {
      this.text = text;
     }
     public Long getId() {
      return id;
     }
     private void setId(Long id) {
      this.id = id;
     }
     public String getText() {
      return text;
     }
     public void setText(String text) {
      this.text = text;
     }
     public Message getNextMessage() {
      return nextMessage;
     }
     public void setNextMessage(Message nextMessage) {
      this.nextMessage = nextMessage;
     }
    }


      Message類有三個屬性:Message的id 、消息正文、以及一個指向下一條消息的指針。其中id屬性讓我們的應用程序能夠唯一的識別這條消息,通常它等同于數據庫中的主鍵,如果多個Message類的實例對象擁有相同的id,那它們代表數據庫某個表的同一個記錄。在這里我們選擇了長整型作為我們的id值,但這不是必需的。Hibernate允許我們使用任意的類型來作為對象的id值,在后面我們會對此作詳細描述。

      你可能注意到Message類的代碼類似于JavaBean的代碼風格,并且它有一個沒有參數的構造函數,在我們以后的代碼中我將繼續使用這種風格來編寫持久類的代碼。

      Hibernate會自動管理Message類的實例,并通過內部機制使其持久化,但實際上Message對象并沒有實現任何關于Hibernate的類或接口,因此我們也可以將它作為一個普通的Java類來使用:

    Message message = new Message("Hello World");
    System.out.println( message.getText() );


      以上這段代碼正是我們所期望的結果:它打印“hello world”到屏幕上。但這并不是我們的最終目標;實際上Hibernate與諸如EJB容器這樣的環境在持久層實現的方式上有很大的不同。我們的持久類(Message類)可以用在與容器無關的環境中,不像EJB必須要有EJB容器才能執行。為了能更清楚地表現這點,以下代碼將我們的一個新消息保存到數據庫中去:

    Session session = getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    Message message = new Message("Hello World");
    session.save(message);
    tx.commit();
    session.close();


      以上這段代碼調用了Hibernate的Session和Transaction接口(關于getSessionFactory()方法我們將會馬上提到)。它相當于我們執行了以下SQL語句:

    insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID)
    values (1, 'Hello World', null)


      在以上的SQL語句中,MESSAGE_ID字段到底被初始化成了什么值呢?由于我們并沒有在先前的代碼中為message對象的id屬性賦與初始值,那它是否為null呢?實際上Hibernate對id屬性作了特殊處理:由于它是一個對象的唯一標識,因此當我們進行save()調用時,Hibernate會為它自動賦予一個唯一的值(我們將在后面內容中講述它是如何生成這個值的)。

      我們假設你已經在數據庫中創建了一個名為MESSAGE的表,那么既然前面這段代碼讓我們將Message對象存入了數據庫中,那么現在我們就要將它們一一取出來。下面這段代碼將按照字母順序,將數據庫中的所有Message對象取出來,并將它們的消息正文打印到屏幕上:

    Session newSession = getSessionFactory().openSession();
    Transaction newTransaction = newSession.beginTransaction();
    List messages =newSession.find("from Message as m order by m.text asc");
    System.out.println( messages.size() + " message(s) found:" );
    for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
     Message message = (Message) iter.next();
     System.out.println( message.getText() );
    }
    newTransaction.commit();
    newSession.close();


      在以上這段代碼中,你可能被find()方法的這個參數困擾著:"from Message as m order by m.text asc",其實它是Hibernate自己定義的查詢語言,全稱叫Hibernate Query Language(HQL)。通俗地講HQL與SQL的關系差不多就是方言與普通話之間的關系,咋一看,你會覺得它有點類似于SQL語句。其實在find()調用時,Hibernate會將這段HQL語言翻譯成如下的SQL語句:

    select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID
    from MESSAGES m
    order by m.MESSAGE_TEXT asc


      以下就是運行結果:

    1 message(s) found:
    Hello World


      如果你以前沒有ORM(對象-關系映射)的開發經驗,那你可能想在代碼的某個地方去尋找這段SQL語句,但在Hibernate中你可能會失望:它根本不存在!所有就SQL語句都是Hibernate動態生成的。

      也許你會覺得還缺點什么,對!僅憑以上代碼Hibernate是無法將我們的Message類持久化的。我們還需要一些更多的信息,這就是映射定義表!這個表在Hibernate中是以XML格式來體現的,它定義了Message類的屬性是怎樣與數據庫中的MESSAGES表的字段進行一一對應的,列表2是這個示例程序的映射配置文件清單:

      列表2:示例程序的對象-關系映射表

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
    <hibernate-mapping>
    <class name="hello.Message" table="MESSAGES">
     <id name="id" column="MESSAGE_ID">
      <generator class="increment"/>
     </id>
     <property name="text" column="MESSAGE_TEXT"/>
     <many-to-one name="nextMessage" cascade="all" column="NEXT_MESSAGE_ID"/>
    </class>
    </hibernate-mapping>


      以上這個文檔告訴Hibernate怎樣將Message類映射到MESSAGES表中,其中Message類的id屬性與表的MESSAGE_ID字段對應,text屬性與表的MESSAGE_TEXT字段對應,nextMessage屬性是一個多對一的關系,它與表中的NEXT_MESSAGE_ID相對應。

      相對于有些開源項目來說,Hibernate的配置文件其實是很容易理解的。你可以輕松地修改與維護它。只要你定義好了持久類與數據庫中表字段的對應關系就行了,Hibernate會自動幫你生成SQL語句來對Message對象進行插入、更新、刪除、查找工作,你可以不寫一句SQL語句,甚至不需要懂得SQL語言!

      現在讓我們做一個新的試驗,我們先取出第一個Message對象,然后修改它的消息正文,最后我們再生成一個新的Message對象,并將它作為第一個Message對象的下一條消息,其代碼如下:

      列表3 更新一條消息

    Session session = getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    // 1 is the generated id of the first message
    Message message =(Message) session.load( Message.class, new Long(1) );
    message.setText("Greetings Earthling");
    Message nextMessage = new Message("Take me to your leader (please)");
    message.setNextMessage( nextMessage );
    tx.commit();
    session.close();


      以上這段代碼在調用時,Hibernate內部自動生成如下的SQL語句:

    select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID
    from MESSAGES m
    where m.MESSAGE_ID = 1

    insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID)
    values (2, 'Take me to your leader (please)', null)

    update MESSAGES
    set MESSAGE_TEXT = 'Greetings Earthling', NEXT_MESSAGE_ID = 2
    where MESSAGE_ID = 1


      當第一個Message對象的text屬性和nextMessage被程序修改時,請注意Hibernate是如何檢測到這種變化,并如何在數據庫中自動對它更新的。這實際上是Hibernate的一個很有價值的特色,我們把它稱為“自動臟數據檢測”,Hibernate的這個特色使得當我們修改一個持久對象的屬性后,不必顯式地通知Hibernate去將它在數據庫中進行更新。同樣的,當第一個Message對象調用setNextMessage()方法將第二個Message對象作為它的下一條消息的引用時,第二條消息會無需調用save()方法,便可以自動地保存在數據庫中。這種特色被稱為“級聯保存”,它也免去了我們顯式地對第二個Message對象調用save()方法之苦。

      如果我們再運行先前的那段將數據庫中所有的Message對象都打印出來的代碼,那它的運行結果如下:

    2 message(s) found:
    Greetings Earthling
    Take me to your leader (please)


      “Hello world”示例程序現在介紹完畢。我們總算對Hibernate有了一個簡單的認識,下面我們將回過頭來,對Hibernate的主要API調用作一下簡要的介紹:

    posted on 2005-10-31 11:29 小辭猬 閱讀(269) 評論(0)  編輯  收藏 所屬分類: JAVA

    主站蜘蛛池模板: 国产免费人成视频尤勿视频| 亚洲Av无码国产一区二区 | 国产亚洲欧洲Aⅴ综合一区 | 亚洲av无码潮喷在线观看| 国产综合免费精品久久久| 在线观看亚洲精品国产| 永久免费AV无码网站国产| 亚洲午夜久久久久久久久久| 久99久无码精品视频免费播放| 精品国产亚洲一区二区在线观看| 一级毛片在播放免费| 中文亚洲AV片在线观看不卡 | 夜夜爽妓女8888视频免费观看| 国产又黄又爽又刺激的免费网址| 亚洲第一综合天堂另类专| 四虎影院永久免费观看| 无码毛片一区二区三区视频免费播放| 亚洲精品高清在线| 最近更新免费中文字幕大全| 国产亚洲A∨片在线观看| 免费无码一区二区三区| 亚洲毛片在线免费观看| 毛片a级毛片免费观看品善网| 亚洲国产aⅴ成人精品无吗| 亚洲?V无码乱码国产精品| 一个人看www免费高清字幕| 亚洲精品国产成人片| 色片在线免费观看| 看亚洲a级一级毛片| 国产亚洲精品精华液| 国产香蕉免费精品视频| 综合一区自拍亚洲综合图区| 亚洲无码在线播放| 免费精品国产自产拍在| 日产久久强奸免费的看| 久久亚洲私人国产精品vA| 日韩人妻无码免费视频一区二区三区| 有色视频在线观看免费高清在线直播| 亚洲国产日韩一区高清在线| 日本无卡码免费一区二区三区| 你懂的网址免费国产|