Hibernate核心技術簡介
1、Hibernate映射文件開發
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>。
2、Hibernate核心編程
用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();