版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 Hibernate 初識構(gòu)建Hibernate 基礎(chǔ)代碼 1 POJOPOJO 在Hibernate 語義中理解為數(shù)據(jù)庫表所對應(yīng)的Domain Object。這里的POJO就是所謂的“Plain Ordinary Java Object”,字面上來講就是無格式普通Java 對象,簡單的可以理解為一個不包含邏輯代碼的值對象(Value Object 簡稱VO)。2 Hibernate 映射文件Hibernate 從本質(zhì)上來講是一種“對象關(guān)系型數(shù)據(jù)映射”(Object RelationalMapping 簡稱ORM)。前面的POJO在這里體現(xiàn)的就是ORM中Object層的語義,而映射(Mappi
2、ng)文件則是將對象(Object)與關(guān)系型數(shù)據(jù)(Relational)相關(guān)聯(lián)的紐帶,在Hibernate中,映射文件通常以“.hbm.xml”作為后綴。由數(shù)據(jù)庫產(chǎn)生基礎(chǔ)代碼通過Hibernate官方提供的MiddleGen for Hibernate 和Hibernate_Extension工具包,我們可以很方便的根據(jù)現(xiàn)有數(shù)據(jù)庫,導(dǎo)出數(shù)據(jù)庫表結(jié)構(gòu),生成ORM和POJO1) 首先,將Middlegen-Hibernate軟件包解壓縮( 如解壓縮到C:Middlegen )。2) 配置目標(biāo)數(shù)據(jù)庫參數(shù)進(jìn)入MiddleGen 目錄下的configdatabase 子目錄,根據(jù)我們實際采用的數(shù)據(jù)庫打開
3、對應(yīng)的配置文件。如這里我們用的是mysql數(shù)據(jù)庫,對應(yīng)的就是mysql.xml文件。<property name="database.script.file"value="$src.dir/sql/$name-mysql.sql"/><property name="database.driver.file"value="$lib.dir/mysql.jar"/><property name="database.driver.classpath"value="
4、;$database.driver.file"/><property name="database.driver"value="org.gjt.mm.mysql.Driver"/><property name="database.url"value="jdbc:mysql:/localhost/sample"/><property name="database.userid"value="user"/><propert
5、y name="database.password"value="mypass"/><property name="database.schema"value=""/><property name="database.catalog"value=""/><property name="jboss.datasource.mapping"value="mySQL"/>修改MiddleGen 根目錄下
6、的build.xml 文件,此文件是Middlegen-Hibernate 的Ant構(gòu)建配置。Middlegen-Hibernate將根據(jù)build.xml文件中的具體參數(shù)生成數(shù)據(jù)庫表映射文件??膳渲玫捻椖堪ǎ篴) 目標(biāo)數(shù)據(jù)庫配置文件地址查找關(guān)鍵字 ”!ENTITY”,得到:<!DOCTYPE project <!ENTITY database SYSTEM"file:./config/database/hsqldb.xml">>默認(rèn)情況下,MiddleGen 采用的是hsqldb.xml,將其修改為我們所用的數(shù)據(jù)庫配置文件(mysql.xml):
7、<!DOCTYPE project <!ENTITY database SYSTEM"file:./config/database/mysql.xml">>b) Application name查找:<property name="name" value="airline"/>“aireline”是MiddleGen原始配置中默認(rèn)的 Application Name,將其修改為我們所希望的名稱,如“HibernateSample”:<property name="name"
8、 value="HibernateSample"/>c) 輸出目錄查找關(guān)鍵字“name="build.gen-src.dir"”,得到:<property name="build.gen-src.dir"value="$build.dir/gen-src"/>修改value="$build.dir/gen-src"使其指向我們所期望的輸出目錄,這里我們修改為:<property name="build.gen-src.dir"value="C
9、:sample"/>d) 對應(yīng)代碼的Package name查找關(guān)鍵字“destination”,得到:<hibernatedestination="$build.gen-src.dir"package="$name.hibernate"genXDocletTags="false"genIntergratedCompositeKeys="false"javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper&
10、quot;/>可以看到,hibernate 節(jié)點package 屬性的默認(rèn)設(shè)置實際上是由前面的Application Name ($name)和“.hibernate”組合而成,根據(jù)我們的需要,將其改為:<hibernatedestination="$build.gen-src.dir"package="org.hibernate.sample"genXDocletTags="true"genIntergratedCompositeKeys="false"javaTypeMapper="mid
11、dlegen.plugins.hibernate.HibernateJavaTypeMapper"/>這里還有一個屬性genXDocletTags,如果設(shè)置為true,則生成的代碼將包含xdoclet tag,這為以后在開發(fā)過程中借助xdoclet進(jìn)行映射調(diào)整提供了幫助。關(guān)于Hibernate的xdoclet使用,請參見“高級特性”中的相關(guān)內(nèi)容。注意,如果使用的數(shù)據(jù)庫為SQLServer,需要將build.xml 中如下部分(下劃線部分)刪除,否則Middlegen會報出找不到表的錯誤。<middlegenappname="$name"prefsdir
12、="$src.dir"gui="$gui"databaseurl="$database.url"initialContextFactory="$java.naming.factory.initial"providerURL="$vider.url"datasourceJNDIName="$"driver="$database.driver"username="$database
13、.userid"password="$database.password"schema="$database.schema"catalog="$database.catalog">在MiddleGen 根目錄下運(yùn)行ant,就將出現(xiàn)MiddleGen的界面:1 Domain Class Name對應(yīng)POJO 的類名2 Key Generator主鍵產(chǎn)生器可選項說明:1) Assigned主鍵由外部程序負(fù)責(zé)生成,無需Hibernate參與。2) hilo通過hi/lo 算法實現(xiàn)的主鍵生成機(jī)制,需要額外的數(shù)據(jù)庫表保存主鍵生成
14、歷史狀態(tài)。3) seqhilo與hilo 類似,通過hi/lo 算法實現(xiàn)的主鍵生成機(jī)制,只是主鍵歷史狀態(tài)保存在Sequence中,適用于支持Sequence的數(shù)據(jù)庫,如Oracle。4) increment主鍵按數(shù)值順序遞增。此方式的實現(xiàn)機(jī)制為在當(dāng)前應(yīng)用實例中維持一個變量,以保存著當(dāng)前的最大值,之后每次需要生成主鍵的時候?qū)⒋酥导?作為主鍵。這種方式可能產(chǎn)生的問題是:如果當(dāng)前有多個實例訪問同一個數(shù)據(jù)庫,那么由于各個實例各自維護(hù)主鍵狀態(tài),不同實例可能生成同樣的主鍵,從而造成主鍵重復(fù)異常。因此,如果同一數(shù)據(jù)庫有多個實例訪問,此方式必須避免使用。5) identity采用數(shù)據(jù)庫提供的主鍵生成機(jī)制。如D
15、B2、SQL Server、MySQL中的主鍵生成機(jī)制6) sequence采用數(shù)據(jù)庫提供的sequence 機(jī)制生成主鍵。如Oralce 中的Sequence。7) native由Hibernate根據(jù)底層數(shù)據(jù)庫自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式。8) uuid.hex由Hibernate基于128 位唯一值產(chǎn)生算法生成16 進(jìn)制數(shù)值(編碼后以長度32 的字符串表示)作為主鍵。9) uuid.string與uuid.hex 類似,只是生成的主鍵未進(jìn)行編碼(長度16)。在某些數(shù)據(jù)庫中可能出現(xiàn)問題(如PostgreSQL)10) foreign使用外
16、部表的字段作為主鍵。3 如果需要采用定制的主鍵產(chǎn)生算法,則在此處配置主鍵生成器,主鍵生成器必須實現(xiàn)net.sf.hibernate.id.IdentifierGenerator 接口。4 Schema Name數(shù)據(jù)庫Schema Name。5 Persister自定義持久類實現(xiàn)類類名。如果系統(tǒng)中還需要Hibernate 之外的持久層實現(xiàn)機(jī)制,如通過存儲過程得到目標(biāo)數(shù)據(jù)集,甚至從LDAP中獲取數(shù)據(jù)來填充我們的POJO。6 Enable proxies是否使用代理(用于延遲加載Lazy Loading)。7 Dynamic Update如果選定,則生成Update SQL 時不包含未發(fā)生變動的字段
17、屬性,這樣可以在一定程度上提升SQL執(zhí)行效能。8 Mutable類是否可變,默認(rèn)為選定狀態(tài)(可變)。如果不希望應(yīng)用程序?qū)Υ祟悓?yīng)的數(shù)據(jù)記錄進(jìn)行修改(如對于數(shù)據(jù)庫視圖),則可將取消其選定狀態(tài),之后對此類的Delete和Update操作都將失效。9 Implement the Lifecyle interface是否實現(xiàn)Lifecyle接口。Lifecyle接口提供了數(shù)據(jù)固化過程中的控制機(jī)制,通過實現(xiàn)Lifecyle接口,我們可以在數(shù)據(jù)庫操作中加入回調(diào)(Call Back)機(jī)制,如在數(shù)據(jù)庫操作之前,之后觸發(fā)指定操作。10 Implement the Validatable interface是否實
18、現(xiàn)Validatable接口。通過實現(xiàn)Validatable接口,我們可以在數(shù)據(jù)被固化到數(shù)據(jù)庫表之前對其合法性進(jìn)行驗證。值得注意的是,通過實現(xiàn)Lifecyle接口,我們同樣可以在數(shù)據(jù)操作之前驗證數(shù)據(jù)合法性,不同的是,Validatable 接口中定義的validate 方法可能會被調(diào)用多次,因此設(shè)計中應(yīng)避免在Validatable 接口的validate 方法實現(xiàn)中加入業(yè)務(wù)邏輯的驗證。1 Hibernate mapping specialty映射類型:Key :主鍵Property :屬性Version :用于實現(xiàn)optimistic locking,參見“高級特性”章節(jié)中關(guān)于optimist
19、ic locking的描述2 Java property name字段對應(yīng)的Java 屬性名3 Java Type字段對應(yīng)的Java 數(shù)據(jù)類型4 Column updateable生成Update SQL時是否包含本字段。5 Column insertable生成Insert SQL時是否包含本字段。=POJO 的生成工作可以通過Hibernate Extension 來完成,Hibernate Extension 的toolsbin目錄下包含三個工具:1 hbm2java.bat根據(jù)映射文件生成對應(yīng)的POJO。通過MiddleGen 我們已經(jīng)得到了映射文件,下一步就是通過hbm2java.b
20、at工具生成對應(yīng)的POJO。2 class2hbm.bat根據(jù)POJO class 生成映射文件,這個工具很少用到,這里也就不再詳細(xì)介紹。3 ddl2hbm.bat由數(shù)據(jù)庫導(dǎo)出庫表結(jié)構(gòu),并生成映射文件以及POJO。這個功能與MiddleGen的功能重疊,但由于目前還不夠成熟(實際上已經(jīng)被廢棄,不再維護(hù)),提供的功能也有限,所以我們還是采用MiddleGen生成映射文件,之后由hbm2java根據(jù)映射文件生成POJO 的方式。打開toolsbinsetenv.bat 文件,修改其中的JDBC_DRIVER和HIBERNATE_HOME環(huán)境變量,使其指向我們的實際JDBC Driver文件和Hib
21、ernate所在目錄,如*set JDBC_DRIVER=c:mysqlmysql.jarset HIBERNATE_HOME=c:hibernate*同時檢查一下環(huán)境變量CP中的各個項目中是否實際存在,特別是%CORELIB%下的jar文件,某些版本的發(fā)行包中,默認(rèn)配置中的文件名與實際的文件名有所出入(如%CORELIB%commons-logging.jar, 在Hibernate 發(fā)行包中,可能實際的文件名是commons-logging-.jar,諸如此類)。使用hbm2java,根據(jù)MiddleGen生成的映射文件生成Java 代碼:打開Command Window,在toolsbi
22、n目錄下執(zhí)行:*hbm2java c:sampleorghibernatesample*.xml -output=c:sampleHibernate 配置配置文件名默認(rèn)為“”(或者perties),Hibernate 初始化期間會自動在CLASSPATH 中尋找這個文件,并讀取其中的配置信息,為后期數(shù)據(jù)庫操作做好準(zhǔn)備。一個典型的配置文件如下:<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configurationPUBLIC "-/
23、Hibernate/Hibernate Configuration DTD/EN"dtd"><hibernate-configuration><!- SessionFactory 配置 -><session-factory><!- 數(shù)據(jù)庫URL -><property name="hibernate.connection.url">jdbc:mysql:/localhost/sample</property><!- 數(shù)據(jù)庫JDBC驅(qū)動 -><property
24、name="hibernate.connection.driver_class"></property><!- 數(shù)據(jù)庫用戶名 -><property name="hibernate.connection.username">User</property><!- 數(shù)據(jù)庫用戶密碼 -><property name="hibernate.connection.password">myPass</property><!-dialect ,每個數(shù)據(jù)庫
25、都有其對應(yīng)的Dialet以匹配其平臺特性 -><property name="dialect"></property><!- 是否將運(yùn)行期生成的SQL輸出到日志以供調(diào)試 -><property name="hibernate.show_sql">True</property><!- 是否使用數(shù)據(jù)庫外連接 -><property name="hibernate.use_outer_join">True</property><!-
26、事務(wù)管理類型,這里我們使用JDBC Transaction -><property name="hibernate.transaction.factory_class"></property><!映射文件配置,注意配置文件名必須包含其相對于根的全路徑 -><mapping resource="net/xiaxin/xdoclet/TUser.hbm.xml"/><mapping resource="net/xiaxin/xdoclet/TGroup.hbm.xml"/>
27、</session-factory></hibernate-configuration>一個典型的perties配置文件如下:hibernate.connection.url jdbc:mysql:/samplehibernate.connection.username userhibernate.connection.password mypass* Hibernate基礎(chǔ)語義1 數(shù)據(jù)庫URL2 數(shù)據(jù)庫用戶3 數(shù)據(jù)庫用戶密碼4 數(shù)據(jù)庫JDBC驅(qū)動類5 數(shù)據(jù)庫dialect,用于對特定數(shù)據(jù)庫提供支持,其中包含了針對特定數(shù)據(jù)庫特性的實現(xiàn),如Hib
28、ernate數(shù)據(jù)類型到特定數(shù)據(jù)庫數(shù)據(jù)類型的映射等。當(dāng)我們調(diào)用:Configuration config = new Configuration().configure();時,Hibernate會自動在當(dāng)前的CLASSPATH 中搜尋文件并將其讀取到內(nèi)存中作為后繼操作的基礎(chǔ)配置。Configuration 類一般只有在獲取SessionFactory時需要涉及,當(dāng)獲取SessionFactory 之后,由于配置信息已經(jīng)由Hibernate 維護(hù)并綁定在返回的SessionFactory之上,因此一般情況下無需再對其進(jìn)行操作。我們也可以指定配置文件名,如果不希望使用默認(rèn)的文件作為配置文件的話:F
29、ile file = new File("c:samplemyhibernate.xml");Configuration config = new Configuration().configure(file);SessionFactorySessionFactory 負(fù)責(zé)創(chuàng)建Session 實例。我們可以通過Configuation 實例構(gòu)建SessionFactory:Configuration config = new Configuration().configure();SessionFactory sessionFactory = config.buildSes
30、sionFactory();Configuration實例config會根據(jù)當(dāng)前的配置信息,構(gòu)造SessionFactory實例并返回。SessionFactory 一旦構(gòu)造完畢,即被賦予特定的配置信息。也就是說,之后config 的任何變更將不會影響到已經(jīng)創(chuàng)建的SessionFactory 實例(sessionFactory)。如果需要使用基于改動后的config 實例的SessionFactory,需要從config 重新構(gòu)建一個SessionFactory實例.SessionSession是持久層操作的基礎(chǔ),相當(dāng)于JDBC中的Connection。Session實例通過SessionFa
31、ctory實例構(gòu)建:Configuration config = new Configuration().configure();SessionFactory sessionFactory = config.buildSessionFactory();Session session = sessionFactory.openSession();*Find:String hql= " from TUser where name='Erica'"List userList = session.find(hql);*Save:TUser user = new TU
32、ser();user.setName("Emma");session.save(user);session.flush();最后調(diào)用Session.flush方法強(qiáng)制數(shù)據(jù)庫同步,這里即強(qiáng)制Hibernate將user實例立即同步到數(shù)據(jù)庫中。如果在事務(wù)中則不需要flush方法,在事務(wù)提交的時候,hibernate自動會執(zhí)行flush方法,另外當(dāng)Session關(guān)閉時,也會自動執(zhí)行flush方法。Hibernate高級特性XDoclet 與Hibernate 映射XDoclet已經(jīng)廣泛運(yùn)用在EJB開發(fā)中,在其最新版本里,包含了一個為Hibernate提供支持的子類庫Hiberna
33、te Doclet,其中包含了生成Hibernate映射文件所需的ant構(gòu)建支持以及java doc tag支持。XDoclet實現(xiàn)基本原理是,通過在Java代碼加入特定的JavaDoc tag,從而為其添加特定的附加語義,之后通過XDoclet工具對代碼中JavaDoc Tag進(jìn)行分析,自動生成與代碼對應(yīng)的配置文件,XDoclet。*其中用到了兩個hibernate doclet tag,hibernate.class和perty。這兩個tag分別描述了POJO所對應(yīng)的數(shù)據(jù)庫表信息,以及其字段對應(yīng)的庫表字段信息。之后Hibernate Doclet就會根據(jù)這些信息生
34、成映射文件:<hibernate-mapping><classname="net.xiaxin.xdoclet.TUser"table="TUser"><propertyname="name"type="java.lang.String"column="name"not-null="true"length="50"></class></hibernate-mapping>常用Hibernate-D
35、oclet Tag介紹:1. Class 層面:1) hibernate.class描述POJO 與數(shù)據(jù)庫表之間的映射關(guān)系,并指定相關(guān)的運(yùn)行參數(shù)。參數(shù) 描述 類型 必須table 類對應(yīng)的表名默認(rèn)值:當(dāng)前類名Text Ndynamic-update 生成Update SQL時,僅包含發(fā)生變動的字段默認(rèn)值: falseBool Ndynamic-insert 生成Insert SQL時,僅包含非空(null)字段默認(rèn)值:falseBool NProxy 代理類默認(rèn)值:空Text Ndiscriminator-value 子類辨別標(biāo)識,用于多態(tài)支持。 Text Nwhere 數(shù)據(jù)甄選條件,如果只需
36、要處理庫表中某些特定數(shù)據(jù)的時候,可通過此選項設(shè)定結(jié)果集限定條件。如用戶表中保存了全國所有用戶的數(shù)據(jù),而我們的系統(tǒng)只是面向上海用戶,則可指定where=”location=Shanghai"Text N注釋:目前看到27頁,繼續(xù)Hibernate.pdf(共92頁)典型場景:/* hibernate.class* table="TUser" (1)* dynamic-update="true" (2)* dynamic-insert="true" (3)* proxy=” (4)* discriminator-value=”1
37、” (5)*/public class TUser implements Serializable 1 table參數(shù)指定了當(dāng)前類(TUser)對應(yīng)數(shù)據(jù)庫表“TUser”。2 dynamic-update 參數(shù)設(shè)定為生成Update SQL 時候,只包括當(dāng)前發(fā)生變化的字段(提高DB Update性能)。3 Dynamic-insert 參數(shù)設(shè)定為生成Insert SQL 時候,只包括當(dāng)前非空字段。(提高DB Insert性能)4 Proxy 參數(shù)為空,表明當(dāng)前類不使用代理(Proxy)。代理類的作用是為LazyLoading提供支持5 discriminator-value參數(shù)設(shè)為”1”。di
38、scriminator-value 參數(shù)的目的是對多態(tài)提供支持。2) hibernate.discriminatorhibernate.discriminator(識別器) 用于提供多態(tài)支持。參數(shù) 描述 類型 必須Column 用于區(qū)分各子類的字段名稱。 text Y默認(rèn)值:當(dāng)前類名type 對應(yīng)的Hibernate類型 Bool Nlength 字段長度 Bool N2. Method層面:1) hibernate.id描述POJO 中關(guān)鍵字段與數(shù)據(jù)庫表主鍵之間的映射關(guān)系。參數(shù) 描述 類型 必須column 主鍵字段名 默認(rèn)值:當(dāng)前類名 Text Ntype 字段類型。Hibernate 總
39、是使用對象型數(shù)據(jù)類型作 Text N 為字段類型,如int對應(yīng)Integer,因此這里將id設(shè)為基本類型如int以避免對象創(chuàng)建的開銷的思路是沒有實際意義的,即使這里設(shè)置為基本類型,Hibernate內(nèi)部還是會使用對象型數(shù)據(jù)對其進(jìn)行處理,只是返回數(shù)據(jù)的時候再轉(zhuǎn)換為基本類型而已。length 字段長度 Text Nunsaved-value 用于對象是否已經(jīng)保存的判定值。 Text Ngenerator-class 主鍵產(chǎn)生方式(詳見Hibernate QuickStart中關(guān)于MiddleGen的相關(guān)說明)取值可為下列值中的任意一個:assigned,hiloSeqhilo,increment,
40、identity,sequence,native, Text Yuuid.hex,uuid.string,foreign描述POJO 中屬性與數(shù)據(jù)庫表字段之間的映射關(guān)系。參數(shù) 描述 類型 必須column 數(shù)據(jù)庫表字段名默認(rèn)值:當(dāng)前類名 Text Ntype 字段類型 Text Nlength 字段長度 Text Nnot-null 字段是否允許為空 Bool Nunique 字段是否唯一(是否允許重復(fù)值) Bool Ninsert Insert 操作時是否包含本字段數(shù)據(jù) Bool N默認(rèn):trueupdate Update 操作時是否包含本字段數(shù)據(jù)默認(rèn):true Bool N包含XDocle
41、t Tag的代碼必須由xdoclet程序進(jìn)行處理以生成對應(yīng)的映射文件,xdoclet的處理模塊可通過ant進(jìn)行加載,下面是一個簡單的hibernate xdoclet的ant構(gòu)建腳本(注意實際使用時需要根據(jù)實際情況對路徑和CLASSPATH設(shè)定進(jìn)行調(diào)整):<?xml version="1.0"?><project name="Hibernate" default="hibernate" basedir="."><property name="xdoclet.lib.home&
42、quot; value="C:xdoclet-lib"/><target name="hibernate" depends=""description="Generates Hibernate class descriptor files."><taskdef name="hibernatedoclet"classname="xdoclet.modules.hibernate.HibernateDocletTask"><classpath&
43、gt;<fileset dir="$xdoclet.lib.home"><include name="*.jar"/></fileset></classpath></taskdef><hibernatedocletdestdir="./src/"excludedtags="version,author,todo"force="true"verbose="true"mergedir="."&g
44、t;<fileset dir="./src/"><include name="*/hibernate/sample/*.java"/></fileset><hibernate version="2.0"/></hibernatedoclet></target></project>除了上面我們介紹的Hibernate Doclet Tag,其他還有:Class層面;hibernate.cachehibernate.jcs-cachehibernate.j
45、oined-subclasshibernate.joined-subclass-keyhibernate.queryMethod層面hibernate.arrayhibernate.baghibernate.collection-cachehibernate.collection-composite-elementhibernate.collection-elementhibernate.collection-indexhibernate.collection-jcs-cachehibernate.collection-keyhibernate.collection-key-columnhib
46、ernate.collection-many-to-manyhibernate.collection-one-to-manyhibernate.columnponenthibernate.generator-paramhibernate.index-many-to-manyhibernate.listhibernate.many-to-onehibernate.maphibernate.one-to-onehibernate.primitive-arrayhibernate.sethibernate.timestamphibernate.version數(shù)據(jù)檢索1. Criteria Query
47、2. Hibernate Query Language (HQL)3. SQLCriteria QueryCriteria Query通過面向?qū)ο蠡脑O(shè)計,將數(shù)據(jù)查詢條件封裝為一個對象。簡單來講,Criteria Query可以看作是傳統(tǒng)SQL的對象化表示,如:Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.eq("name","Erica");criteria.add(Expression.eq("sex",new Int
48、eger(1);注意:這里的criteria 實例實際上是SQL “Select * from t_user where name=Erica and sex=1”的封裝(我們可以打開Hibernate 的show_sql 選項,以觀察Hibernate在運(yùn)行期生成的SQL語句)。Hibernate 在運(yùn)行期會根據(jù)Criteria 中指定的查詢條件(也就是上面代碼中通過criteria.add方法添加的查詢表達(dá)式)生成相應(yīng)的SQL語句。Criteria 查詢表達(dá)式Criteria 本身只是一個查詢?nèi)萜?,具體的查詢條件需要通過Criteria.add方法添加到Criteria實例中。如前例所示,
49、Expression 對象具體描述了查詢條件。針對SQL 語法,Expression提供了對應(yīng)的查詢限定機(jī)制,包括:方法描述Expression.eq 對應(yīng)SQL“field = value”表達(dá)式。如Expression.eq("name","Erica")Expression.allEq 參數(shù)為一個Map對象,其中包含了多個屬性值對應(yīng)關(guān)系。相當(dāng)于多個Expression.eq關(guān)系的疊加。Expression.gt 對應(yīng)SQL中的 “field > value ” 表達(dá)式Expression.ge 對應(yīng)SQL中的 “field >= val
50、ue” 表達(dá)式Expression.lt 對應(yīng)SQL中的 “field < value” 表達(dá)式Expression.le 對應(yīng)SQL中的 “field <= value” 表達(dá)式Expression.between對應(yīng)SQL中的 “between” 表達(dá)式如下面的表達(dá)式表示年齡(age)位于13到50區(qū)間內(nèi)。Expression.between("age",newInteger(13),new Integer(50);Expression.like 對應(yīng)SQL中的 “field like value” 表達(dá)式Expression.in 對應(yīng)SQL中的 ”fie
51、ld in ” 表達(dá)式Expression.eqProperty 用于比較兩個屬性之間的值,對應(yīng)SQL中的“field= field”。如:Expression.eqProperty("TUser.groupID","TGroup.id");Expression.gtProperty 用于比較兩個屬性之間的值,對應(yīng)SQL中的“field> field”。Expression.geProperty 用于比較兩個屬性之間的值,對應(yīng)SQL中的“field>= field”。Expression.ltProperty用于比較兩個屬性之間的值,對應(yīng)SQ
52、L中的“field< field”。Expression.leProperty 用于比較兩個屬性之間的值,對應(yīng)SQL中的“field<= field”。Expression.and and關(guān)系組合。如:Expression.and(Expression.eq("name","Erica"),Expression.eq("sex",new Integer(1);Expression.oror關(guān)系組合。如:Expression.sql 作為補(bǔ)充,本方法提供了原生SQL語法的支持。我們可以通過這個方法直接通過SQL語句限定查詢條
53、件。下面的代碼返回所有名稱以“Erica”起始的記錄:Expression.sql(“l(fā)ower() like lower(?)”,"Erica%",Hibernate.STRING);其中的“alias”將由Hibernate在運(yùn)行期使用當(dāng)前關(guān)聯(lián)的POJO別名替換。Criteria 高級特性限定返回的記錄范圍通過criteria. setFirstResult/setMaxResults 方法可以限制一次查詢返回的記錄范圍:Criteria criteria = session.createCriteria(TUser.class);/限定查詢返回檢索
54、結(jié)果中,從第一百條結(jié)果開始的20條記錄criteria.setFirstResult(100);criteria.setMaxResults(20);對查詢結(jié)果進(jìn)行排序/查詢所有g(shù)roupId=2的記錄/并分別按照姓名(順序)和groupId(逆序)排序Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.eq("groupId",new Integer(2);criteria.addOrder(Order.asc("name");criteria.
55、addOrder(Order.desc("groupId");Criteria作為一種對象化的查詢封裝模式,不過由于Hibernate在實現(xiàn)過程中將精力更加集中在HQL查詢語言上,因此Criteria的功能實現(xiàn)還沒做到盡善盡美(這點上,OJB的Criteria 實現(xiàn)倒是值得借鑒),因此,在實際開發(fā)中,建議還是采用Hibernate 官方推薦的查詢封裝模式:HQL。 Hibernate Query Language (HQL)相對Criteria,HQL提供了更接近傳統(tǒng)SQL語句的查詢語法,也提供了更全面的特性。最簡單的一個例子:String hql = "from
56、 org.hibernate.sample.TUser"Query query = session.createQuery(hql);List userList = query.list();上面的代碼將取出TUser的所有對應(yīng)記錄。如果我們需要取出名為“Erica”的用戶的記錄,類似SQL,我們可以通過SQL 語句加以限定:String hql ="from org.hibernate.sample.TUser as user where ='Erica'"Query query = session.createQuery(hq
57、l);List userList = query.list();其中我們新引入了兩個子句“as”和“where”,as子句為類名創(chuàng)建了一個別名,而where子句指定了限定條件。HQL子句本身大小寫無關(guān),但是其中出現(xiàn)的類名和屬性名必須注意大小寫區(qū)分。 數(shù)據(jù)關(guān)聯(lián)一對一關(guān)聯(lián)配置:Hibernate中的一對一關(guān)聯(lián)由“one-to-one”節(jié)點定義one-to-one關(guān)系定義比較簡單,只需在主控方加以定義。這里,我們的目標(biāo)是由TUser 對象獲取其對應(yīng)的TGroup 對象。因此TUser 對象是主控方,為了實現(xiàn)一對一關(guān)系,我們在TUser 對象的映射文件TUser.hbm.xml 中加入one-to-one節(jié)點,對TGroup對象進(jìn)行一對一關(guān)聯(lián):<hibernate-mapping><cla
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 神經(jīng)外科低鈉血癥治療指南
- 風(fēng)帶來的好處和壞處活動
- 企業(yè)班組安全教育
- 第六章 機(jī)械能守恒定律-功和功率 2025年高考物理基礎(chǔ)專項復(fù)習(xí)
- 示出塞課件教學(xué)課件
- 3.1.1 鐵及其化合物 課件 上學(xué)期化學(xué)人教版(2019)必修第一冊
- 慢病專員工作匯報
- 吉林省2024七年級數(shù)學(xué)上冊第2章整式及其加減期末提分課件新版華東師大版
- 常見的安全標(biāo)志教案及反思大班
- 氧化碳的說課稿
- 藍(lán)天救援隊隊員風(fēng)險告知書
- 《工程勘察設(shè)計收費(fèi)管理規(guī)定》計價格2002-10號文
- 宿舍消防疏散圖
- 常用焊條合格證
- 站場明敷接地扁鋼安裝技術(shù)要求
- 《個人防護(hù)用品PPE》ppt課件
- 國際貿(mào)易SimTrade外貿(mào)實習(xí)報告
- 導(dǎo)師帶徒實施辦法6、30
- 《Fishing with Grandpa》RAZ分級閱讀繪本pdf資源
- 水穩(wěn)施工方案(完整版)
- 跨海大橋施工方案
評論
0/150
提交評論