JavaEE輕量級(jí)框架Struts2 spring Hibernate整合開發(fā) 第4章Struts2高級(jí)特性第5章Hibernate的基礎(chǔ)知識(shí)_第1頁
JavaEE輕量級(jí)框架Struts2 spring Hibernate整合開發(fā) 第4章Struts2高級(jí)特性第5章Hibernate的基礎(chǔ)知識(shí)_第2頁
JavaEE輕量級(jí)框架Struts2 spring Hibernate整合開發(fā) 第4章Struts2高級(jí)特性第5章Hibernate的基礎(chǔ)知識(shí)_第3頁
JavaEE輕量級(jí)框架Struts2 spring Hibernate整合開發(fā) 第4章Struts2高級(jí)特性第5章Hibernate的基礎(chǔ)知識(shí)_第4頁
JavaEE輕量級(jí)框架Struts2 spring Hibernate整合開發(fā) 第4章Struts2高級(jí)特性第5章Hibernate的基礎(chǔ)知識(shí)_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

JavaEE輕量級(jí)框架Struts2+spring+Hibernate整合開發(fā)

第4章Struts2高級(jí)特性內(nèi)容4.1攔截器4.2Struts2的國際化4.3struts2校驗(yàn)框架4.4Struts2開發(fā)案例4.1攔截器攔截器(interceptor)是Struts2框架核心組成部分,框架的很多功能都是構(gòu)建在攔截器基礎(chǔ)之上的,例如文件的上傳和下載、國際化、數(shù)據(jù)類型轉(zhuǎn)換和數(shù)據(jù)有效性驗(yàn)證等。Struts2利用內(nèi)建的攔截器,完成了框架內(nèi)的大部分操作。攔截器是AOP(面向方面編程)在struts2框架中的具體實(shí)現(xiàn)。4.1攔截器攔截器就是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象。它提供了一種機(jī)制,使開發(fā)者可以定義一個(gè)特定的功能模塊,這個(gè)模塊可以在Action執(zhí)行之前或之后運(yùn)行,也可以在一個(gè)Action執(zhí)行之前阻止Action執(zhí)行。同時(shí)也提供了一種可以提取Action中可重用部分的方式。4.1攔截器Struts2框架的Action被一個(gè)或者多個(gè)攔截器(攔截器棧)所包圍,所有的用戶請求都會(huì)被攔截器所攔截,然后交給Action處理,處理結(jié)果以邏輯視圖的方式返回給用戶。而這個(gè)調(diào)用的執(zhí)行流程,是由Strut2的配置文件(struts.xml)來實(shí)現(xiàn)的。4.1攔截器4.1.1struts2中攔截器的工作過程Struts2框架的絕大部分功能都是通過攔截器來完成的,當(dāng)FilterDispatcher攔截到用戶請求后,大量攔截器將會(huì)對(duì)用戶請求進(jìn)行處理,然后才會(huì)調(diào)用用戶開發(fā)的Action實(shí)例的方法來處理請求。攔截器與Action之間的關(guān)系如圖4-1所示。4.1攔截器HttpServletRequestHttpServletResponseFilterDispatchetrInterceptor1Interceptor1Interceptor1ActionResult4.1攔截器圖中的Interceptor1表示可有多個(gè)攔截器,這些攔截器可以是struts2框架定制的,也可以是用戶自定義的。由圖可見,當(dāng)用戶發(fā)出一個(gè)請求后,要經(jīng)過攔截器棧后才能到達(dá)要請求的Action,根據(jù)Action返回的字符串與Result進(jìn)行匹配,返回相應(yīng)的視圖,在請求返回的過程中也要經(jīng)過多個(gè)攔截器。4.1攔截器4.1.2struts2中內(nèi)置攔截器在struts2中大量的使用攔截來完成一些常見的功能。如解析請求參數(shù),將請求參數(shù)賦值給Action屬性、執(zhí)行數(shù)據(jù)校驗(yàn)、文件上傳等。攔截器的最大特點(diǎn)是靈巧,當(dāng)需要某個(gè)功能時(shí),就添加上相應(yīng)的攔截器,如果不需要了,就將相應(yīng)的攔截器刪除,就像是撥插電腦主板上的板卡一樣非常方便在struts框架中有一個(gè)struts-default.xml配置文件,這是一個(gè)框架缺省的配置文件,其中定義了大量的攔截器。打開struts-default.xml可看到已經(jīng)定義的攔截器。4.1攔截器常用的截器簡要介紹:Chain:構(gòu)建一個(gè)Action鏈,使當(dāng)前Action可以訪問前一個(gè)Action的屬性,一般和<resulttype=”chain”……/>一起使用。conversionError:這是一負(fù)責(zé)處理類型轉(zhuǎn)換錯(cuò)誤的攔截器,它負(fù)責(zé)將類型轉(zhuǎn)換錯(cuò)誤從ActionContext中取出,并轉(zhuǎn)換成Action的FieldError錯(cuò)誤。CreateSession:這是負(fù)責(zé)創(chuàng)建一個(gè)HttpSession對(duì)象,主要用于那些需要有HttpSession對(duì)象才能正常工作的攔截器中。4.1攔截器filtUpload:這是負(fù)責(zé)上傳文件的攔截器。i18n:這是負(fù)責(zé)支持國際化的攔截器。logger:這是日志攔截器,主要是輸出Action的名字。debugging:這是用于調(diào)試的攔截器,主要可在控制臺(tái)上看到一些調(diào)試信息。上面給出的只其中的一部分,還有很多其他的攔截器。我們無須手動(dòng)控制這些攔截器,因?yàn)閟truts-default.xml文件中已經(jīng)配置了這些攔截器,只要我們定義的包繼承了系統(tǒng)的struts-default包,就可以直接使用這些攔截器。4.1攔截器4.1.3配置攔截器在struts.xml文件中定義攔截器只需為攔截器類指定一個(gè)攔截器名就可以,定義攔截器使用<interceptor……/>元素來定義,其格式如下:<interceptorname=”攔截器名”class=”攔截器實(shí)現(xiàn)類/>4.1攔截器一股情況下,只需通過上面的格式就可完成攔截器的配置,如果需要在配置攔截器時(shí)傳入攔截器參數(shù),可使用<param……/>子元素。下面是在配置攔截器時(shí),同時(shí)傳入攔截器參數(shù)的格式:<interceptorname=”攔截器名”class=”攔截器實(shí)現(xiàn)><!—下面元素可以出現(xiàn)0次,也可以多次,其中name屬性指定需要設(shè)置的參數(shù)名,中間指定的是該參數(shù)的值

<paramname=”參數(shù)名”>參數(shù)值</param></interceptor>4.1攔截器除此以外,還可以把多個(gè)攔截器連在一起組成攔截器棧,例如,如果需要在Action執(zhí)行前同時(shí)做登錄檢查和記錄日志,則可以把這二個(gè)動(dòng)作對(duì)應(yīng)的攔截器組成一個(gè)攔截器棧。定義攔截器棧使用<interceptor-stack……/>元素,攔截器棧是由多個(gè)攔截器組成的,因此需要在<interceptor-stack……/>元素中使用<interceptor-ref……/>元素來定義多個(gè)攔截器引用,即該攔截器棧由多個(gè)<interceptor-ref……/>元素指定的攔截器組成。實(shí)際上,攔截器棧就是一個(gè)更大的攔截器。配置攔截器棧的語法格式如下:4.1攔截器<interceptor-stackname=”stack1”><interceptor-refname=”攔截器1”/><interceptor-refname=”攔截器2”/>……</interceptor-stack>上面的代碼配置了一個(gè)名為“stack1”的攔截器,這個(gè)攔截器由“攔截器1”和“攔截器器2”組成,攔截器棧還可以再定義攔截器棧,也即攔截器棧是可以嵌套的。有了攔截器棧可以避免很多重復(fù)的代碼,提高代碼的利用率。攔截器棧的使用和攔截器的使用方法是一樣的,都是通過<interceptor-ref……/>元素配置實(shí)現(xiàn)對(duì)不同的Action的攔截。4.1攔截器4.1.4攔截器的使用攔截器定義完成后,就可以使用這個(gè)攔截器或攔截器棧來攔截指定的Action了。攔截器的攔截代碼將會(huì)在Action的execute方法執(zhí)行前被執(zhí)行。通過<interceptor-ref>元素可以在Action內(nèi)使用攔截器,在Action中使用攔截器的配置語法與在配置攔截器棧的語法是一樣的。下面是一個(gè)示例:4.1攔截器<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""/dtds/struts-2.0.dtd"><struts> <packagename="action"extends="struts-default"> <!--定義攔截器

--> <interceptors>

<interceptorname="helloworld" class="interceptor.HelloWorldInterceptor"/> </interceptors> <actionname="test"class="action.MyAction"> <result>Success.jsp</result> <!--action中引用默認(rèn)攔截器

-->

<interceptor-refname="defaultStack"/> <!--action中引用攔截器

-->

<interceptor-refname="helloworld"/> </action> </package></struts>4.1攔截器上面的例子中,先是用<interceptor……>定義一個(gè)攔截器,然后可以在后面的多個(gè)Action中用<interceptor-ref……>元素來引用已定義的攔截器。當(dāng)在Action中添加了自定義的攔截器后,框架的默認(rèn)攔截器就不再起作用,所以要添加默認(rèn)攔截器的引用,如代碼中的黑體所示。4.1攔截器4.1.5自定義攔截器在項(xiàng)目開發(fā)過程中如果struts2框架提供的攔截器不能滿足我們的需要,我們可以自己定義攔截器。在定義攔截器類時(shí)要實(shí)現(xiàn)Interceptor接口。下面是一個(gè)簡單HelloWorld攔截器的開發(fā)。例4-1假設(shè)我們需要實(shí)現(xiàn)這么一個(gè)功能,在調(diào)用每個(gè)Action之前都能在控制臺(tái)打印出“HelloWorld”。要求使用Struts2攔截器來實(shí)現(xiàn)。4.1攔截器建立一個(gè)Action類MyAction.java和配置文件Struts.xml;建立一個(gè)攔截器類HelloWorldInterceptor.java,自定義攔截器必須實(shí)現(xiàn)Interceptor接口或繼承AbstractInterceptor類。其代碼如下;在struts.xml中加入攔截器的配置,見struts.xml內(nèi)容;編寫JSP頁面Success.jsp;運(yùn)行該web程序,在瀏覽器中運(yùn)行效果如圖4-2到4-3所示。4.2Struts2的國際化Struts2國際化是指一個(gè)程序可以在不改變程序架構(gòu)以及界面的情況下適應(yīng)多語種的技術(shù),Struts2國際化是建立在Java國際化的基礎(chǔ)上的,通過提供不同國家/語言環(huán)境的消息資源,然后通過ResourceBundle加載指定Locale對(duì)應(yīng)的資源文件,再取得該資源文件中指定key對(duì)應(yīng)的消息,整個(gè)過程與JAVA程序的國家化完全相同,只是Struts2框架對(duì)JAVA程序國際化進(jìn)行了進(jìn)一步封裝,從而簡化了應(yīng)用程序,使編程更方便。4.2Struts2的國際化4.2.1Struts2中加載全局資源文件Struts2提供了很多加載國際化資源文件的方式,最簡單、最常用的就是加載全局的國際化資源文件,加載全局國際化資源文件是通過在配置文件中配置常量來實(shí)現(xiàn)的,這個(gè)常量就是:struts.custom.i18n.resources。配置這個(gè)常量時(shí),該常量的值為全局國際化資源文件的baseName,一旦指定了全局的國際化資源文件,即可實(shí)現(xiàn)程序的國際化。4.2Struts2的國際化假設(shè)系統(tǒng)需要加載的國際化資源文件的baseName為messageResource,則我們可以在struts.xml文件中配置如下的常量:<constantname=”struts.custom.i18n.resources”value=”messageResource”/>在系統(tǒng)中有了以上配置,Struts2應(yīng)用就可以在所有的地方使用國際化資源文件了,包括JSP頁面和Action。4.2Struts2的國際化4.2.2訪問國際化消息Struts2即可以在JSP頁面中通過標(biāo)簽來輸出國際化消息,也可以在Action類中輸出國際化消息。不管采用哪種方式,struts2都提供了非常簡單的支持。Struts2訪問國際化消息主要有如下3種方式:4.2Struts2的國際化為了在JSP頁面中輸出國際化消息,可以使用struts2的<s:text……/>標(biāo)簽,該標(biāo)簽可以指定一個(gè)name屬性,該屬性指定了國際化資源文件中的key。為了在Action類中訪問國際化消息,可以使用ActionSupport類的getText方法,該方法可以接受一個(gè)name參數(shù),該參數(shù)指定了國際化資源文件中的key。為了在該表單元素的Label里輸出國際化信息,可以為該表單標(biāo)簽指定一個(gè)key屬性,該key指定了國際化資源文件的key。4.2Struts2的國際化假設(shè)系統(tǒng)提供如下兩份資源文件:messageresources_en_US.properties源程序:HelloWorld=HellWorld!name=usernamepass=passwordusername=YourNamepassword1=Passwordpassword2=confirmPasswordbirthday=Birthday4.2Struts2的國際化此文件表明國際化資源文件的baseName是messageResources,它是美國英語的資源文件。如果要想提供在中文環(huán)境下使用的資源文件,其文件名應(yīng)為perties,其代碼如下:HelloWorld=你好,世界!name=用戶名稱pass=用戶密碼username=用戶名password1=密碼password2=確認(rèn)密碼birthday=生日4.2Struts2的國際化對(duì)于學(xué)習(xí)過JAVA國際化的讀者應(yīng)該知道,包含非西歐字符的國了際化資源文件必須使用native2ascii工具進(jìn)行處理,使用該命令處理上面的資源文件,并將處理后的資源文件命名為messageResources_zh_CN.properties,表明這是簡體中文資源文件,所有的資源文件都應(yīng)保存在WEB-INF/classes路徑下。4.2Struts2的國際化在MyEclipse開發(fā)環(huán)境下建立中文資源文件非常方便,MyEclipse可以自動(dòng)的將中文轉(zhuǎn)為相應(yīng)的ascii碼。具體使用步驟如下:創(chuàng)建資源文件,在新建文件向?qū)е羞x擇如圖4-5所示的選項(xiàng)在上圖中點(diǎn)下一步后出現(xiàn)如圖4-6所示畫面編寫資源文件,在MyEclipse中可以利用其提供的編輯器來編寫中文的資源文件,編寫完成后會(huì)自動(dòng)的轉(zhuǎn)換成對(duì)應(yīng)的ASCII碼.4.3struts2校驗(yàn)框架Struts2中提供了三種輸入校驗(yàn)方式。第一種是重寫Action中的validate()方法,此方法對(duì)當(dāng)前Action中的所有方法都是有效的。第二種是重寫Action中的validateXXX()方法,這個(gè)XXX是對(duì)應(yīng)的方法名,這種方法可以為每個(gè)業(yè)務(wù)邏輯編寫一個(gè)效驗(yàn)代碼。第三種方法是利用struts2的檢驗(yàn)框架,這種方法是將所有的校驗(yàn)規(guī)則都寫在相應(yīng)的XML文件中,下面重點(diǎn)介紹第三種方法。4.3struts2校驗(yàn)框架4.2.1編寫校驗(yàn)規(guī)則文件Struts2提供了基于驗(yàn)證框架的輸入校驗(yàn),在這種方式下,所有的輸入校驗(yàn)只需編寫簡單的配置文件,struts2的驗(yàn)證框架會(huì)負(fù)責(zé)進(jìn)行服務(wù)器校驗(yàn)和客戶端校驗(yàn)。下面以

