Hibernate核心技術簡介


Hibernate核心技術簡介

1Hibernate映射文件開發

    Hibernate映射文件就是項目中*.hbm.xml文件,其主要是完成各元素的配置,包括根元素、類元素、定義主鍵、設置主鍵生成方法、定義屬性以及關聯映射。下面一一單獨說明:

(1)根元素<hibernate-mapping>

    映射文件的根元素是<hibernate-mapping>,每一個*.hbm.xml文件都有唯一的一個根元素。該元素包含以下屬性:package、schema、catalog、default-cascade、default-access、default-lazy、auto-import等。

    <hibernate-mapping>元素允許嵌套多個<class>映射。但是最好的做法是一個持久化類對應一個映射文件。例如,一個持久化類名稱是User,則命名為User.hbm.xml。

(2)類元素<class>

    <class>是<hibernate>的子元素,用以定義一個持久化類與數據表的映射關系。該元素包以下屬 性:name、table、discriminator-value、mutable、schema、catalog、proxy、dynamic-update、dynamic-insert、select-before-update、polymorphism、where、persister、batch-size、optimistic-lock、lazy、entity-name、check、rowid、subselect、abstract。

(3)定義主鍵

    在關系數據庫表中,主鍵用來識別記錄,並保證每條記錄的唯一性。在Java語言中,通過比較兩個變量所引用對象的內存地址是相同,或者比較兩個對象引用的對象值是否相同來判斷兩個對象是否相等。Hibernate為了解決兩者之間的不同,使用對象標識符(OID)來標識對象的唯一性。OID是關系數據庫中主鍵在Java對象模型中的等價物。在運行時,Hibernate根據OID來維持Java對象和數據庫表中記錄的對應關系。

    一般使用數據庫表中主鍵屬性id來定義Java類中的主鍵,兩者是一一對應關系。

(4)設置主鍵生成方法

      一般使用<generator>元素來指定相應的主鍵,例如如下示例代碼中id便是主鍵:

 

<hibernate-mapping package="com.demo.hibernate.beans">

    <class name="User" table="user">
        <id name="id" column="ID" type="integer">
            <generator class="native"/>
        </id>
 
        <property name="username" column="username" type="string" />
        <property name="password" column="password" type="string" />
        <property name="email" column="email" type="string" />
    </class>
    
</hibernate-mapping>

 

(5)定義屬性

    在數據庫表中,每一個屬性都會對應一個相應的數據類型,那么進行ORM關聯映射生成的Java類,每一個成員變量也會有一個相應的數據類型。例如,int、long、String

、char、date、text等,其中date和text等在Java代碼中不是數據類型,但在此處是作為hibernate映射的內置映射類型屬性。

    一般可以使用<property>元素來定義非主鍵屬性。

(6)關聯映射

    關聯映射類似關系數據庫中實體之間的對應關系,不過此處表示的映射后生成的持久化類之間的關系,包含以下幾種類型:<many-to-one>、<one-to-one>、<one-to-many>、<many-to-many>。

 

2Hibernate核心編程

    用Hibernate開發基於持久層的應用時,第一件事情應當是熟悉它的編程接口。主要包含以下四個核心類的使用:

      Configuration裝載配置類

      SessionFactory創建Session類

      Session數據庫操作類

      Transcation事務操作類

    常用的核心接口包含以下六個:Session、SessionFactory、Configuration、Transaction、Query和Criteria。其具體關系如下圖一所示:

 

圖一:接口類的產生關系

    下面簡要說明一下四個核心類的作用:

(1)Configuration裝載配置類

    Configuration接口的作用是對Hibernate進行配置,以及對它進行啟動。在Hibernate啟動過程中,Configuration類的實例首先定位映射文檔的位置,讀取這些配置,然后創建一個SessionFactory對象。

(2)SessionFactory創建Session類

    SessionFactory在Hibernate中實際起到了一個緩沖區的作用,它緩沖了Hibernate自動生成的SQL語句以及其他的映射數據,還緩沖了一些將來有可能重復利用的數據。

(3)Session數據庫操作類

    Session的主要功能是提供對映射的實體類實例的創建、讀取和刪除操作。

(4)Transcation事務操作類

    Transaction接口是對實際事物實現的一個抽象,這些實現包括JDBC的事務、JTA中的UserTransaction、甚至可以是CORBA事務。這樣設計的目的是為了讓開發者能夠使用一個統一事務的操作界面,使得自己的項目可以在不同的環境和容器之間方便地移植。

 

3、使用Query進行HQL語句查詢

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

    要取得Query對象,需要使用Session的createQuery()函數來執行查詢,查詢的參數是基於HQL語法的,其查詢的對象是Hibernate的持久化對象名,Hibernate會根據該對象名找到要查找的表名。具體運用如下:

(1)不帶參數的查詢

    代碼示例如下:

     Query query = session.createQuery(“from User”);

(2)帶參數的查詢

   代碼示例如下:

     Query query = session.createQuery(“from User where username =: username”);

     Query.setString(“username”,”admin”);

(3)取得List結果集

    代碼示例如下:

     List list = query.list();

(4)取得迭代列表結果集

    代碼示例如下:

     Iterator it1 = query.iterate();

     Iterator it2 = query.list().iterator();

     while(it2.hasNext()){

         User user = (User)it2.next();

     }

(5)取得一個對象

    示例代碼如下:

     Query query = session.createQuery(“from User where username=?”);

     Query.setString(0,”admin”);

     User user = (User)query.uniqueResult();

(6)標量查詢

    示例代碼如下:

      Iterator results = session.createQuery(“select user.username,count(user.email) from User user group by user.username”).list().iterator();

(7)分頁查詢

    示例代碼如下:

     Query query = session.createQuery(“from User”);

     query.setFirstResult(10);

     query.setMaxResult(20);

     List list = query.list();

(8)創建SQL查詢

    示例代碼如下:

     List users = session.createSQLQuery(“select {user.*} from User{user}”).list();

    

4、使用Criteria進行條件查詢

    Criteria接口和Query接口非常類似,它允許你創建並執行面向對象的標准化查詢。

與之相對的是,如果你希望能夠動態的使用API進行面向對象查詢,而非在Java代碼中嵌入字符串,那么選擇Criteria可以達到這樣的目的。以下是其具體應用:

(1)創建Criteria實例

    實例代碼如下:

     Criteria criteria = session.createCriteria(User.class);

     criteria.setMaxResult(50);

     List users = criteria.list();

(2)添加查詢條件

    實例代碼如下:

     Criteria criteria = session.createCriteria(User.class);                                                              criteria.add(Restrictions.like(“username”,”admin%”));

     criteria.add(Restrictions.like(“ID”,1,10));

     List users = criteria.list();

(3)添加排序條件

    實例代碼如下:

     List users = session.createCriteria(User.class).add(Restrictions.like(“username”,”admin”)).addOrder(Order.asc(“username”)).addOrder(Order.desc(“password”)).setMaxResults(50).list();

(4)使用示例查詢

    示例代碼如下:

     User user = new User();

     User.setUsername(“admin”);

     List results = session.createCriteria(User.class).add(Example.create(user)).list();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM