版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
重慶正大軟件學院軟件系《MVC框架程序設(shè)計》電子教案重慶正大軟件學院軟件系《MVC框架程序設(shè)計》課程組重慶正大軟件職業(yè)技術(shù)學院教案(項目類)授課對象系別軟件系本次課學時4學時年級班次大二章節(jié)題目第4章hibernate注解目的要求(含技能要求)理解注解的概念掌握在hibernate框架中使用注解方式配置實體與表的映射關(guān)系本節(jié)重點掌握在hibernate框架中使用注解方式配置實體與表的映射關(guān)系本節(jié)難點理解注解的概念教學方法項目教學法教學用具機房、屏幕廣播問題引入通過本章第一節(jié)用戶注冊數(shù)據(jù)入庫案例,從而引出本次課程。難點與重點講解方法引導(dǎo)、分析、講解、實作演示本次課小結(jié)課程小結(jié)教后禮記討論、思考題、作業(yè)(含實訓(xùn)作業(yè))完成本次課的課堂任務(wù)填寫實驗報告任務(wù)介紹(5分鐘)改造本章第一節(jié)注冊信息入庫的任務(wù),使用hibernate框架注解方式取代對象與表的映射文件來實現(xiàn)注冊入庫,改造后執(zhí)行效果與改造前一樣。任務(wù)解析(50-60分鐘)加入hibernate框架注解相關(guān)jar包修改用戶實體類User,增加注解相關(guān)代碼。修改hibernate.cfg.xml配置文件。dao層:修改數(shù)據(jù)庫入庫處理類。調(diào)試運行詳細步驟加入hibernate框架注解相關(guān)jar包在eclipse中打開第8章第一節(jié)完成的工程,加入注解相關(guān)jar包,具體jar包請參考本節(jié)任務(wù)解析部分【例子3.5-1c】的相關(guān)內(nèi)容,該jar包在同一個工程中只需加入一次。修改用戶實體類User,增加注解相關(guān)代碼,參考如下:@Entity@Table(name="user")publicclassUser{ @Id() @GeneratedValue(generator="userid") @GenericGenerator(name="userid",strategy="native") intid; @Column(name="name") Stringname; @Column(name="userName") StringuserName; @Column(name="password") Stringpassword; @Column(name="sex") Stringsex; @Column(name="province") Stringprovince; @Column(name="age") intage; @Column(name="birth") Datebirth; @Column(name="mobile") Stringmobile; @Column(name="hobbies") Stringhobbies; @Column(name="email") Stringemail; //以下省略每個成員變量的get/set方法}修改hibernate.cfg.xml配置文件。修改src目錄下的hibernate.cfg.xml,刪除或屏蔽下列代碼:<mappingresource="com/zdsoft/domain/User.hbm.xml"/>并在該位置添加代碼:<mappingclass="com.zdsoft.domain.User"/>dao層:修改數(shù)據(jù)庫入庫處理類。修改com.zdsoft.dao包下的數(shù)據(jù)處理類RegisterDao的構(gòu)造方法,save方法可完全重用,不作修改。構(gòu)造方法RegisterDao的關(guān)鍵代碼如下: publicRegisterDao(){ cfg=newAnnotationConfiguration();//注解方式創(chuàng)建 cfg.configure(); sessionFactory=cfg.buildSessionFactory(); }調(diào)試運行發(fā)布工程,啟動web服務(wù)器,運行注冊頁面,按照本章第一節(jié)任務(wù)運行,其結(jié)果一樣。根據(jù)任務(wù)提出問題(45-55分鐘)什么是注解?如何在hibernate框架中使用注解方式配置對象與表的關(guān)系映射?問題解析(45-55分鐘)關(guān)于注解注解(annotation)概念:是與一個程序中某個元素關(guān)聯(lián)信息或元數(shù)據(jù)的標注。它不直接影響java程序的執(zhí)行,但是對例如編譯器警告或者像文檔生成器等輔助工具產(chǎn)生影響。注解在java1.5以上支持。我們可以這樣理解:注解是一個標注;不直接影響java程序的執(zhí)行;注解的作用是為被注解的程序提供執(zhí)行所需的類似于工具、文檔或類庫,它反過來會影響程序的執(zhí)行。深入了解——注解與注釋的異同。相同點:都是給程序進行標注,都不是必須的。不同點:作用對象不同——注釋是給程序員看的,是把程序?qū)Τ绦騿T進行解釋,注解是給編譯器看的,是把程序?qū)幾g器進行解釋;程序運行結(jié)果不同——注釋不影響程序的結(jié)果,注解不直接影響程序執(zhí)行,但為被注解的程序提供執(zhí)行所需的類似于工具、文檔或類庫,程序在運行中有可能會用到注解所提供的“庫”,從而間接影響程序執(zhí)行結(jié)果。注解語法:@+注解類型名+(參數(shù)名=參數(shù)值,...)語法說明:注解是一種修飾符,能夠如其它修飾符(如public、static、final)一般使用。習慣用法是,注解用在其它的修飾符前面。注解由@開頭;注解類型是關(guān)鍵字,()里邊是多個成員-值列表組成的。這些參數(shù)的值必須是編譯時常量(即在運行時不變)。如何獲得注解類型?這里可以通過三種方式獲得。方式1:使用內(nèi)建注解——Java5.0中經(jīng)常用到三個內(nèi)建注解:@Deprecated用于修飾已經(jīng)過時的方法;@Override用于修飾此方法覆蓋了父類的方法(而非重載);@SuppressWarnings用于通知java編譯器禁止特定的編譯警告?!纠?.5-1a】一個使用Java5.0內(nèi)建注解的類,該類演示了三個內(nèi)建注解的使用:publicclassUsingBuiltInAnnotation{//食物類classFood{}//干草類classHayextendsFood{}//動物類classAnimal{FoodgetFood(){returnnull;}//使用Annotation聲明Deprecated方法@DeprecatedvoiddeprecatedMethod(){}}//馬類-繼承動物類classHorseextendsAnimal{//使用Annotation聲明覆蓋方法@OverrideHaygetFood(){returnnewHay();}//使用Annotation聲明禁止警告@SuppressWarnings({"deprecation","unchecked"})voidcallDeprecatedMethod(ListhorseGroup){Animalan=newAnimal();an.deprecatedMethod();horseGroup.add(an);}}}參考資料:/docs/books/tutorial/java/javaOO/annotations.html/j2se/1.5.0/docs/guide/language/annotations.html/jgloss/annotations.html方式2:開發(fā)者自定義注解類型——類似于定義一個接口interface【例子3.5-1b】自定義一個注解類型@AnnotationDefineForTestFunction首先,定義注解類型@AnnotationDefineForTestFunction,代碼如下:importjava.lang.annotation.*;/***定義annotation*@authorcleverpig**///加載在VM中,在運行時進行映射@Retention(RetentionPolicy.RUNTIME)//限定此annotation只能標示方法@Target(ElementType.METHOD)public@interfaceAnnotationDefineForTestFunction{}然后,使用該注解類型,參考代碼如下:/***一個實例程序應(yīng)用前面定義的Annotation:AnnotationDefineForTestFunction*/publicclassUsingAnnotation{@AnnotationDefineForTestFunctionpublicstaticvoidmethod01(){}@AnnotationDefineForTestFunctionpublicstaticvoidmethod02(){}@AnnotationDefineForTestFunctionpublicstaticvoidmethod03(){thrownewRuntimeException("method03");}publicstaticvoidmethod04(){thrownewRuntimeException("method04");}publicstaticvoidmain(String[]argv)throwsException{intpassed=0,failed=0;//被檢測的類名StringclassName="annotation.custom.UsingAnnotation";//逐個檢查此類的方法,當其方法使用annotation聲明時用此方法for(Methodm:Class.forName(className).getMethods()){if(m.isAnnotationPresent(AnnotationDefineForTestFunction.class)){try{m.invoke(null);passed++;}catch(Throwableex){System.out.printf("測試%s失敗:%s%n",m,ex.getCause());failed++;}}}System.out.printf("測試結(jié)果:通過:%d,失?。?d%n",passed,failed);}}代碼說明:上述類中main程序從className中取出類名,并且遍歷此類的所有方法,嘗試調(diào)用其中被自定義的注解類型AnnotationDefineForTestFunction標注過的方法。在此過程中為了找出哪些方法被AnnotationDefineForTestFunction類型標注過,需要使用反射的方式執(zhí)行此查詢。如果在調(diào)用方法時拋出異常,此方法被認為已經(jīng)失敗,并打印一個失敗報告。最后,打印運行通過/失敗的方法數(shù)量。方式3:使用第三方開發(fā)的注解類型:這是開發(fā)人員所常常用到的一種方式。比如我們使用JPA或者Hibernate框架中的注解類型,就以利用其中之一生成數(shù)據(jù)表映射配置文件,而不必使用xml文檔。關(guān)于JPA與hibernate框架:JPA(JavaPersistenceAPI,java持久化對象應(yīng)用編程接口)是Sun官方提出的Java持久化規(guī)范。它為Java開發(fā)人員提供了一種對象/關(guān)系映射工具來管理Java應(yīng)用中的關(guān)系數(shù)據(jù)。其目的主要是為了簡化現(xiàn)有的持久化開發(fā)工作和整合ORM技術(shù),結(jié)束現(xiàn)在Hibernate、TopLink等ORM框架各自為營的局面,制定一個可以由很多供應(yīng)商實現(xiàn)的API,并且開發(fā)人員可以編碼來實現(xiàn)該API,而不是使用私有供應(yīng)商特有的API。因此開發(fā)人員只需使用供應(yīng)商特有的API來獲得JPA規(guī)范沒有解決但應(yīng)用程序中需要的功能。盡可能地使用JPA的API,但是當需要供應(yīng)商公開但是規(guī)范中沒有提供的功能時,則使用供應(yīng)商特有的API。JPA是需要供應(yīng)商來實現(xiàn)其功能的,Hibernate就是JPA供應(yīng)商中很強的一個,目前來說應(yīng)該無人能出其右。從功能上來說,JPA現(xiàn)在就是Hibernate功能的一個子集。Hibernate從3.2開始,就開始兼容JPA。Hibernate3.2獲得了SunTCK的JPA(JavaPersistenceAPI)兼容認證。接下來,使用hibernate框架提供的注解類型,正是本節(jié)要重點介紹的內(nèi)容。關(guān)于hibernate框架注解官方文檔可參考/hibernate/annotations/3.4/reference/zh_cn/html_single/.如何在hibernate框架中使用注解方式配置對象與表的關(guān)系映射?如何使用注解:以學生信息管理系統(tǒng)新增學生信息入庫為例。【例子3.5-1c】學生信息管理系統(tǒng)中新生入學時需要錄入學生信息,學生信息包括學生姓名,性別,年齡,學號等。要求使用hibernate注解方式完成學生信息新增功能(不要求頁面,僅僅實現(xiàn)后臺入庫)。在數(shù)據(jù)庫中學生表結(jié)構(gòu)如表3.5-1a所示。表3.5-1a學生表student字段序號中文描述英文字段名字段類型備注流水號idintpk、notnull、自增學號studentNovarchar(50)notnull姓名studentNamevarchar(100)性別sexvarchar(2)年齡ageint步驟1:先在數(shù)據(jù)庫中創(chuàng)建如表3.5-1a所示的學生表,然后在eclipse或myeclipse中創(chuàng)建web工程studentInfoManage,并把hibernate及數(shù)據(jù)庫所需的jar文件拷貝到該工程WebContent/WEB-INF/lib目錄下。其中,hibernate注解安裝包(hibernate-annotations-3.4.0.GA.zip)需要解壓三個jar包:hibernate-annotations.jar、lib\ejb3-persistence.jar、hibernate-commons-annotations.jar,另外,要求JDK5.0以上(JDK1.5以上)。步驟2:在工程中創(chuàng)建com.zdsoft.domain包,在該包下新建學生實體類Student,關(guān)鍵代碼如下:@Entity@Table(name="student")publicclassStudent{@Id@GeneratedValue(generator="pkGenerator")@GenericGenerator(name="pkGenerator",strategy="native")privateintid;@ColumnprivateStringstudentName;@ColumnprivateStringstudentNo;@ColumnprivateStringsex;@Columnprivateintage; //以下省略get/set方法}.代碼說明:@Entity聲明一個實體類,必須配置項,將一個類聲明為一個實體類(即一個持久化POJO類,該類是要和表進行映射的)。聲明位置:聲明在實體類定義的前面,本例聲明了類Student是一個實體類。@Table(name="student")常見語法:@Table(name=“表名”);位置:聲明在類定義的前面;說明:聲明了該實體類映射關(guān)聯(lián)的表(table)。name屬性就是指定表名。若沒有使用該聲明,默認映射與類名相同的表名。本例指定實體類Stuent映射的表是student。通??梢詫Entity與@Table兩種注解簡化配置為:@Entity(name=”student”)。@Id必須配置項,用來聲明主鍵,常見語法:@Id();位置:聲明在某個類成員變量或該成員變量的get方法前;本例聲明了該實體類Student類的成員變量id為主鍵屬性(對應(yīng)表中的主鍵)。注意:若該注解沒有參數(shù),則類中成員變量名必須與表中的主鍵名一致。@GeneratedValue(generator="pkGenerator")@GenericGenerator(name="pkGenerator",strategy="native")組合配置項,用來聲明主鍵值的生成方式,常見語法:@GeneratedValue(generator=“生成器名字")@GenericGenerator(name=“生成器名字”,strategy=“生成策略")聲明位置:聲明在@id后面,@GeneratedValue與@GenericGenerator配合使用;用來指定在增加記錄到表中時,其主鍵值的賦值方式;生成器名字:程序員自定;生成策略:關(guān)鍵字,由hibernate框架提供了10多種生成策略,本例指定native就是將主鍵的生成工作交由數(shù)據(jù)庫完成,hibernate不管(很常用),其他生成策略參見表3.5-1b所示。表3.5-1bhibernate框架提供的生成策略序號生成策略使用說明native對于orcale采用Sequence方式,對于MySQL和SQLServer采用identity(處境主鍵生成機制),native就是將主鍵的生成工作將由數(shù)據(jù)庫完成,hibernate不管(很常用)
例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="native")uuid采用128位的uuid算法生成主鍵,uuid被編碼為一個32位16進制數(shù)字的字符串。占用空間大(字符串類型)。例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="uuid")hilo要在數(shù)據(jù)庫中建立一張額外的表,默認表名為hibernate_unque_key,默認字段為integer類型,名稱是next_hi(比較少用)例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="hilo")assigned在插入數(shù)據(jù)的時候主鍵由程序處理(很常用),這是<generator>元素沒有指定時的默認生成策略。等同于JPA中的AUTO。例:
@GenericGenerator(name="",strategy="assigned")identity使用SQLServer和MySQL的自增字段,這個方法不能放到Oracle中,Oracle不支持自增字段,要設(shè)定sequence(MySQL和SQLServer中很常用)。等同于JPA中的IDENTITY,例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="identity")select使用觸發(fā)器生成主鍵(主要用于早期的數(shù)據(jù)庫主鍵生成機制,少用)例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="select")sequence調(diào)用謹慎數(shù)據(jù)庫的序列來生成主鍵,要設(shè)定序列名,不然hibernate無法找到。例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="sequence",
parameters={@Parameter(name="sequence",value="seq_payablemoney")})seqhilo通過hilo算法實現(xiàn),但是主鍵歷史保存在Sequence中,適用于支持Sequence的數(shù)據(jù)庫,如Orcale(比較少用)例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="seqhilo",
parameters={@Parameter(name="max_lo",value="5")})increnment插入數(shù)據(jù)的時候hibernate會給主鍵添加一個自增的主鍵,但是一個hibernate實例就維護一個計數(shù)器,所以在多個實例運行的時候不能使用這個方法。例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="increnment")foreign使用另一個相關(guān)的對象的主鍵。通常和<one-to-one>聯(lián)合起來使用。例:@Id
@GeneratedValue(generator="idGenerator")
@GenericGenerator(name="idGenerator",strategy="foreign",parameters={@Parameter(name="property",value="info")})
Integerid;
@OneToOne
EmployeeInfoinfo;guid采用數(shù)據(jù)庫底層的guid算法機制,對應(yīng)MySQL的uuid()函數(shù),SQLServer的newid()函數(shù),ORCALE的rawtohex(sys_guid())函數(shù)等。例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="guid")uuid.hex類似uuid,建議用uuid替換,例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="uuid.hex")sequence-identitysequence策略的擴展,采用立即檢索策略來獲取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本,例:@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="sequence-identity",
parameters={@Parameter(name="sequence",value="seq_payablemoney")})@Column可選配置項,聲明非主鍵字段,常見語法:@Column(name=“列名”);聲明位置:聲明在某個類成員變量或該成員變量的get方法前;聲明了該實體類的非主鍵屬性(對應(yīng)表中的某個非主鍵的字段)其中,name屬性指定表中的某個非主鍵列名,可選,默認列名與實體類的成員變量名一樣。@Column注解的其他屬性說明:unique可選,是否唯一(默認值false);nullable可選,是否為空(默認值false)insertable可選,該列是否可以增加(默認值true);updatable可選,該列是否可以更新(默認值true);columnDefinition可選,為這個特定列覆蓋sql的ddl片段(這可能導(dǎo)致無法在不同數(shù)據(jù)庫間移植);table可選,定義對應(yīng)的表(默認為主表);length可選,列長度(默認值255);precision可選,列十進制精度(decimalprecision)(默認值0);scale可選,如果列十進制數(shù)值范圍(decimalscale)可用,可以設(shè)置(默認值0)。步驟3:編寫hibernate.cfg.xml文件,加入實體類映射配置,關(guān)鍵代碼如下:<mappingclass="com.zdsoft.domain.Student"/>代碼說明:此處修改改變了hibernate加載持久化對象的方式。在使用xml配置文件方式下使用的是Student.hbm.xml映射文件,在使用注解方式下直接配置Student類。注:目前版本的hibernate,兩種方式不能混用。步驟4:新建數(shù)據(jù)庫處理類StudentDao,其中創(chuàng)建sessionFactory的關(guān)鍵代碼(與使用配置文件進行映射的不一樣),兩者不能混用:注解方式:newAnnotationConfiguration().configure().buildSessionFactory();配置文件方式:newConf
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 年產(chǎn)3200噸稀土氧化物生產(chǎn)線項目可行性研究報告寫作模板-拿地申報
- 價值鏈分析與管理會計
- 素質(zhì)測評技術(shù)與方法
- 中移鐵通有限公司介紹
- 母嬰衣物知識培訓(xùn)課件
- 初三春季開學第一課主題班會
- 公共財政轉(zhuǎn)型與政府衛(wèi)生籌資責任的回歸
- 2025版氣候變化應(yīng)對項目捐贈協(xié)議書范本3篇
- 蜜雪冰城品牌介紹
- 臨床醫(yī)院感染管理辦法
- 小學三年級下冊英語(牛津上海一起點)全冊語法知識點總結(jié)
- 2024秋期國家開放大學《建筑工程項目管理》一平臺在線形考(作業(yè)1至4)試題及答案
- 臨床5A護理模式
- 2025屆高考英語一輪復(fù)習讀后續(xù)寫說課課件
- 潔柔形象升級與整合內(nèi)容營銷方案
- 2025屆高考數(shù)學一輪復(fù)習建議 概率與統(tǒng)計專題講座
- 廣東省公務(wù)員考試筆試真題及答案
- 吸入療法在呼吸康復(fù)應(yīng)用中的中國專家共識2022版
- 風險分級管控和隱患排查治理體系培訓(xùn)考試題參考答案
- 部編版二年級下冊語文第四單元教學設(shè)計含語文園地四
- 江西省第一屆職業(yè)技能大賽分賽場項目技術(shù)文件(世賽選拔)網(wǎng)絡(luò)安全
評論
0/150
提交評論