注冊頁面register.jsp為例介紹框架的使用方法。4.3struts2校驗(yàn)框架Register.jsp包含有六個(gè)表單域,代碼如下:<body> <!--用戶信息注冊form表單

--><!--validate="true"表示客戶端校驗(yàn)

--> <s:formaction="Register.action"validate="true"> <tablewidth="60%"height="76"border="0"> <!--各標(biāo)簽定義

--> <s:textfieldname="username"label="用戶名"/> <s:passwordname="password"label="密

碼"/> <s:passwordname="repassword"label="密

碼確認(rèn)"/> <s:textfieldname="birthday"label="生日"/> <s:textfieldname="mobile"label="手機(jī)號(hào)碼"/> <s:textfieldname="age"label="年齡"/><s:textfieldname="email"label="電子郵件"/> <s:submitvalue="注冊"align="center"/> </table> </s:form></body>4.3struts2校驗(yàn)框架頁面中包含六個(gè)表單域,每個(gè)表單域的驗(yàn)證規(guī)則如下:Username和password只能是字母和數(shù)字,且長度必須在8到10之間;Repassword必須與password的內(nèi)容一致birthday必須在1900-01-01到2020-01-01之間mobil必須為11位age必須是1到120之間的整數(shù);email必須滿足電子郵件的格式4.3struts2校驗(yàn)框架下面是對(duì)應(yīng)的RegistAction.java代碼:publicclassRegisterActionextendsActionSupport{ //用戶名屬性 privateStringusername; //密碼屬性 privateStringpassword; //確認(rèn)密碼屬性 privateStringrepassword; //生日屬性 privateDatebirthday; //手機(jī)號(hào)碼屬性 privateStringmobile; //年齡屬性 privateintage;//電子郵件 privateStringemail;//set()get()方法略去publicStringexecute()throwsException{

returnFORWARD; }}4.3struts2校驗(yàn)框架此Action只有一個(gè)execute()方法,沒有提供任何校驗(yàn)功能,如果我們?yōu)榇薃ction配置一個(gè)校驗(yàn)文件后,即可利用struts2的輸入校驗(yàn)功能對(duì)該Action進(jìn)行校驗(yàn)。校驗(yàn)文件的命名規(guī)則是Actoin類名-validation.xml。如與上面的RegisterAction類對(duì)應(yīng)的校驗(yàn)文件名為:RegisterAction-validation.xml,而且此文件必須放在與要校驗(yàn)的Action類所在的同一個(gè)包中。校驗(yàn)規(guī)則文件RegisterAction-validation.xml代碼可在MyEclipse中運(yùn)行演示4.3struts2校驗(yàn)框架4.2.2struts2內(nèi)建校驗(yàn)規(guī)則Struts2檢驗(yàn)框架提供了大量的內(nèi)建校驗(yàn)規(guī)則,這些校驗(yàn)規(guī)則可以滿足大部分應(yīng)用的校驗(yàn)需求,開發(fā)者只需在配置文件中使用即可。如果現(xiàn)有的校驗(yàn)規(guī)則滿足不了實(shí)際需要,開發(fā)者可以自己開發(fā)校驗(yàn)規(guī)則。Struts2的校驗(yàn)規(guī)則注冊文件為default.xml,此文件可在struts-2.2.3-all.jar包中找到。4.3struts2校驗(yàn)框架1.不為空校驗(yàn)規(guī)則不為空校驗(yàn)規(guī)則的名字是requied,該校驗(yàn)規(guī)則要求指定的字段值不能為空。校驗(yàn)規(guī)則配置示例如下:<validators><field-validatortype="required"><!—校驗(yàn)失敗提示信息

