《EJB入門經(jīng)典》總結(jié)_第1頁
《EJB入門經(jīng)典》總結(jié)_第2頁
《EJB入門經(jīng)典》總結(jié)_第3頁
《EJB入門經(jīng)典》總結(jié)_第4頁
《EJB入門經(jīng)典》總結(jié)_第5頁
已閱讀5頁,還剩174頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1EJB3.0入門經(jīng)典入門經(jīng)典2關(guān)于開題報告答辯關(guān)于開題報告答辯n請各位同學(xué),根據(jù)答辯時老師的建議,認真修請各位同學(xué),根據(jù)答辯時老師的建議,認真修改三大件改三大件;n將修改結(jié)束以壓縮包的形式發(fā)給指導(dǎo)教師。將修改結(jié)束以壓縮包的形式發(fā)給指導(dǎo)教師。3重點章節(jié)重點章節(jié)n第第2章章 會話會話Bean (Session Bean)n第第3章章 實體實體Bean (Entity Bean)n第第6章章 Web服務(wù)服務(wù) (Web Service)4題型題型1. 讀程序,寫結(jié)果;讀程序,寫結(jié)果;2. 編程;編程;3. 寫操作步驟。寫操作步驟。52.1.2 開發(fā)只實現(xiàn)開發(fā)只實現(xiàn) Local 接口的無狀態(tài)接口的無狀

2、態(tài) Session Beann 開發(fā)只有開發(fā)只有 Local 接口接口的無狀態(tài)會話的無狀態(tài)會話Session Bean,使用,使用Local 注釋聲明接口是本地接口。注釋聲明接口是本地接口。 n 開發(fā)只有開發(fā)只有 Remote 接口接口的無狀態(tài)會話的無狀態(tài)會話Session Bean ,使,使用用Remote 注釋聲明接口是遠程接口。注釋聲明接口是遠程接口。n 當(dāng)當(dāng)Local 和和Remote 注釋注釋都不存在都不存在時,容器會將時,容器會將 Bean class 實現(xiàn)的接口默認為實現(xiàn)的接口默認為 Local 接口。如果接口。如果 EJB 與與客戶端客戶端 部署在同一個應(yīng)用服務(wù)器,采用部署在同

3、一個應(yīng)用服務(wù)器,采用 Local 接口訪問接口訪問 EJB 優(yōu)于優(yōu)于 Remote 接口。接口。6業(yè)務(wù)接口:業(yè)務(wù)接口:LocalHelloWorld.java n 工程:工程:LocalSessionBean72.4 Stateful Session Bean開發(fā)開發(fā)n 在一些應(yīng)用場合中,有時我們需要每個用戶都有自己在一些應(yīng)用場合中,有時我們需要每個用戶都有自己的一個實例,這個實例不受其他用戶影響。的一個實例,這個實例不受其他用戶影響。q 購物車對象,每個用戶都應(yīng)有自己的購物車,不希望有人往購物車對象,每個用戶都應(yīng)有自己的購物車,不希望有人往你的購物車里添加或拿掉商品,而有狀態(tài)你的購物車里添加

4、或拿掉商品,而有狀態(tài)Bean正好滿足你正好滿足你的這種需求。的這種需求。n 每個有狀態(tài)每個有狀態(tài)Bean在在bean實例的生命周期內(nèi)都只服務(wù)實例的生命周期內(nèi)都只服務(wù)于一個用戶,于一個用戶,bean class的成員變量可以在不同的方的成員變量可以在不同的方法調(diào)用間維護特定于某個用戶的數(shù)據(jù)。法調(diào)用間維護特定于某個用戶的數(shù)據(jù)。82.4 Stateful Session Bean開發(fā)開發(fā)9Bean 類:類:CartBean.java 10有狀態(tài)有狀態(tài) Bean 的的 JSP 客戶端代碼:客戶端代碼:StatefulBeanTest.jsp 1. 先試圖從先試圖從session中獲取購中獲取購物車的存

5、根。物車的存根。2. 如果當(dāng)前如果當(dāng)前session不存在購不存在購物車,就創(chuàng)建一個新的購物物車,就創(chuàng)建一個新的購物車放入車放入session中。中。3. 后面每執(zhí)行一次頁面都會添后面每執(zhí)行一次頁面都會添加一個相同的商品。加一個相同的商品。112.9 Session Bean的生命周期事件的生命周期事件n PostConstruct:當(dāng)當(dāng)bean對象完成實例化后會被立即調(diào)用,對象完成實例化后會被立即調(diào)用,每個每個beanclass只能定義一個只能定義一個PostConstruct方法。這個注釋方法。這個注釋同時適用于有狀態(tài)和無狀態(tài)會話同時適用于有狀態(tài)和無狀態(tài)會話bean。n PreDestro

6、y:標注了這個注釋的方法會在容器銷毀一個無用標注了這個注釋的方法會在容器銷毀一個無用的或者過期的的或者過期的bean實例之前調(diào)用。這個注釋同時適用于有狀態(tài)實例之前調(diào)用。這個注釋同時適用于有狀態(tài)和無狀態(tài)會話和無狀態(tài)會話bean。n PrePassivate:當(dāng)一個有狀態(tài)的當(dāng)一個有狀態(tài)的bean實例空閑時間過長,就實例空閑時間過長,就會發(fā)生鈍化會發(fā)生鈍化(passivate)。標注了這個注釋的方法會在鈍化之前。標注了這個注釋的方法會在鈍化之前被調(diào)用。被調(diào)用。bean實例被鈍化后,在一段時間內(nèi),如果仍然沒有用實例被鈍化后,在一段時間內(nèi),如果仍然沒有用戶對戶對bean實例進行操作,容器將會從硬盤中刪除

7、它。以后,任實例進行操作,容器將會從硬盤中刪除它。以后,任何針對該何針對該bean方法的調(diào)用,容器都會拋出例外。這個注釋適用方法的調(diào)用,容器都會拋出例外。這個注釋適用于有狀態(tài)會話于有狀態(tài)會話bean。122.9 Session Bean的生命周期事件的生命周期事件n PostActivate:當(dāng)客戶端再次使用已經(jīng)被鈍化的有狀態(tài)當(dāng)客戶端再次使用已經(jīng)被鈍化的有狀態(tài)bean時,時,EJB容器會重新實例化一個容器會重新實例化一個Bean實例,并從硬盤中將之前實例,并從硬盤中將之前的狀態(tài)恢復(fù)。標注了這個注釋的方法會在激活完成時被調(diào)用。的狀態(tài)恢復(fù)。標注了這個注釋的方法會在激活完成時被調(diào)用。這個注釋只適用于

8、有狀態(tài)會話這個注釋只適用于有狀態(tài)會話bean。n Init:這個注釋指定了有狀態(tài)這個注釋指定了有狀態(tài)bean初始化的方法。它區(qū)別于初始化的方法。它區(qū)別于PostConstruct注釋在于:多個注釋在于:多個Init注釋方法可以同時存在注釋方法可以同時存在于有狀態(tài)于有狀態(tài)sessionbean中,但每個中,但每個bean實例只會有一個實例只會有一個Init注注釋的方法會被調(diào)用。釋的方法會被調(diào)用。PostConstruct在在Init之后被調(diào)用。之后被調(diào)用。n Remove:當(dāng)客戶端調(diào)用標注了當(dāng)客戶端調(diào)用標注了Remove注釋的方法時,容注釋的方法時,容器將在方法執(zhí)行結(jié)束后把器將在方法執(zhí)行結(jié)束后把

9、bean實例刪除。實例刪除。132.9 Session Bean的生命周期事件的生命周期事件142.9 Session Bean的生命周期事件的生命周期事件15162.10 攔截器攔截器(Interceptor) n 攔截器可以攔截攔截器可以攔截Session bean和和message-driven bean的方法調(diào)用或生命周期事件。的方法調(diào)用或生命周期事件。n 攔截器用于封裝應(yīng)用的公用行為,使這些行為與業(yè)務(wù)攔截器用于封裝應(yīng)用的公用行為,使這些行為與業(yè)務(wù)邏輯分離,一旦這些公用行為發(fā)生改變,而不必修改邏輯分離,一旦這些公用行為發(fā)生改變,而不必修改很多業(yè)務(wù)類。很多業(yè)務(wù)類。n 攔截器可以是同一攔截

10、器可以是同一bean類中的方法或是一個外部類。類中的方法或是一個外部類。172.10 攔截器攔截器(Interceptor)n Interceptors 注釋指定一個或多個在外部類中定義的攔截器,注釋指定一個或多個在外部類中定義的攔截器,多個攔截器類之間用逗號分隔,如:多個攔截器類之間用逗號分隔,如:q Interceptors(A.class,B.class,C.class),如果只有一個攔截器可,如果只有一個攔截器可以省略大括號。以省略大括號。182.10 攔截器攔截器(Interceptor)1. AroundInvoke注釋指定了要用作攔截器的方法,攔截器方法與被攔截的業(yè)務(wù)方法注釋指定

11、了要用作攔截器的方法,攔截器方法與被攔截的業(yè)務(wù)方法執(zhí)行在同一個執(zhí)行在同一個java調(diào)用堆棧、同一個事務(wù)和安全上下文中。調(diào)用堆棧、同一個事務(wù)和安全上下文中。2. 用用AroundInvoke注釋指定的方法必須遵守以下格式:注釋指定的方法必須遵守以下格式:public Object XXX(erceptor.InvocationContext ctx) throws Exception1. XXX代表方法名可以任意代表方法名可以任意2. erceptor.InvocationContext封裝客戶端所調(diào)用業(yè)務(wù)方法的一些信息封裝客戶端所調(diào)用業(yè)務(wù)方法的一些信息192

12、.10 攔截器攔截器(Interceptor)202.10 攔截器攔截器(Interceptor)212.11 依賴注入依賴注入(dependency injection)n 在實際應(yīng)用中,在實際應(yīng)用中,EJB可能會使用到其它可能會使用到其它EJB或資源?;蛸Y源。n 在傳統(tǒng)的開發(fā)中,我們要使用某個類對象,可以通過在傳統(tǒng)的開發(fā)中,我們要使用某個類對象,可以通過new object的方式來使用它。的方式來使用它。q 但在但在EJB中,不能這樣做,因為中,不能這樣做,因為EJB實例的創(chuàng)建及銷毀是由容器管實例的創(chuàng)建及銷毀是由容器管理的。理的。n 要在要在bean中要用其它中要用其它EJB,必須通過,必

13、須通過JNDI查找或注入注釋。查找或注入注釋。q 如在如在InjectionBean中使用中使用HelloBean EJB,需要在,需要在InjectionBean中通過中通過JNDI查找查找HelloBean的引用的引用222.11 依賴注入依賴注入(dependency injection)n 通過注入注釋通過注入注釋232.11 依賴注入依賴注入(dependency injection)n 通過通過ejb-jar.xml 添加注冊項,該文件需放在添加注冊項,該文件需放在 jar的的 META-INF 24Bean 類:類:InjectionBean.java 252.11.1 資源類型

14、的注入資源類型的注入n 如何注入數(shù)據(jù)源如何注入數(shù)據(jù)源?q “DefaultMySqlDS”是數(shù)據(jù)源的局部是數(shù)據(jù)源的局部 JNDI 名稱,只供名稱,只供 Jboss 容容器內(nèi)的應(yīng)用訪問。器內(nèi)的應(yīng)用訪問。 q 查找該局部查找該局部 JNDI 名稱時,需要帶有前綴名稱時,需要帶有前綴“java:/”。 262.11.1 資源類型的注入資源類型的注入272.12 定時服務(wù)定時服務(wù)(Timer Service)n 定時服務(wù)可以用在定時服務(wù)可以用在stateless session bean和和message-driven bean,當(dāng)某個,當(dāng)某個stateless session bean或或messa

15、ge-driven bean的定時器啟動時,容器會從實例池中選擇的定時器啟動時,容器會從實例池中選擇bean的一個實的一個實例,然后調(diào)用其例,然后調(diào)用其timeout回調(diào)方法。回調(diào)方法。n 可以使用可以使用Resource注釋注入定時服務(wù),或者使用容器對象注釋注入定時服務(wù),或者使用容器對象SessionContext創(chuàng)建定時器。創(chuàng)建定時器。n 下面例子在下面例子在session bean中定義一個定時器,每隔中定義一個定時器,每隔3秒鐘觸發(fā)秒鐘觸發(fā)一次事件,當(dāng)定時事件觸發(fā)一次事件,當(dāng)定時事件觸發(fā)5次的時候便終止定時器的執(zhí)行。次的時候便終止定時器的執(zhí)行。282.12 定時服務(wù)定時服務(wù)(Timer

16、 Service)292.12 定時服務(wù)定時服務(wù)(Timer Service)n 當(dāng)定時器創(chuàng)建完成后,我們還需要添加定時事件的當(dāng)定時器創(chuàng)建完成后,我們還需要添加定時事件的回調(diào)方法?;卣{(diào)方法回調(diào)方法?;卣{(diào)方法使用使用javax.ejb.Timeout注釋標注,必須返回注釋標注,必須返回void,并接受一個,并接受一個javax.ejb.Timer類型的參數(shù),回調(diào)方法聲明的格式:類型的參數(shù),回調(diào)方法聲明的格式:q void XXX(Timer timer)q 在定時事件發(fā)生時,此方法將被執(zhí)行。在定時事件發(fā)生時,此方法將被執(zhí)行。30JSP 客戶端代碼:客戶端代碼:TimerServiceTest.j

17、sp 312.13 安全服務(wù)安全服務(wù)(Security service)n 使用使用Java驗證和授權(quán)服務(wù)(驗證和授權(quán)服務(wù)(Java Authentication Authorization Services JAAS)可以很好地解決上面)可以很好地解決上面的問題,可以用它來管理應(yīng)用程序的安全性。的問題,可以用它來管理應(yīng)用程序的安全性。q 驗證(驗證(Authentication)認證是完成用戶名和密碼的匹配校驗;)認證是完成用戶名和密碼的匹配校驗;其校驗的對象是試圖訪問受保護系統(tǒng)的用戶。在進行校驗時,其校驗的對象是試圖訪問受保護系統(tǒng)的用戶。在進行校驗時,應(yīng)用服務(wù)器會檢查用戶是否存在于系統(tǒng)之中

18、,是否提供了憑證應(yīng)用服務(wù)器會檢查用戶是否存在于系統(tǒng)之中,是否提供了憑證(通常指密碼)。(通常指密碼)。q 授權(quán)(授權(quán)(authorization)用戶一旦通過了系統(tǒng)驗證,需要與系統(tǒng))用戶一旦通過了系統(tǒng)驗證,需要與系統(tǒng)進行某種形式的交互。授權(quán)就是決定用戶是否有權(quán)執(zhí)行某項操進行某種形式的交互。授權(quán)就是決定用戶是否有權(quán)執(zhí)行某項操作的過程,授權(quán)是基于角色的。作的過程,授權(quán)是基于角色的。322.13 安全服務(wù)安全服務(wù)(Security service)n Jboss服務(wù)器提供了安全服務(wù)來進行用戶認證和根據(jù)用戶規(guī)則服務(wù)器提供了安全服務(wù)來進行用戶認證和根據(jù)用戶規(guī)則來限制對來限制對POJO的訪問。的訪問。q

19、對每一個對每一個POJO來說,可以使用來說,可以使用SecurityDomain注釋為它指定注釋為它指定一個安全域,安全域告訴容器到哪里去找密碼和用戶角色列表。一個安全域,安全域告訴容器到哪里去找密碼和用戶角色列表。q Plain Old Java Objects,簡單的,簡單的Java對象,就是普通對象,就是普通JavaBeans,是為了避免和,是為了避免和EJB混淆所創(chuàng)造的簡稱。混淆所創(chuàng)造的簡稱。n JBoss中的中的other域指明要到域指明要到classpath下尋找下尋找pertes和和perties。q 對每一個方法來說,我們可以使用一個安全限制

20、注釋來指定誰可對每一個方法來說,我們可以使用一個安全限制注釋來指定誰可以運行這個方法以運行這個方法332.13 安全服務(wù)安全服務(wù)(Security service)n 本例使用本例使用Jboss默認的安全域默認的安全域“other”,“other”安全域告訴安全域告訴容器到容器到classpath下的下的perties和和perties中中尋找密碼和用戶角色列表。尋找密碼和用戶角色列表。n “other”安全域定義安全域定義q jboss安裝目錄安裝目錄/server/default/conf/login-config.xml文件中文件中342.13 安全服

21、務(wù)安全服務(wù)(Security service)352.13 安全服務(wù)安全服務(wù)(Security service)下面我們開始安全服務(wù)的具體開發(fā):下面我們開始安全服務(wù)的具體開發(fā):n 第一步,定義安全域,安全域的定義有兩種方法:第一步,定義安全域,安全域的定義有兩種方法:n 第一種方法:通過第一種方法:通過 Jboss 部署描述文件部署描述文件 jboss.xml 進行定義進行定義(本例采用的方法本例采用的方法) 1. 指定我們使用的安全域是指定我們使用的安全域是“other”,2. AnonymousUser節(jié)點指定允許匿名用戶訪問。節(jié)點指定允許匿名用戶訪問。3. jboss.xml 必須必須

22、放進放進 Jar 文件的文件的 META-INF 目錄。目錄。362.13 安全服務(wù)安全服務(wù)(Security service)372.13 安全服務(wù)安全服務(wù)(Security service)第三步,為業(yè)務(wù)方法定義訪問角色(后臺)。第三步,為業(yè)務(wù)方法定義訪問角色(后臺)。n RolesAllowed 注釋指定允許訪問方法的角色列表,注釋指定允許訪問方法的角色列表,如果角色存在多個,可以用逗號分隔。如果角色存在多個,可以用逗號分隔。n PermitAll 注釋指定注釋指定 任何角色都可以訪問此方法。任何角色都可以訪問此方法。382.13 安全服務(wù)安全服務(wù)(Security service)39

23、2.13 安全服務(wù)安全服務(wù)(Security service)402.13 安全服務(wù)安全服務(wù)(Security service)412.13.1 自定義安全域自定義安全域n 把用戶名把用戶名/密碼及角色存放在密碼及角色存放在pertes和和perties文件,不便于日后的管理。文件,不便于日后的管理。n 大多數(shù)情況下都希望把用戶名大多數(shù)情況下都希望把用戶名/密碼及角色存放在數(shù)據(jù)庫中。密碼及角色存放在數(shù)據(jù)庫中。n 我們需要自定義安全域,下面的例子定義了一個名為我們需要自定義安全域,下面的例子定義了一個名為foshanshop的安全域,它采用數(shù)據(jù)庫存儲用戶名及角

24、色。的安全域,它采用數(shù)據(jù)庫存儲用戶名及角色。422.13.1 自定義安全域自定義安全域432.13.1 自定義安全域自定義安全域1. “DefaultMySqlDS” 數(shù)據(jù)源,數(shù)據(jù)源,2. principalsQuery屬性指定如何通過給定的用戶名獲取密碼,屬性指定如何通過給定的用戶名獲取密碼,3. rolesQuery屬性指定如何通過給定的用戶名獲取角色列表。屬性指定如何通過給定的用戶名獲取角色列表。4. 注意:注意:SQL中的中的Roles常量字段不能去掉。常量字段不能去掉。5. unauthenticatedIdentity屬性指定允許匿名用戶訪問。屬性指定允許匿名用戶訪問。442.13

25、.1 自定義安全域自定義安全域452.13.1 自定義安全域自定義安全域46第三章第三章 實體實體 Bean(Entity Bean)1.Jboss 數(shù)據(jù)源的配置數(shù)據(jù)源的配置2.單表映射的實體單表映射的實體Bean 3.成員屬性映射成員屬性映射4.建議重載實體建議重載實體 Bean的的 Equals()和和 Hashcode()方法方法5.映射的表名或列名與數(shù)據(jù)庫保留字同名時的處理映射的表名或列名與數(shù)據(jù)庫保留字同名時的處理6.多表映射的實體多表映射的實體Bean 7.持久化實體管理器持久化實體管理器 Entity Manager8.關(guān)系關(guān)系/對象映射對象映射9.JPQL 查詢查詢473.1 J

26、Boss 數(shù)據(jù)源的配置數(shù)據(jù)源的配置n 數(shù)據(jù)源用于配置數(shù)據(jù)庫的連接信息,每個數(shù)據(jù)源必須指定一個數(shù)據(jù)源用于配置數(shù)據(jù)庫的連接信息,每個數(shù)據(jù)源必須指定一個唯一的唯一的JNDI名稱。應(yīng)用通過名稱。應(yīng)用通過JNDI名稱找到數(shù)據(jù)源。名稱找到數(shù)據(jù)源。q 在在Jboss中,有一個默認的數(shù)據(jù)源中,有一個默認的數(shù)據(jù)源DefaultDS,它使用,它使用Jboss內(nèi)置內(nèi)置的的HSQLDB數(shù)據(jù)庫。數(shù)據(jù)庫。q 實際項目中,可能使用不同的數(shù)據(jù)庫,如實際項目中,可能使用不同的數(shù)據(jù)庫,如MySql、SqlServer、Oracle等。等。n 每種數(shù)據(jù)庫的數(shù)據(jù)源配置模版可以在每種數(shù)據(jù)庫的數(shù)據(jù)源配置模版可以在Jboss安裝目安裝目錄

27、錄docsexamplesjca目錄中找到,名稱為:數(shù)據(jù)庫名目錄中找到,名稱為:數(shù)據(jù)庫名+-ds.xml。483.1 JBoss 數(shù)據(jù)源的配置數(shù)據(jù)源的配置n 數(shù)據(jù)源部署的過程很簡單,直接把它拷貝到數(shù)據(jù)源部署的過程很簡單,直接把它拷貝到j(luò)boss的的deploy目目錄即可。錄即可。n 容器遇到以容器遇到以*-ds.xml結(jié)尾的文件時,會進行動態(tài)發(fā)布。發(fā)布完結(jié)尾的文件時,會進行動態(tài)發(fā)布。發(fā)布完成后,你可以在成后,你可以在http:/localhost:8080/jmx-console/查看到數(shù)查看到數(shù)據(jù)源的信息據(jù)源的信息493.1 JBoss 數(shù)據(jù)源的配置數(shù)據(jù)源的配置503.1 JBoss 數(shù)據(jù)源

28、的配置數(shù)據(jù)源的配置n 數(shù)據(jù)源配置文件的取名格式必須為數(shù)據(jù)源配置文件的取名格式必須為xxxds.xml,其中,其中xxx代表代表任意名稱,如任意名稱,如:mysql-ds.xml,mssqlserver-ds.xml,oracle-ds.xml。n 數(shù)據(jù)源部署前,必須把數(shù)據(jù)庫驅(qū)動數(shù)據(jù)源部署前,必須把數(shù)據(jù)庫驅(qū)動Jar拷貝到拷貝到j(luò)boss安裝目安裝目錄錄/server/配置名配置名/lib目錄,本書采用的配置名為目錄,本書采用的配置名為default,因此,因此需要把數(shù)據(jù)庫驅(qū)動拷貝到需要把數(shù)據(jù)庫驅(qū)動拷貝到j(luò)boss安裝目錄安裝目錄/server/default/lib。完成拷貝后,必須重啟完成拷貝

29、后,必須重啟Jboss服務(wù)器。服務(wù)器。n 本書使用的數(shù)據(jù)庫是本書使用的數(shù)據(jù)庫是mysql-5.0.22,其驅(qū)動為,其驅(qū)動為mysql-connector-java-3.1.13-bin.jar。513.2 單表映射的實體單表映射的實體 Beann 在本例子,該表由持久化驅(qū)動自動生成,不需要我們創(chuàng)建。在本例子,該表由持久化驅(qū)動自動生成,不需要我們創(chuàng)建。 523.2 單表映射的實體單表映射的實體 Bean53Session Bean 的業(yè)務(wù)接口的業(yè)務(wù)接口 n 在在EJB3.0,實體,實體Bean并不直接與客戶端打并不直接與客戶端打交道。而是被交道。而是被Session bean或或Message-

30、Driven Bean使用。使用。n 定義一個定義一個Session Bean,在,在Session Bean中通過實體中通過實體bean間接操作數(shù)據(jù)庫。間接操作數(shù)據(jù)庫。54Session Bean的實現(xiàn)的實現(xiàn) Database name55Session Bean的實現(xiàn)的實現(xiàn) Database nameem.find()方法用于查找方法用于查找特定主鍵的實體特定主鍵的實體bean。em.persist()方法用于保存實方法用于保存實體體bean,即插入一條記錄。,即插入一條記錄。em.merge()方法用于更新或保存實體方法用于更新或保存實體 當(dāng)實體不存在時,執(zhí)行保存操作當(dāng)實體不存在時,執(zhí)行

31、保存操作 當(dāng)實體已經(jīng)存在時,執(zhí)行更新操作當(dāng)實體已經(jīng)存在時,執(zhí)行更新操作em.remove()方法用于刪除實體,方法用于刪除實體,即刪除一條記錄。即刪除一條記錄。em.createQuery()用于執(zhí)行用于執(zhí)行JPQL語句。語句。56 JSP 客戶端代碼:客戶端代碼:EntityBeanTest.jsp 573.6 多表映射的實體多表映射的實體Beann 如果實體的成員屬性映射的字段分布在多張表中,如何處理?如果實體的成員屬性映射的字段分布在多張表中,如何處理?q 本例子的實體本例子的實體MainTable具有四個成員屬性:具有四個成員屬性:id、name、address和和postcode。q

32、 其中與其中與id和和name映射的字段在映射的字段在MainTable表,與表,與address和和postcode屬性映射的字段在屬性映射的字段在Address表。表。q 需要使用需要使用javax.persistence.SecondaryTable注釋和注釋和Column.table()屬性屬性583.6 多表映射的實體多表映射的實體BeanMainTable.class593.6 多表映射的實體多表映射的實體Bean603.6 多表映射的實體多表映射的實體Bean重載實體重載實體 equals() 方法方法重載實體重載實體 hashCode()方法方法重載實體重載實體 toStrin

33、g() 方法方法613.6 多表映射的實體多表映射的實體BeanMultitableMappingDAO.javan實體實體Bean的使用者的使用者Session Bean623.6 多表映射的實體多表映射的實體BeanMultitableMappingDAOBean.class633.6 多表映射的實體多表映射的實體BeanMultitableMappingTest.jsp643.6 多表映射的實體多表映射的實體Bean653.8 關(guān)系關(guān)系/對象映射對象映射1.雙向一對多及多對一映射雙向一對多及多對一映射2.單向一對多單向一對多3.單向多對一單向多對一4.雙向一對一映射雙向一對一映射5.單向

34、一對一單向一對一6.雙向多對多映射雙向多對多映射7.單向多對多單向多對多663.8.1 雙向一對多及多對一映射雙向一對多及多對一映射n 現(xiàn)實應(yīng)用中存在很多一對多的情況,如一項訂單中存在一個或現(xiàn)實應(yīng)用中存在很多一對多的情況,如一項訂單中存在一個或多個訂購項。多個訂購項。n 當(dāng)當(dāng)one方存在與方存在與many方關(guān)系的定義,而方關(guān)系的定義,而many方同時也存在與方同時也存在與one方關(guān)系的定義,這樣的關(guān)系被稱為雙向關(guān)系。方關(guān)系的定義,這樣的關(guān)系被稱為雙向關(guān)系。n 代碼上體現(xiàn)為在代碼上體現(xiàn)為在one方有一個集合屬性指向方有一個集合屬性指向many方,而在方,而在many方也有一個屬性指向方也有一個屬

35、性指向one方。方。673.8.1 雙向一對多及多對一映射雙向一對多及多對一映射n 雙向一對多關(guān)系,必須包含一個關(guān)系維護端。持久化規(guī)范要求雙向一對多關(guān)系,必須包含一個關(guān)系維護端。持久化規(guī)范要求多多的一方為關(guān)系維護端(的一方為關(guān)系維護端(ownerside),),一一的一方為關(guān)系被維的一方為關(guān)系被維護端(護端(inverseside)。)。n 在在one方的方的OneToMany注釋設(shè)置注釋設(shè)置mappedBy屬性,以指定屬性,以指定它是這一關(guān)聯(lián)中的被維護端,它是這一關(guān)聯(lián)中的被維護端,Many方是關(guān)系維護端。方是關(guān)系維護端。683.8.1 雙向一對多及多對一映射雙向一對多及多對一映射Order.

36、java 693.8.1 雙向一對多及多對一映射雙向一對多及多對一映射指明指明Order與與OrderItem關(guān)聯(lián)關(guān)系為一對多關(guān)系關(guān)聯(lián)關(guān)系為一對多關(guān)系703.8.1 雙向一對多及多對一映射雙向一對多及多對一映射713.8.1 雙向一對多及多對一映射雙向一對多及多對一映射OrderItem.java 變量變量定義定義 構(gòu)造構(gòu)造函數(shù)函數(shù) 723.8.1 雙向一對多及多對一映射雙向一對多及多對一映射733.8.1 雙向一對多及多對一映射雙向一對多及多對一映射public interface ManyToOneClass targetEntity( ) default void.class; Casc

37、adeType cascade( ) default ; FetchType fetch( ) default EAGER; boolean optional( ) default true;targetEntity()、cascade()和和fetch()的具體含義和的具體含義和OneToMany注釋的同名屬性相同,但注釋的同名屬性相同,但ManyToOne注釋的注釋的fetch()屬性默認值是屬性默認值是FetchType.EAGER。optional()指定關(guān)聯(lián)方是否可以為空指定關(guān)聯(lián)方是否可以為空(null),該屬性值默認為,該屬性值默認為true。若將其設(shè)為若將其設(shè)為false,則要求

38、雙方必須存在。,則要求雙方必須存在。我們不需要設(shè)置我們不需要設(shè)置JoinColumn注釋的注釋的nullable()屬性。屬性。通過通過EntityManager.find()、EntityManager.getReference()查詢查詢OrderItem實體:實體:u 當(dāng)當(dāng)optional=false時,時,OrderItem與與Order關(guān)聯(lián)形式為關(guān)聯(lián)形式為inner join,u 當(dāng)當(dāng)optional=true時,時,OrderItem與與Order關(guān)聯(lián)形式為關(guān)聯(lián)形式為left join。743.8.1 雙向一對多及多對一映射雙向一對多及多對一映射n SessionBean的業(yè)務(wù)接口

39、:的業(yè)務(wù)接口:OrderDAO.java753.8.1 雙向一對多及多對一映射雙向一對多及多對一映射n SessionBean的業(yè)務(wù)接口:的業(yè)務(wù)接口:OrderDAOBean.java76JSP 客戶端代碼:客戶端代碼:OneToManyTest.jsp773.8.1 雙向一對多及多對一映射雙向一對多及多對一映射OrderItem表表Order表表783.8.2 單向一對多單向一對多Order.java 793.8.2 單向一對多單向一對多OrderItem.java 803.8.3 單向多對一單向多對一Order.java 813.8.3 單向多對一單向多對一指明指明Order與與Order

40、Item關(guān)聯(lián)關(guān)系為一對多關(guān)系關(guān)聯(lián)關(guān)系為一對多關(guān)系Order.java 823.8.3 單向多對一單向多對一OrderItem.java 833.8.3 單向多對一單向多對一OrderItem.java 保持不變!保持不變!843.8.6 雙向多對多映射雙向多對多映射n 實現(xiàn)生活中,一個學(xué)生有多個老師,一個老師有多個學(xué)生,他實現(xiàn)生活中,一個學(xué)生有多個老師,一個老師有多個學(xué)生,他們具有明顯的多對多關(guān)系。們具有明顯的多對多關(guān)系。q 多對多映射采取中間表連接的映射策略,建立的中間表將分別引多對多映射采取中間表連接的映射策略,建立的中間表將分別引入兩邊的主鍵作為外鍵。入兩邊的主鍵作為外鍵。q EJB3對

41、于中間表的元數(shù)據(jù)提供了可配置的方式,用戶可以自定義對于中間表的元數(shù)據(jù)提供了可配置的方式,用戶可以自定義中間表的表名、列名。中間表的表名、列名。studentteacherteacher-student*853.8.6 雙向多對多映射雙向多對多映射n Student.java863.8.6 雙向多對多映射雙向多對多映射n Student.java在雙向在雙向ManyToMany關(guān)聯(lián)中,必須包含有一個關(guān)系維護端。關(guān)聯(lián)中,必須包含有一個關(guān)系維護端。在在Student的的ManyToMany注釋中指定注釋中指定mappedBy()屬性,屬性,將其標識為關(guān)系將其標識為關(guān)系被被維護端,自然維護端,自然Te

42、acher就成了關(guān)系維護端。就成了關(guān)系維護端。ManyToMany注釋指定注釋指定Student是多對多關(guān)系的一端,是多對多關(guān)系的一端,mappedBy屬性指定屬性指定Student為雙向關(guān)系的被維護端為雙向關(guān)系的被維護端(inverse side),指出該關(guān),指出該關(guān)系映射信息是在被關(guān)聯(lián)實體系映射信息是在被關(guān)聯(lián)實體Teacher的成員屬性的成員屬性students上定義的。上定義的。873.8.6 雙向多對多映射雙向多對多映射n Teacher.java883.8.6 雙向多對多映射雙向多對多映射n Teacher.java893.8.6 雙向多對多映射雙向多對多映射n TeacherDAO

43、.java903.8.6 雙向多對多映射雙向多對多映射n TeacherDAOBean.java913.8.6 雙向多對多映射雙向多對多映射n TeacherDAOBean.java923.8.6 雙向多對多映射雙向多對多映射n ManyToManyTest.jspteacherteacher_studentstudent933.8.7 單向多對多單向多對多n Teacher.java943.8.7 單向多對多單向多對多n Teacher.java953.8.7 單向多對多單向多對多n Student.java963.8.7 單向多對多單向多對多n Student.java973.9 JPQL

44、查詢查詢1. 命名參數(shù)查詢命名參數(shù)查詢2. 位置參數(shù)查詢位置參數(shù)查詢3. Date參數(shù)參數(shù)4. 一個一個JPQL查詢例子查詢例子5. 命名查詢命名查詢6. 排序排序(order by)7. 查詢部分屬性查詢部分屬性8. 查詢中使用構(gòu)造器查詢中使用構(gòu)造器(Constructor)9. 聚合查詢聚合查詢(Aggregation)10.關(guān)聯(lián)關(guān)聯(lián)(join)11.排除相同的記錄排除相同的記錄DISTINCT12.比較比較Entity13.批量更新批量更新(Batch Update)14.批量刪除批量刪除(Batch Remove)15.邏輯非運算符邏輯非運算符NOT16.使用操作符使用操作符BETWE

45、EN17.使用操作符使用操作符IN18.使用操作符使用操作符LIKE19.使用操作符使用操作符IS NULL20.使用操作符使用操作符IS EMPTY21.字符串函數(shù)字符串函數(shù)22.日期和時間函數(shù)日期和時間函數(shù)23.數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù)24.Member of25.子查詢子查詢26.EXISTS27.All, ANY, SOME28.結(jié)果集分頁結(jié)果集分頁98實例數(shù)據(jù)庫實例數(shù)據(jù)庫Person表表Order表表OrderItem表表99(1) 命名參數(shù)查詢命名參數(shù)查詢n 命名參數(shù)的格式為冒號加上參數(shù)名:命名參數(shù)的格式為冒號加上參數(shù)名:“:+參數(shù)名參數(shù)名”100(2) 位置參數(shù)查詢位置參數(shù)查詢n 位置參

46、數(shù)的格式為問號加上位置編號:位置參數(shù)的格式為問號加上位置編號:“?+位置編號位置編號”101(3) Date參數(shù)參數(shù)n 如果需要將如果需要將 java.util.Date 或或 java.util.Calendar 作為參數(shù)傳作為參數(shù)傳進一個參數(shù)查詢,使用對應(yīng)的進一個參數(shù)查詢,使用對應(yīng)的 setParameter()方法方法102Person.java 103Person.java104Person.javaOrder表表105Order.java106Order.java107OrderItem.java108OrderItem.javaOrder表表109QueryDAOBean.java

47、Person表表Order表表OrderItem表表110QueryDAOBean.java111 JSP客戶端代碼:客戶端代碼:QueryTest.jsp 112(5) 命名查詢命名查詢n 你可以在實體你可以在實體bean上定義一個或多個查詢語句,這樣可以減少上定義一個或多個查詢語句,這樣可以減少每次因書寫錯誤而引起的每次因書寫錯誤而引起的BUG。n 實際應(yīng)用中,一般把經(jīng)常使用的查詢語句定義成命名查詢。實際應(yīng)用中,一般把經(jīng)常使用的查詢語句定義成命名查詢。當(dāng)命名查詢定義好了之后,我們可以通過其名稱執(zhí)行查詢:當(dāng)命名查詢定義好了之后,我們可以通過其名稱執(zhí)行查詢:113(5) 命名查詢命名查詢n 如

48、果需要定義多個命名查詢,可以使用如果需要定義多個命名查詢,可以使用javax.persistence.NamedQueries注釋。注釋。n 在該注釋里面,可以放置多個在該注釋里面,可以放置多個NamedQuery注釋:注釋:當(dāng)命名查詢定義好了之后,我們可以通過其名稱執(zhí)行查詢:當(dāng)命名查詢定義好了之后,我們可以通過其名稱執(zhí)行查詢:114(6) 排序排序(order by)n ASC和和DESC分別為升序和降序,如果不顯式指定,分別為升序和降序,如果不顯式指定,JPQL默認使用默認使用ASC升序。升序。(QueryDAOBean.java)115(7) 查詢部分屬性查詢部分屬性(QueryDAOB

49、ean.java)n 在前面的例子中,都是針對實體的查詢,返回的結(jié)果也是實體在前面的例子中,都是針對實體的查詢,返回的結(jié)果也是實體類型。類型。JPQL允許查詢返回我們需要的成員屬性。在一些實體成允許查詢返回我們需要的成員屬性。在一些實體成員屬性比較多的情況,這樣的查詢可以提高性能。員屬性比較多的情況,這樣的查詢可以提高性能。116(8) 查詢中使用構(gòu)造器查詢中使用構(gòu)造器(Constructor)n JPQL支持將查詢的結(jié)果直接作為一個支持將查詢的結(jié)果直接作為一個Java類的構(gòu)造器參數(shù),類的構(gòu)造器參數(shù),并產(chǎn)生類對象作為結(jié)果返回。并產(chǎn)生類對象作為結(jié)果返回。117(8) 查詢中使用構(gòu)造器查詢中使用構(gòu)

50、造器(Constructor)n 將查詢的屬性結(jié)果直接作為將查詢的屬性結(jié)果直接作為 SimplePerson 的構(gòu)造器參數(shù)。的構(gòu)造器參數(shù)。 118(9) 聚合查詢聚合查詢(Aggregation)n像大部分的像大部分的SQL一樣,一樣,JPQL也支持查詢中的聚合函數(shù):也支持查詢中的聚合函數(shù):1.AVG()求平均數(shù),返回值類型為求平均數(shù),返回值類型為Double;2.SUM()求和,返回值類型為被求值的成員屬性所對應(yīng)的類型;求和,返回值類型為被求值的成員屬性所對應(yīng)的類型;3.COUNT()統(tǒng)計,返回類型為統(tǒng)計,返回類型為Long,注意,注意count(*)語法并不屬語法并不屬于于JPA規(guī)范,它在

51、規(guī)范,它在hibernate中可用;中可用;4.MAX()求最大值,返回值類型為被求值的成員屬性所對應(yīng)的類求最大值,返回值類型為被求值的成員屬性所對應(yīng)的類型。可用于基本數(shù)據(jù)類型,字符串及可序列化對象;型。可用于基本數(shù)據(jù)類型,字符串及可序列化對象;5.MIN()求最小值,返回值類型為被求值的成員屬性所對應(yīng)的類求最小值,返回值類型為被求值的成員屬性所對應(yīng)的類型??捎糜诨緮?shù)據(jù)類型,字符串及可序列化對象。型。可用于基本數(shù)據(jù)類型,字符串及可序列化對象。q聚合函數(shù)在統(tǒng)計時,會忽略掉帶聚合函數(shù)在統(tǒng)計時,會忽略掉帶null值的記錄。值的記錄。q如果查詢的集合為空(即沒有記錄),如果查詢的集合為空(即沒有記錄

52、),count()在處理時會返回在處理時會返回0,而而AVG()、SUM()、MAX()、MIN()返回返回null值。值。119(9) 聚合查詢聚合查詢(Aggregation)120(9) 聚合查詢聚合查詢(Aggregation)n 和和SQL一樣,如果聚合函數(shù)不是一樣,如果聚合函數(shù)不是select.from的唯一一個返回的唯一一個返回列,需要使用列,需要使用GROUPBY語句。語句。121/去掉相同的編號去掉相同的編號(10)關(guān)聯(lián)關(guān)聯(lián)(join)n left out join/left join等,都是允許右邊表達式的實體為空。等,都是允許右邊表達式的實體為空。OrderOrderIt

53、em122(10)關(guān)聯(lián)關(guān)聯(lián)(join)n inner join 要求右邊表達式的實體必須存在。要求右邊表達式的實體必須存在。OrderOrderItem123(10)關(guān)聯(lián)關(guān)聯(lián)(join)n left/left out/inner join fetch 提供了一種靈活的查詢加載方式來提供了一種靈活的查詢加載方式來提高查詢的性能。提高查詢的性能。n 在默認的查詢中,實體的延遲屬性不會被加載。在默認的查詢中,實體的延遲屬性不會被加載。 1. 當(dāng)應(yīng)用需要時,當(dāng)應(yīng)用需要時,EJB3 Runtime才會執(zhí)行一條才會執(zhí)行一條SQL語句來加語句來加載屬于當(dāng)前載屬于當(dāng)前Order的的OrderItems。2.

54、使用了使用了fetch,這個查詢只會產(chǎn)生一條,這個查詢只會產(chǎn)生一條 SQL 語句。語句。124(11) 排除相同的記錄排除相同的記錄Distinctn 使用關(guān)聯(lián)查詢,我們很經(jīng)常得到重復(fù)的對象,如下面語句:使用關(guān)聯(lián)查詢,我們很經(jīng)常得到重復(fù)的對象,如下面語句:select o from Order o inner join fetch o.orderItems order by o.orderidq 如果一個如果一個Order有多個有多個orderItem,返回的結(jié)果就會有多個相同返回的結(jié)果就會有多個相同的的Order,需要使用,需要使用Distinct關(guān)鍵字排除相同的對象。關(guān)鍵字排除相同的對象。

55、q Distinct 操作符還可以與任何聚合函數(shù)結(jié)合使用,首先去掉重復(fù)值,操作符還可以與任何聚合函數(shù)結(jié)合使用,首先去掉重復(fù)值,然后再統(tǒng)計。然后再統(tǒng)計。125(12) 比較比較Entityn 在使用參數(shù)查詢時,參數(shù)類型除了在使用參數(shù)查詢時,參數(shù)類型除了String、原始數(shù)據(jù)類型、原始數(shù)據(jù)類型(int, double等等)和它們的對象類型和它們的對象類型(Integer, Double等等),也可以是實體對象。,也可以是實體對象。126(13)批量更新批量更新(Batch Update)Order表表(修改前修改前)127(14) 批量刪除批量刪除(Batch Remove)128(15) 邏輯非

56、運算符邏輯非運算符NOT129(16) 使用操作符使用操作符BETWEEN130(17) 使用操作符使用操作符IN131(18) 使用操作符使用操作符LIKE132(19) 使用操作符使用操作符IS NULL133(20) 使用操作符使用操作符IS EMPTY134(21) 字符串函數(shù)字符串函數(shù)n CONCAT(string 1, string 2)q 將字符串將字符串2追加到字符串追加到字符串1。n SUBSTRING(string, starting position, length)q 從字符串從字符串string開始位置開始位置starting position截取長度為截取長度為le

57、ngth字符。字符。n LOWER(string)q 將一個字符串將一個字符串string轉(zhuǎn)換成小寫形式。轉(zhuǎn)換成小寫形式。n UPPER(string)q 將一個字符串將一個字符串string轉(zhuǎn)換成大寫形式。轉(zhuǎn)換成大寫形式。n LENGTH(string)q 返回字符串返回字符串string的長度,為整數(shù)。的長度,為整數(shù)。n TRIM(LEADING|TRAILING|BOTH char FROM string)q 去掉字符串去掉字符串string頭,尾或兩者的字符頭,尾或兩者的字符char。最簡形式是。最簡形式是TRIM(string),可,可以去掉字符串以去掉字符串string頭尾的空格字

58、符。頭尾的空格字符。n LOCATE(string1, string2 ,start)q 返回返回string2在在string1的位置。定位函數(shù)有一個可選的起始位置的位置。定位函數(shù)有一個可選的起始位置start。135(21) 字符串函數(shù)字符串函數(shù)136(23) 數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù)n ABS (arithmetic expression)q 返回算術(shù)表達式的返回算術(shù)表達式的絕對值絕對值。n SQRT (arithmetic expression)q 求算術(shù)表達式的求算術(shù)表達式的方根方根,返回一個,返回一個Double。n MOD (arithmetic expression 1, arithm

59、etic expression 2)q 求參數(shù)求參數(shù)1與參數(shù)與參數(shù)2的的模模,返回一個整數(shù)。,返回一個整數(shù)。n SIZE (collection-valued path-expression)q 計算一個集合中元素的計算一個集合中元素的數(shù)量數(shù)量,并返回一個整數(shù)。,并返回一個整數(shù)。q 如果集合為空,返回如果集合為空,返回0。137(23) 數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù)138(24) Member ofn Member of操作符用于判斷實體是否是集合中的一員。操作符用于判斷實體是否是集合中的一員。 139(25) 子查詢子查詢n 子查詢可以用于子查詢可以用于WHERE和和HAVING條件語句中。條件語句中。

60、140(26) EXISTSn EXISTS需要和子查詢配合使用,用來判斷子查詢是否存在記錄。需要和子查詢配合使用,用來判斷子查詢是否存在記錄。141(26) EXISTSn EXISTS需要和子查詢配合使用,用來判斷子查詢是否存在記錄。需要和子查詢配合使用,用來判斷子查詢是否存在記錄。142(27) All, ANY, SOMEn 當(dāng)子查詢返回多條記錄時,你可以使用表達式當(dāng)子查詢返回多條記錄時,你可以使用表達式ALL、ANY和和SOME對結(jié)果做進一步限定。對結(jié)果做進一步限定。143(28) 結(jié)果集分頁結(jié)果集分頁n 有些時候執(zhí)行一個查詢會返回成千上萬條記錄,事實上我們只有些時候執(zhí)行一個查詢會返

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論