<message>請輸入生日日期</message> </field-validator></validators>4.3struts2校驗(yàn)框架2、字符串不為空校驗(yàn)規(guī)則字符串不為空校驗(yàn)規(guī)則的名字是requiredstring,該校驗(yàn)規(guī)則要求字段值必須非空且長度大于0,即該字符串不能是“”。校驗(yàn)規(guī)則配置示例如下:<validators> <fieldname="username"> <field-validatortype="requiredstring"><!—校驗(yàn)失敗提示信息

<message>請輸入用戶名</message> </field-validator> </field></validators>4.3struts2校驗(yàn)框架3、整數(shù)校驗(yàn)規(guī)則整數(shù)校驗(yàn)規(guī)則的名字是int,該校驗(yàn)規(guī)則要求字段的整數(shù)值必須在指定的范圍內(nèi)。校驗(yàn)規(guī)則配置示例如下:<validators><fieldname="age"> <field-validatortype="int"> <paramname="min">1</param> <paramname="max">80</param><!—校驗(yàn)失敗提示信息

<message>年齡必須在${min}-${max}歲之間</message> </field-validator> </field></validators>4.3struts2校驗(yàn)框架4、日期校驗(yàn)規(guī)則日期校驗(yàn)規(guī)則的名字是date,該校驗(yàn)規(guī)則要求字段的日期值必須在指定的范圍內(nèi)。校驗(yàn)規(guī)則配置示例如下:<validators><field-validatortype="date"> <paramname="min">1928-01-01</param> <paramname="max">2004-01-01</param><!—校驗(yàn)失敗提示信息

<message>輸入生日日期無效</message> </field-validator></validators>4.3struts2校驗(yàn)框架5、字段表達(dá)式校驗(yàn)規(guī)則字段表達(dá)式校驗(yàn)規(guī)則的名字是fieldexpression,它要求指定字段滿足一個(gè)邏輯表達(dá)式。校驗(yàn)規(guī)則配置示例如下:<validators><field-validatortype="fieldexpression"> <paramname="expression">password==repassword</param><!—校驗(yàn)失敗提示信息

<message>確認(rèn)密碼和密碼輸入不一致</message> </field-validator></validators>4.3struts2校驗(yàn)框架表達(dá)式校驗(yàn)規(guī)則是通過<paramname="expression">表達(dá)式</param>來實(shí)現(xiàn)的,該表達(dá)式基于ValueStack(值棧)進(jìn)行求值,最后返回一個(gè)Boolean值;當(dāng)返回true時(shí),校驗(yàn)通過,否則校驗(yàn)失敗。4.3struts2校驗(yàn)框架6、郵件地址校驗(yàn)規(guī)則郵件地址校驗(yàn)規(guī)則的名字email,它要求被檢查的字符如果非空,則必須是合法的郵件地址。校驗(yàn)規(guī)則配置示例如下:<validators><fieldname="email"> <field-validatortype="email"><!—校驗(yàn)失敗提示信息

<message>請輸入正確的電子郵件格式</message> </field-validator> </field></validators>4.3struts2校驗(yàn)框架7、網(wǎng)址校驗(yàn)規(guī)則網(wǎng)址校驗(yàn)規(guī)則的名字是url,它要求被檢查字段的字符如果非空,則必須是合法的URL地址。這個(gè)校驗(yàn)規(guī)則是基于正則表達(dá)式進(jìn)行校驗(yàn)的,這個(gè)校驗(yàn)規(guī)則如果不能完全覆蓋所有的網(wǎng)址,建議開發(fā)者使用正則表達(dá)式自定義校驗(yàn)規(guī)則。校驗(yàn)規(guī)則配置示例如下:<validators><fieldname="url"> <field-validatortype="url"><!—校驗(yàn)失敗提示信息

<message>請輸入正確網(wǎng)址</message> </field-validator> </field></validators>4.3struts2校驗(yàn)框架8、轉(zhuǎn)換校驗(yàn)規(guī)則轉(zhuǎn)換校驗(yàn)規(guī)則的名字是conversion,它檢查被校驗(yàn)字段在類型轉(zhuǎn)換過程中是否出現(xiàn)錯(cuò)誤。校驗(yàn)規(guī)則配置示例如下:<validators><fieldname="age"> <field-validatortype="conversion"><paramname=”repopulateField”>true</param><!—校驗(yàn)失敗提示信息

<message>年齡必須為整數(shù)</message> </field-validator> </field></validators>4.3struts2校驗(yàn)框架9、字符串長度校驗(yàn)規(guī)則字符串長度校驗(yàn)規(guī)則的名字是stringlength,它要求被校驗(yàn)的長度必須在指定的范圍內(nèi),否則就算校驗(yàn)失敗。校驗(yàn)規(guī)則配置示例如下:<validators><fieldname="username"> <field-validatortype="stringlength"> <paramname="minLength">6</param> <paramname="maxLength">8</param><!—校驗(yàn)失敗提示信息

<message>確認(rèn)密碼長度必須在 ${minLength}-${maxLength}位之間</message> </field-validator> </field></validators>4.3struts2校驗(yàn)框架10、正則表達(dá)式校驗(yàn)規(guī)則正則表達(dá)式校驗(yàn)規(guī)則的名字是regex,它檢查被校驗(yàn)字段是否匹配一個(gè)正則表達(dá)式。校驗(yàn)規(guī)則配置示例如下:<validators><fieldname="username"> <field-validatortype="regex"> <paramname="expression"><![CDATA[(\W{4,20})]]></param><!—校驗(yàn)失敗提示信息

<message>你的用戶名長度必須在4到20之間,且必須是字母和數(shù)字</message> </field-validator> </field></validators>4.3struts2校驗(yàn)框架4.4Struts2開發(fā)案例本案例實(shí)現(xiàn)的功能是用戶在登錄頁面輸入用戶名和密碼,如果登錄成功轉(zhuǎn)到登錄成功頁面,并顯示用戶名和密碼。如果登錄失敗轉(zhuǎn)到失敗頁面。要求為表單提供輸入校驗(yàn)功能:用戶名不能為空且長度在10-20之間,密碼不能為空且長度在8-10之間。提示信息使用國際化實(shí)現(xiàn)。示例代碼為:chap4_example工程ThankYou!JavaEE輕量級(jí)框架Struts2+spring+Hibernate整合開發(fā)

第5章Hibernate的基礎(chǔ)知識(shí)內(nèi)容5.1ORM基本概念5.2Hibernate的體系結(jié)構(gòu)5.3HibernateAPI簡介5.4Hibernate的配置文件5.5Hibernate中的持久化類5.6Hibernate的對(duì)象-關(guān)系映射文件5.8在MyEclipse中使用Hibernate5.7通過HibernateAPI操縱數(shù)據(jù)庫5.9Session的緩存5.1ORM基本概念

5.1.1ORM框架簡介目前ORM框架有很多,但比較流行的主要有以下幾種:EJB框架:EJB是原來的sun公司的服務(wù)器端組件模型,設(shè)計(jì)目標(biāo)與核心應(yīng)用是部署分布式應(yīng)用程序。Hibernate框架:Hibernate是目前最流行的開源ORM框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來操縱數(shù)據(jù)庫。iBATIS框架:iBATIS是Apache軟件基金組織的子項(xiàng)目。它提供的持久層框架包括SQLMaps和DataAccessObjects(DAO),同時(shí)還提供一個(gè)利用這個(gè)框架開發(fā)的JPetStore實(shí)例。TopLink框架:TopLink原署WebGain公司的產(chǎn)品,后被Oracle收購,并重新包裝為

OracleASTopLink。5.1ORM基本概念5.1.2ORM中的映射關(guān)系ORM的主要目的是通過類和對(duì)象來操作數(shù)據(jù)庫,所以在ORM中必須解決編程語言中的類與對(duì)象和數(shù)據(jù)庫中的表之間的映射。不同的框架中實(shí)現(xiàn)的方式有所不同但基本思路是一樣的。類與數(shù)據(jù)庫中表的映射:對(duì)象與表中的記錄的映射類的屬性與數(shù)據(jù)庫中表的字段的映射5.2Hibernate的體系結(jié)構(gòu)Hibernate體系結(jié)構(gòu)的概要圖如下:ApplicationHibernateHibernate.propertiesXMLMappingDatabasePersistentObjects5.2Hibernate的體系結(jié)構(gòu)過圖5-1可以看出,Hibernate是連接應(yīng)用程序與數(shù)據(jù)庫之間的一個(gè)中間件,在應(yīng)用程序中通過創(chuàng)建持久化類來使用Hibernate。這樣應(yīng)用程序不再關(guān)心后臺(tái)所用的是什么數(shù)據(jù)庫,實(shí)現(xiàn)了應(yīng)用程序的業(yè)務(wù)邏輯與數(shù)據(jù)庫之間的解耦。在Hibernate框架內(nèi)需要兩個(gè)文件,一個(gè)是Hperties,該文件用于配置Hibernate和數(shù)據(jù)庫的連接信息,另一個(gè)是XML映射文件,該文件用來描述持久化類和數(shù)據(jù)庫表、數(shù)據(jù)列之間的對(duì)應(yīng)關(guān)系。5.2Hibernate的體系結(jié)構(gòu)Hibernate具體實(shí)現(xiàn)類結(jié)構(gòu)ApplicationTransactionFactoryConnectionProviderDatabasePersistentObjectsTransientObjectsSessionFactorySessionTransactionJNDIJDBCJTA5.2Hibernate的體系結(jié)構(gòu)圖5-2中各個(gè)對(duì)象的定義如下:SessionFactory(org.hibernate.SessionFactory)是針對(duì)單個(gè)數(shù)據(jù)庫映射關(guān)系經(jīng)過編譯后的內(nèi)存鏡像,是線程安全的(不可變)。它是生成Session的工廠,本身要用到ConnectionProvider。該對(duì)象可以在進(jìn)程或集群的級(jí)別上,為那些事務(wù)之間可以重用的數(shù)據(jù)提供可選的二級(jí)緩存。5.2Hibernate的體系結(jié)構(gòu)Session(org.hibernate.Session)表示應(yīng)用程序與持久儲(chǔ)存層之間交互操作的一個(gè)單線程對(duì)象,此對(duì)象生存期很短。其隱藏了JDBC連接,也是Transaction的工廠。其會(huì)持有一個(gè)針對(duì)持久化對(duì)象的必選(第一級(jí))緩存,在遍歷對(duì)象圖或者根據(jù)持久化標(biāo)識(shí)查找對(duì)象時(shí)會(huì)用到。Transient:瞬態(tài)(transient)和脫管(detached)的對(duì)象及其集合,那些目前沒有與session關(guān)聯(lián)的持久化類實(shí)例。他們可能是在被應(yīng)用程序?qū)嵗螅形催M(jìn)行持久化的對(duì)象。也可能是因?yàn)閷?shí)例化他們的Session已經(jīng)被關(guān)閉而脫離持久化的對(duì)象。5.2Hibernate的體系結(jié)構(gòu)Transaction(org.hibernate.Transaction):事務(wù)Transaction是應(yīng)用程序用來指定原子操作單元范圍的對(duì)象,它是單線程的,生命周期很短。它通過抽象將應(yīng)用從底層具體的JDBC、JTA以及CORBA事務(wù)隔離開。某些情況下,一個(gè)Session之內(nèi)可能包含多個(gè)Transaction對(duì)象。盡管是否使用該對(duì)象是可選的,但無論是使用底層的API還是使用Transaction對(duì)象,事務(wù)邊界的開啟與關(guān)閉是必不可少的。5.2Hibernate的體系結(jié)構(gòu)ConnectionProvider此對(duì)象生成JDBC連接的工廠(同時(shí)也起到連接池的作用)。它通過抽象將應(yīng)用從底層的Datasource或DriverManager隔離開。僅供開發(fā)者擴(kuò)展或?qū)崿F(xiàn)用,并不暴露給應(yīng)用程序使用。TransactionFactory(org.hibernate.TransactionFactory)對(duì)象生成Transaction對(duì)象實(shí)例的工廠。僅供開發(fā)者擴(kuò)展或?qū)崿F(xiàn)用,并不暴露給應(yīng)用程序使用。5.2Hibernate的體系結(jié)構(gòu)JNDI(JavaNamingandDirectoryInterface,Java命名和目錄接口)是一組在Java應(yīng)用中訪問命名和目錄服務(wù)的API。命名服務(wù)將名稱和對(duì)象聯(lián)系起來,使得我們可以用名稱訪問對(duì)象。目錄服務(wù)是一種命名服務(wù),在這種服務(wù)里,對(duì)象不但有名稱,還有屬性。JDBC(JavaDataBaseConnectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。5.2Hibernate的體系結(jié)構(gòu)JTA,即JavaTransactionAPI,譯為Java事務(wù)API。JTA允許應(yīng)用程序執(zhí)行分布式事務(wù)處理,在兩個(gè)或多個(gè)網(wǎng)絡(luò)計(jì)算機(jī)資源上訪問并且更新數(shù)據(jù)。JDBC驅(qū)動(dòng)程序的JTA支持極大地增強(qiáng)了數(shù)據(jù)訪問能力。5.3HibernateAPI簡介Hibernate一共有6個(gè)核心接口:Configuration、SessionFactory、Session、Transaction、Query和Criteria。它們的關(guān)系如圖5-3所示。5.3HibernateAPI簡介Configuation接口Hibernate應(yīng)用通過創(chuàng)建Configuration實(shí)例來指定對(duì)象-關(guān)系映射文件的位置或者動(dòng)態(tài)配置Hibernate的屬性,然后創(chuàng)建SessionFactory實(shí)例。SessionFactory接口一個(gè)SessionFactory實(shí)例對(duì)應(yīng)一個(gè)數(shù)據(jù)庫連接,應(yīng)用從SessionFactory中獲得Session實(shí)例。SessionFactory有以下特點(diǎn):5.3HibernateAPI簡介它是線程安全的,它的實(shí)例可以被多個(gè)應(yīng)用的線程共享。它是重量級(jí)的,不能隨意創(chuàng)建或銷毀它的實(shí)例。如果應(yīng)用只訪問一個(gè)數(shù)據(jù)庫,只需要?jiǎng)?chuàng)建一個(gè)SessionFactory實(shí)例,在應(yīng)用初始化的時(shí)候創(chuàng)建該實(shí)例。如果應(yīng)用同時(shí)訪問多個(gè)數(shù)據(jù)庫,則需要為每個(gè)數(shù)據(jù)庫創(chuàng)建一個(gè)單獨(dú)的SessionFactory實(shí)例。5.3HibernateAPI簡介Session接口Session接口是Hibernate應(yīng)用中使用最多的接口。Session也被稱為持久化管理器,它提供了和持久化相關(guān)的操作,如數(shù)據(jù)庫的添加、刪除、更新、加載和查詢。Session有以下的特點(diǎn):不是線程安全的,因此在設(shè)計(jì)軟件架構(gòu)時(shí),應(yīng)該避免多個(gè)線程共享同一個(gè)Session實(shí)例。Session實(shí)例是輕量級(jí)的,所謂輕量級(jí),是指它的創(chuàng)建和銷毀不需要耗費(fèi)太多的資源。這意味著在程序中可能經(jīng)常創(chuàng)建或銷毀Session對(duì)象,例如可以為每個(gè)請求分配單獨(dú)的一個(gè)session實(shí)例。5.3HibernateAPI簡介Transaction接口Transaction接口是Hibernate的數(shù)據(jù)庫事務(wù)接口,它對(duì)底層的事務(wù)接口做了封裝,底層事務(wù)接口包括:JDBCAPIJTA(JavaTransactionAPI)CORBA(CommonObjectRequestBrokerArchitecture)API5.3HibernateAPI簡介Query和Criteria接口Query和Criteria接口是Hibernate的查詢接口,主要用于數(shù)據(jù)庫對(duì)象查詢,以及控制執(zhí)行查詢的過程。Qurey實(shí)例包裝了一個(gè)HQL(HibernateQueryLanguage)查詢語句,HQL查詢語句與SQL查詢語句有些相似,但HQL查詢語句是面向?qū)ο蟮模妙惷邦惖膶傩悦?,而不是表名及表的字段名。Criteria接口完全封裝了基于字符串形式的查詢語句,比Query接口更加面向?qū)ο螅珻riteria接口擅長于執(zhí)行動(dòng)態(tài)查詢。Session接口的find()方法也具有數(shù)據(jù)查詢功能,但它只是執(zhí)行一些簡單的HQL查詢語句的快捷方法,它的功能遠(yuǎn)沒有Query接口強(qiáng)大。5.4Hibernate的配置文件通過上一節(jié)的API接口之間的關(guān)系可知Hibernate進(jìn)行持久化操作離不開SessionFactory對(duì)象,這個(gè)對(duì)象是整個(gè)數(shù)據(jù)庫映射關(guān)系編譯后的內(nèi)存鏡像,該對(duì)象通常由Configuration對(duì)象來產(chǎn)生。在創(chuàng)建Configuration對(duì)象之前可為其指定一個(gè)配置文件,這個(gè)配置文件保存了數(shù)據(jù)庫連接信息,當(dāng)創(chuàng)建對(duì)象時(shí)這個(gè)配置文件也會(huì)被一同加載到內(nèi)存中。5.4Hibernate的配置文件隨著Hibernate所使用配置文件的不同,創(chuàng)建Configuration對(duì)象的方式也不相同。通常有以下兩種Hibernate的配置文件,perties和hibernate.cfg.xml文件。我們著重介紹常用的XML配置文件hibernate.cfg.xml。例5-1下面我們看一個(gè)簡單的Hibernate.cfg.xml配置文件,這個(gè)配置文件是描述一個(gè)MySql數(shù)據(jù)庫testdb的相關(guān)配置信息。,5.4Hibernate的配置文件<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhibernate-configurationPUBLIC"-//Hibernate/HibernateConfigurationDTD3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <propertyname="connection.username">root</property> <propertyname="connection.url">jdbc:mysql://localhost:3306/testdb </property> <propertyname="dialect">org.hibernate.dialect.MySQLDialect </property> <propertyname="connection.password">11</property> <propertyname="connection.driver_class">com.mysql.jdbc.Driver </property> <mappingresource="com/ssh/book/entity/SysUser.hbm.xml"/> </session-factory></hibernate-configuration>5.4Hibernate的配置文件這是一個(gè)最基本的Hibernate配置文件,有了這個(gè)文件就可以創(chuàng)建Configuration對(duì)象,也就可以創(chuàng)建一個(gè)SessionFactory實(shí)例,有了這個(gè)實(shí)例就可以面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫了。在hibernat.cfg.xml文件中都是以屬性的方式來配置相關(guān)信息的,下面的表中列出一些常用的屬性及其含義。5.4Hibernate的配置文件hibernate.connection.driver_class設(shè)置連接數(shù)據(jù)庫的驅(qū)動(dòng)。如MySql數(shù)據(jù)庫的驅(qū)動(dòng):com.mysql.jdbc.Driverhibernate.connection.url設(shè)置所需連接數(shù)據(jù)庫服務(wù)的URL。如連接MySql數(shù)據(jù)庫的字符串為:jdbc:mysql://localhost:3306/testdb,其中testdb為連接的具體數(shù)據(jù)庫的名字。hibernate.connection.username連接數(shù)據(jù)庫的用戶名。如連接MySql數(shù)據(jù)庫的默認(rèn)用戶名為:roothibernate.connection.password連接數(shù)據(jù)庫的密碼hibernate.connection.dialect設(shè)置連接數(shù)據(jù)庫所用的方言。如MySql數(shù)據(jù)庫的方言為Mysql。hibernate.connection.datasource指定數(shù)據(jù)源JNDI名字。如果數(shù)據(jù)源是JNDI則用到此屬性。hibernate.connection.jndi.url指定JNDI提供者的URL,此項(xiàng)可選hibernate.sho_sql設(shè)置是否在控制臺(tái)上輸出Hibernate生成的SQL語句。只能為true和false。此項(xiàng)在調(diào)試程序時(shí)是非常有用的。hibernate.connection.jndi.class指定JNDIinitialContextFactory的實(shí)現(xiàn)類,此項(xiàng)可選hibernate.cache.use_query_cache設(shè)置是否允許查詢緩存hibernate.cache.use_second_level_cache用于設(shè)置是否啟用二級(jí)緩存hibernate.max_fetcdh_depth設(shè)置外連接抓取的深度5.5Hibernate中的持久化類持久化類是指需要被Hibernate持久化到數(shù)據(jù)庫中的實(shí)例所對(duì)應(yīng)的類。Hibernate采用的是低入侵式的設(shè)計(jì),所以對(duì)持久化類沒有作任何要求,Hibernate中操作的持久化類對(duì)象都是普通的Java類對(duì)象,我們也稱為POJO,與普通的JavaBean沒有什么區(qū)別,但有些規(guī)則還是要遵守的。5.5Hibernate中的持久化類持久化類必須有一個(gè)無參的構(gòu)造方法:持久化類必須有一個(gè)唯一標(biāo)識(shí)屬性持久化類的每個(gè)屬性必須提供setXXX()和getXXX()方法持久化類何時(shí)需要實(shí)現(xiàn)java.io.Serializable接口,這取決于應(yīng)用環(huán)境:對(duì)于采用分布式結(jié)構(gòu)的Java應(yīng)用,當(dāng)java對(duì)象在不同的進(jìn)程節(jié)點(diǎn)之間傳輸時(shí),這個(gè)對(duì)象所屬的類必須實(shí)現(xiàn)Serializable接口.此外,在JavaWeb應(yīng)用中,如果希望對(duì)HttpSession中存放的對(duì)象進(jìn)行持久化,那么這個(gè)Java對(duì)象所屬的類也必須實(shí)現(xiàn)Serializable接口。5.5Hibernate中的持久化類Hibernate的持久化對(duì)象有以下三種狀態(tài)。瞬態(tài):對(duì)象由new操作符創(chuàng)建,且尚未與HibernateSession關(guān)聯(lián)的對(duì)象被認(rèn)為處于瞬態(tài)。瞬態(tài)對(duì)象不會(huì)被持久化到數(shù)據(jù)庫中,也不會(huì)被賦予持久化標(biāo)識(shí)。如果程序中失去了瞬態(tài)對(duì)象的引用,瞬態(tài)對(duì)象將被自動(dòng)回收。使用HibernateSession可以將其變?yōu)槌志没b態(tài)。持久化:持久化實(shí)例在數(shù)據(jù)庫中有對(duì)應(yīng)的記錄,并擁有一個(gè)持久化標(biāo)識(shí)。持久化實(shí)例可以是剛剛保存的,也可以是剛被加載的。無論哪一種,持久化對(duì)象都必須與指定的HibernateSession關(guān)聯(lián)。Hibernate會(huì)檢測到處于持久化狀態(tài)對(duì)象的改變,在對(duì)象操作完成時(shí)會(huì)將對(duì)象數(shù)據(jù)自動(dòng)寫回?cái)?shù)據(jù)庫。5.5Hibernate中的持久化類脫管:某個(gè)實(shí)例曾經(jīng)處于持久化狀態(tài),但隨著與之關(guān)聯(lián)的Session被關(guān)閉,該對(duì)象就變成了脫管裝態(tài)。脫管對(duì)象的引用依然有效,對(duì)象可繼續(xù)被修改。如果重新讓脫管對(duì)象與某個(gè)Session關(guān)聯(lián),這個(gè)脫管對(duì)象會(huì)重新轉(zhuǎn)換為持久化裝態(tài),而脫管期間的改動(dòng)也不會(huì)丟失,也可被寫入數(shù)據(jù)庫。對(duì)象狀態(tài)轉(zhuǎn)換如圖5-4所示5.5Hibernate中的持久化類對(duì)象狀態(tài)轉(zhuǎn)換圖5.5Hibernate中的持久化類給出MySql數(shù)據(jù)庫testdb中的部門表department對(duì)應(yīng)的POJO(普通Java類對(duì)象),表的結(jié)構(gòu)為:depId[Integer]、depName[varchar(45)]、depFlag[char(1)]。Department.java代碼如下:5.5Hibernate中的持久化類privateIntegerdepId; privateStringdepName; /**defaultconstructor*/ publicDepartment(){ } /**minimalconstructor*/ publicDepartment(StringdepName,StringdepFlag){ this.depName=depName; } publicIntegergetDepId(){ returnthis.depId; } publicvoidsetDepId(IntegerdepId){ this.depId=depId; } publicStringgetDepName(){ returnthis.depName; } publicvoidsetDepName(StringdepName){ this.depName=depName; }}5.5Hibernate中的持久化類這是一個(gè)普通的Java類,沒有父類也沒有實(shí)現(xiàn)任何接口,類中的屬性與表中的屬性是一一對(duì)應(yīng)的,數(shù)據(jù)庫的數(shù)據(jù)類型要轉(zhuǎn)換為相應(yīng)的Java數(shù)據(jù)庫類型,每個(gè)屬性要有相應(yīng)的set和get方法,還要有一個(gè)默認(rèn)的構(gòu)造方法。這實(shí)際上就是一個(gè)普通的JavaBean。5.6Hibernate的對(duì)象-關(guān)系映射文件Hibernate采用XML格式的文件來指定對(duì)象和關(guān)系數(shù)據(jù)庫之間的映射。在程序運(yùn)行時(shí),Hiberante將根據(jù)這個(gè)映射文件來生成各種SQL語句。一般的數(shù)據(jù)庫中一個(gè)表對(duì)應(yīng)一個(gè)映射文件,這些映射文件的結(jié)構(gòu)基本上是相同的。每個(gè)映射文件的內(nèi)容主要是以XML的方式描述數(shù)據(jù)庫表的相關(guān)信息。5.6Hibernate的對(duì)象-關(guān)系映射文件例5-3數(shù)據(jù)表department的映射文件。數(shù)據(jù)庫testdb中的部門表department在MySql中的結(jié)構(gòu)如下圖所示,這個(gè)表一共有三個(gè)屬性:depId(INTEGER)、depName(VARCHAR)、depFlag(CHAR),其中depId是主鍵,并且是自動(dòng)增長的。在Hibernate中對(duì)應(yīng)的映射文件Department.hbm.xml的代碼如下:5.6Hibernate的對(duì)象-關(guān)系映射文件<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><classname="com.entity.Department"table="department"catalog="testdb"><idname="depId"type="java.lang.Integer"><columnname="depId"/><generatorclass="native"/></id><propertyname="depName"type="java.lang.String"><columnname="depName"length="45"not-null="true"/></property></class></hibernate-mapping>5.6Hibernate的對(duì)象-關(guān)系映射文件文檔中的元素及其屬性的含義解釋如下。<class>元素:一個(gè)<class>對(duì)應(yīng)一個(gè)持久化類,每個(gè)持久化類對(duì)應(yīng)一個(gè)數(shù)據(jù)表。Name屬性指定類所在的包和類的名字,table屬性指定了數(shù)據(jù)表的名字,catalog指定了數(shù)據(jù)表所在數(shù)據(jù)庫的名字。<id>元素:<id>是<class>的子元素。由于表中的每個(gè)記錄都有一個(gè)唯一標(biāo)識(shí),對(duì)應(yīng)的類的實(shí)例也要有一個(gè)唯一的標(biāo)識(shí)屬性,這是通過<id>子元素定義的,<id>元素的name屬性定義了持久化類的唯一標(biāo)識(shí)屬性變量,type屬性定義了變量的數(shù)據(jù)類型,這里的數(shù)據(jù)類型可以是java的數(shù)據(jù)類型也可以是Hibernate的數(shù)據(jù)類型,我們這里是java的數(shù)據(jù)類型。5.6Hibernate的對(duì)象-關(guān)系映射文件<column>元素:<column>是<id>的子元素。它是用來指定數(shù)據(jù)表中的標(biāo)識(shí)列的名字的。<generator>元素:<generator>是<id>的子元素。它是用來指定唯一標(biāo)識(shí)的生成方式,是標(biāo)識(shí)符生成器,最終是以什么方式生成標(biāo)識(shí)符是由class屬性的值來決定的。Class屬性的值及其含義如表5-2所示。表5-2Class屬性的值及其含義5.6Hibernate的對(duì)象-關(guān)系映射文件Class的值含義increment適用于代理主鍵。由Hibernate自動(dòng)以自增的方式生成標(biāo)識(shí)符,每次增量為1identity適用于代理主鍵。由底層數(shù)據(jù)庫生成標(biāo)識(shí)符,前提條件是底層數(shù)據(jù)庫支持自動(dòng)增長字段類型sequence適用于代理主鍵。Hibernate根據(jù)底層數(shù)據(jù)庫的序列來生成標(biāo)識(shí)符,前提條件是底層數(shù)據(jù)庫支持序列hilo適用于代理主鍵。適用于代理主鍵。Hibernate根據(jù)high/low算法來生成標(biāo)識(shí)符native適用于代理主鍵。根據(jù)底層數(shù)據(jù)庫對(duì)自動(dòng)生成標(biāo)識(shí)符的能力來選擇identity、sequence或hilouuid.hex適用于代理主鍵。Hibernate采用128位的UUID算法生成標(biāo)識(shí)符,UUID算法能夠生成網(wǎng)絡(luò)環(huán)境中的唯一字符串標(biāo)識(shí)assigned適用于自然主鍵。由Java應(yīng)用程序負(fù)責(zé)生成標(biāo)識(shí)符5.6Hibernate的對(duì)象-關(guān)系映射文件<property>元素:<property>元素是<class>的子元素,每個(gè)<class>可以有0個(gè)或多個(gè)<property>子元素,它的多少取決于數(shù)據(jù)表中屬性列的個(gè)數(shù)。<property>是用來指定與數(shù)據(jù)表的屬性列對(duì)應(yīng)的持久化類中的屬性變量的。name屬性指定了持久化類中變量的名字,type屬性指定屬性變量的數(shù)據(jù)類型。<column>元素:<column>是<property>的子元素,它主要描述數(shù)據(jù)表屬性列的相關(guān)信息。<column>的name屬性指定了持久化類對(duì)應(yīng)的數(shù)據(jù)表中的屬性列的名字,它的length屬性指定了字符串的最大長度限制,not-null指定此列是否允許為空的限制。5.7通過HibernateAPI操縱數(shù)據(jù)庫Hibernate對(duì)JDBC進(jìn)行了封裝,提供了面向?qū)ο蟮腁PI來操作數(shù)據(jù)庫。如圖5-6所示為通過HibernateAPI訪問數(shù)據(jù)庫的示意圖Java應(yīng)用HibernateAPIJDBCAPI數(shù)據(jù)庫5.7通過HibernateAPI操縱數(shù)據(jù)庫在Hibernate中要想通過API操作數(shù)據(jù)庫,必須先獲得一個(gè)Session對(duì)象,通過這個(gè)對(duì)象的相關(guān)方法才可以操作數(shù)據(jù)庫。獲取對(duì)象的步驟如下:創(chuàng)建一個(gè)Configuration類的實(shí)例,Configurati

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論