版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1EJB3.0入門經(jīng)典入門經(jīng)典2關(guān)于開題報(bào)告答辯關(guān)于開題報(bào)告答辯n請(qǐng)各位同學(xué),根據(jù)答辯時(shí)老師的建議,認(rèn)真修請(qǐng)各位同學(xué),根據(jù)答辯時(shí)老師的建議,認(rèn)真修改三大件改三大件;n將修改結(jié)束以壓縮包的形式發(fā)給指導(dǎo)教師。將修改結(jié)束以壓縮包的形式發(fā)給指導(dǎo)教師。3重點(diǎn)章節(jié)重點(diǎn)章節(jié)n第第2章章 會(huì)話會(huì)話Bean (Session Bean)n第第3章章 實(shí)體實(shí)體Bean (Entity Bean)n第第6章章 Web服務(wù)服務(wù) (Web Service)4題型題型n 讀程序,寫結(jié)果;讀程序,寫結(jié)果;n 編程;編程;n 寫操作步驟。寫操作步驟。52.1.2 開發(fā)只實(shí)現(xiàn)開發(fā)只實(shí)現(xiàn) Local 接口的無(wú)狀態(tài)接口的無(wú)狀態(tài) S
2、ession Beann 開發(fā)只有開發(fā)只有 Local 接口接口的無(wú)狀態(tài)會(huì)話的無(wú)狀態(tài)會(huì)話Session Bean,使用,使用Local 注釋聲明接口是本地接口。注釋聲明接口是本地接口。 n 開發(fā)只有開發(fā)只有 Remote 接口接口的無(wú)狀態(tài)會(huì)話的無(wú)狀態(tài)會(huì)話Session Bean ,使,使用用Remote 注釋聲明接口是遠(yuǎn)程接口。注釋聲明接口是遠(yuǎn)程接口。n 當(dāng)當(dāng)Local 和和Remote 注釋注釋都不存在都不存在時(shí),容器會(huì)將時(shí),容器會(huì)將 Bean class 實(shí)現(xiàn)的接口默認(rèn)為實(shí)現(xiàn)的接口默認(rèn)為 Local 接口。如果接口。如果 EJB 與與客戶端客戶端 部署在同一個(gè)應(yīng)用服務(wù)器,采用部署在同一個(gè)應(yīng)
3、用服務(wù)器,采用 Local 接口訪問(wèn)接口訪問(wèn) EJB 優(yōu)于優(yōu)于 Remote 接口。接口。6業(yè)務(wù)接口:業(yè)務(wù)接口:LocalHelloWorld.java n 工程:工程:LocalSessionBean72.4 Stateful Session Bean開發(fā)開發(fā)n 在一些應(yīng)用場(chǎng)合中,有時(shí)我們需要每個(gè)用戶都有自己在一些應(yīng)用場(chǎng)合中,有時(shí)我們需要每個(gè)用戶都有自己的一個(gè)實(shí)例,這個(gè)實(shí)例不受其他用戶影響。的一個(gè)實(shí)例,這個(gè)實(shí)例不受其他用戶影響。q 購(gòu)物車對(duì)象,每個(gè)用戶都應(yīng)有自己的購(gòu)物車,不希望有人往購(gòu)物車對(duì)象,每個(gè)用戶都應(yīng)有自己的購(gòu)物車,不希望有人往你的購(gòu)物車?yán)锾砑踊蚰玫羯唐?,而有狀態(tài)你的購(gòu)物車?yán)锾砑踊蚰玫?/p>
4、商品,而有狀態(tài)Bean正好滿足你正好滿足你的這種需求。的這種需求。n 每個(gè)有狀態(tài)每個(gè)有狀態(tài)Bean在在bean實(shí)例的生命周期內(nèi)都只服務(wù)實(shí)例的生命周期內(nèi)都只服務(wù)于一個(gè)用戶,于一個(gè)用戶,bean class的成員變量可以在不同的方的成員變量可以在不同的方法調(diào)用間維護(hù)特定于某個(gè)用戶的數(shù)據(jù)。法調(diào)用間維護(hù)特定于某個(gè)用戶的數(shù)據(jù)。82.4 Stateful Session Bean開發(fā)開發(fā)9Bean 類:類:CartBean.java 10有狀態(tài)有狀態(tài) Bean 的的 JSP 客戶端代碼:客戶端代碼:StatefulBeanTest.jsp 先試圖從先試圖從session中獲取購(gòu)中獲取購(gòu)物車的存根。物車的存
5、根。如果當(dāng)前如果當(dāng)前session不存在購(gòu)不存在購(gòu)物車,就創(chuàng)建一個(gè)新的購(gòu)物物車,就創(chuàng)建一個(gè)新的購(gòu)物車放入車放入session中。中。后面每執(zhí)行一次頁(yè)面都會(huì)添后面每執(zhí)行一次頁(yè)面都會(huì)添加一個(gè)相同的商品。加一個(gè)相同的商品。112.9 Session Bean的生命周期事件的生命周期事件n PostConstruct:當(dāng)當(dāng)bean對(duì)象完成實(shí)例化后會(huì)被立即調(diào)用,對(duì)象完成實(shí)例化后會(huì)被立即調(diào)用,每個(gè)每個(gè)beanclass只能定義一個(gè)只能定義一個(gè)PostConstruct方法。這個(gè)注釋方法。這個(gè)注釋同時(shí)適用于有狀態(tài)和無(wú)狀態(tài)會(huì)話同時(shí)適用于有狀態(tài)和無(wú)狀態(tài)會(huì)話bean。n PreDestroy:標(biāo)注了這個(gè)注釋的方法
6、會(huì)在容器銷毀一個(gè)無(wú)用標(biāo)注了這個(gè)注釋的方法會(huì)在容器銷毀一個(gè)無(wú)用的或者過(guò)期的的或者過(guò)期的bean實(shí)例之前調(diào)用。這個(gè)注釋同時(shí)適用于有狀態(tài)實(shí)例之前調(diào)用。這個(gè)注釋同時(shí)適用于有狀態(tài)和無(wú)狀態(tài)會(huì)話和無(wú)狀態(tài)會(huì)話bean。n PrePassivate:當(dāng)一個(gè)有狀態(tài)的當(dāng)一個(gè)有狀態(tài)的bean實(shí)例空閑時(shí)間過(guò)長(zhǎng),就實(shí)例空閑時(shí)間過(guò)長(zhǎng),就會(huì)發(fā)生鈍化會(huì)發(fā)生鈍化(passivate)。標(biāo)注了這個(gè)注釋的方法會(huì)在鈍化之前。標(biāo)注了這個(gè)注釋的方法會(huì)在鈍化之前被調(diào)用。被調(diào)用。bean實(shí)例被鈍化后,在一段時(shí)間內(nèi),如果仍然沒(méi)有用實(shí)例被鈍化后,在一段時(shí)間內(nèi),如果仍然沒(méi)有用戶對(duì)戶對(duì)bean實(shí)例進(jìn)行操作,容器將會(huì)從硬盤中刪除它。以后,任實(shí)例進(jìn)行操作
7、,容器將會(huì)從硬盤中刪除它。以后,任何針對(duì)該何針對(duì)該bean方法的調(diào)用,容器都會(huì)拋出例外。這個(gè)注釋適用方法的調(diào)用,容器都會(huì)拋出例外。這個(gè)注釋適用于有狀態(tài)會(huì)話于有狀態(tài)會(huì)話bean。122.9 Session Bean的生命周期事件的生命周期事件n PostActivate:當(dāng)客戶端再次使用已經(jīng)被鈍化的有狀態(tài)當(dāng)客戶端再次使用已經(jīng)被鈍化的有狀態(tài)bean時(shí),時(shí),EJB容器會(huì)重新實(shí)例化一個(gè)容器會(huì)重新實(shí)例化一個(gè)Bean實(shí)例,并從硬盤中將之前實(shí)例,并從硬盤中將之前的狀態(tài)恢復(fù)。標(biāo)注了這個(gè)注釋的方法會(huì)在激活完成時(shí)被調(diào)用。的狀態(tài)恢復(fù)。標(biāo)注了這個(gè)注釋的方法會(huì)在激活完成時(shí)被調(diào)用。這個(gè)注釋只適用于有狀態(tài)會(huì)話這個(gè)注釋只適用
8、于有狀態(tài)會(huì)話bean。n Init:這個(gè)注釋指定了有狀態(tài)這個(gè)注釋指定了有狀態(tài)bean初始化的方法。它區(qū)別于初始化的方法。它區(qū)別于PostConstruct注釋在于:多個(gè)注釋在于:多個(gè)Init注釋方法可以同時(shí)存在注釋方法可以同時(shí)存在于有狀態(tài)于有狀態(tài)sessionbean中,但每個(gè)中,但每個(gè)bean實(shí)例只會(huì)有一個(gè)實(shí)例只會(huì)有一個(gè)Init注注釋的方法會(huì)被調(diào)用。釋的方法會(huì)被調(diào)用。PostConstruct在在Init之后被調(diào)用。之后被調(diào)用。n Remove:當(dāng)客戶端調(diào)用標(biāo)注了當(dāng)客戶端調(diào)用標(biāo)注了Remove注釋的方法時(shí),容注釋的方法時(shí),容器將在方法執(zhí)行結(jié)束后把器將在方法執(zhí)行結(jié)束后把bean實(shí)例刪除。實(shí)例刪
9、除。132.9 Session Bean的生命周期事件的生命周期事件142.9 Session Bean的生命周期事件的生命周期事件15162.10 攔截器攔截器(Interceptor) n 攔截器可以攔截?cái)r截器可以攔截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 攔截器可以是同一攔截器可以是同一bean類中
10、的方法或是一個(gè)外部類。類中的方法或是一個(gè)外部類。172.10 攔截器攔截器(Interceptor)n Interceptors 注釋指定一個(gè)或多個(gè)在外部類中定義的攔截器,注釋指定一個(gè)或多個(gè)在外部類中定義的攔截器,多個(gè)攔截器類之間用逗號(hào)分隔,如:多個(gè)攔截器類之間用逗號(hào)分隔,如:q Interceptors(A.class,B.class,C.class),如果只有一個(gè)攔截器可,如果只有一個(gè)攔截器可以省略大括號(hào)。以省略大括號(hào)。182.10 攔截器攔截器(Interceptor)AroundInvoke注釋指定了要用作攔截器的方法,攔截器方法與被攔截的業(yè)務(wù)方法注釋指定了要用作攔截器的方法,攔截器方
11、法與被攔截的業(yè)務(wù)方法執(zhí)行在同一個(gè)執(zhí)行在同一個(gè)java調(diào)用堆棧、同一個(gè)事務(wù)和安全上下文中。調(diào)用堆棧、同一個(gè)事務(wù)和安全上下文中。用用AroundInvoke注釋指定的方法必須遵守以下格式:注釋指定的方法必須遵守以下格式:public Object XXX(erceptor.InvocationContext ctx) throws ExceptionXXX代表方法名可以任意代表方法名可以任意erceptor.InvocationContext封裝客戶端所調(diào)用業(yè)務(wù)方法的一些信息封裝客戶端所調(diào)用業(yè)務(wù)方法的一些信息192.10 攔截器攔截器(Interceptor)2
12、02.10 攔截器攔截器(Interceptor)212.11 依賴注入依賴注入(dependency injection)n 在實(shí)際應(yīng)用中,在實(shí)際應(yīng)用中,EJB可能會(huì)使用到其它可能會(huì)使用到其它EJB或資源?;蛸Y源。n 在傳統(tǒng)的開發(fā)中,我們要使用某個(gè)類對(duì)象,可以通過(guò)在傳統(tǒng)的開發(fā)中,我們要使用某個(gè)類對(duì)象,可以通過(guò)new object的方式來(lái)使用它。的方式來(lái)使用它。q 但在但在EJB中,不能這樣做,因?yàn)橹?,不能這樣做,因?yàn)镋JB實(shí)例的創(chuàng)建及銷毀是由容器管實(shí)例的創(chuàng)建及銷毀是由容器管理的。理的。n 要在要在bean中要用其它中要用其它EJB,必須通過(guò),必須通過(guò)JNDI查找或注入注釋。查找或注入注釋。q
13、 如在如在InjectionBean中使用中使用HelloBean EJB,需要在,需要在InjectionBean中通過(guò)中通過(guò)JNDI查找查找HelloBean的引用的引用222.11 依賴注入依賴注入(dependency injection)n 通過(guò)注入注釋通過(guò)注入注釋232.11 依賴注入依賴注入(dependency injection)n 通過(guò)通過(guò)ejb-jar.xml 添加注冊(cè)項(xiàng),該文件需放在添加注冊(cè)項(xiàng),該文件需放在 jar的的 META-INF 24Bean 類:類:InjectionBean.java 252.11.1 資源類型的注入資源類型的注入n 如何注入數(shù)據(jù)源如何注入數(shù)
14、據(jù)源?q “DefaultMySqlDS”是數(shù)據(jù)源的局部是數(shù)據(jù)源的局部 JNDI 名稱,只供名稱,只供 Jboss 容容器內(nèi)的應(yīng)用訪問(wèn)。器內(nèi)的應(yīng)用訪問(wèn)。 q 查找該局部查找該局部 JNDI 名稱時(shí),需要帶有前綴名稱時(shí),需要帶有前綴“java:/”。 262.11.1 資源類型的注入資源類型的注入272.12 定時(shí)服務(wù)定時(shí)服務(wù)(Timer Service)n 定時(shí)服務(wù)可以用在定時(shí)服務(wù)可以用在stateless session bean和和message-driven bean,當(dāng)某個(gè),當(dāng)某個(gè)stateless session bean或或message-driven bean的定時(shí)器啟動(dòng)時(shí),容器
15、會(huì)從實(shí)例池中選擇的定時(shí)器啟動(dòng)時(shí),容器會(huì)從實(shí)例池中選擇bean的一個(gè)實(shí)的一個(gè)實(shí)例,然后調(diào)用其例,然后調(diào)用其timeout回調(diào)方法。回調(diào)方法。n 可以使用可以使用Resource注釋注入定時(shí)服務(wù),或者使用容器對(duì)象注釋注入定時(shí)服務(wù),或者使用容器對(duì)象SessionContext創(chuàng)建定時(shí)器。創(chuàng)建定時(shí)器。n 下面例子在下面例子在session bean中定義一個(gè)定時(shí)器,每隔中定義一個(gè)定時(shí)器,每隔3秒鐘觸發(fā)秒鐘觸發(fā)一次事件,當(dāng)定時(shí)事件觸發(fā)一次事件,當(dāng)定時(shí)事件觸發(fā)5次的時(shí)候便終止定時(shí)器的執(zhí)行。次的時(shí)候便終止定時(shí)器的執(zhí)行。282.12 定時(shí)服務(wù)定時(shí)服務(wù)(Timer Service)292.12 定時(shí)服務(wù)定時(shí)服務(wù)
16、(Timer Service)n 當(dāng)定時(shí)器創(chuàng)建完成后,我們還需要添加定時(shí)事件的當(dāng)定時(shí)器創(chuàng)建完成后,我們還需要添加定時(shí)事件的回調(diào)方法。回調(diào)方法回調(diào)方法。回調(diào)方法使用使用javax.ejb.Timeout注釋標(biāo)注,必須返回注釋標(biāo)注,必須返回void,并接受一個(gè),并接受一個(gè)javax.ejb.Timer類型的參數(shù),回調(diào)方法聲明的格式:類型的參數(shù),回調(diào)方法聲明的格式:q void XXX(Timer timer)q 在定時(shí)事件發(fā)生時(shí),此方法將被執(zhí)行。在定時(shí)事件發(fā)生時(shí),此方法將被執(zhí)行。30JSP 客戶端代碼:客戶端代碼:TimerServiceTest.jsp 312.13 安全服務(wù)安全服務(wù)(Secur
17、ity service)n 使用使用Java驗(yàn)證和授權(quán)服務(wù)(驗(yàn)證和授權(quán)服務(wù)(Java Authentication Authorization Services JAAS)可以很好地解決上面)可以很好地解決上面的問(wèn)題,可以用它來(lái)管理應(yīng)用程序的安全性。的問(wèn)題,可以用它來(lái)管理應(yīng)用程序的安全性。q 驗(yàn)證(驗(yàn)證(Authentication)認(rèn)證是完成用戶名和密碼的匹配校驗(yàn);)認(rèn)證是完成用戶名和密碼的匹配校驗(yàn);其校驗(yàn)的對(duì)象是試圖訪問(wèn)受保護(hù)系統(tǒng)的用戶。在進(jìn)行校驗(yàn)時(shí),其校驗(yàn)的對(duì)象是試圖訪問(wèn)受保護(hù)系統(tǒng)的用戶。在進(jìn)行校驗(yàn)時(shí),應(yīng)用服務(wù)器會(huì)檢查用戶是否存在于系統(tǒng)之中,是否提供了憑證應(yīng)用服務(wù)器會(huì)檢查用戶是否存在于系
18、統(tǒng)之中,是否提供了憑證(通常指密碼)。(通常指密碼)。q 授權(quán)(授權(quán)(authorization)用戶一旦通過(guò)了系統(tǒng)驗(yàn)證,需要與系統(tǒng))用戶一旦通過(guò)了系統(tǒng)驗(yàn)證,需要與系統(tǒng)進(jìn)行某種形式的交互。授權(quán)就是決定用戶是否有權(quán)執(zhí)行某項(xiàng)操進(jìn)行某種形式的交互。授權(quán)就是決定用戶是否有權(quán)執(zhí)行某項(xiàng)操作的過(guò)程,授權(quán)是基于角色的。作的過(guò)程,授權(quán)是基于角色的。322.13 安全服務(wù)安全服務(wù)(Security service)n Jboss服務(wù)器提供了安全服務(wù)來(lái)進(jìn)行用戶認(rèn)證和根據(jù)用戶規(guī)則服務(wù)器提供了安全服務(wù)來(lái)進(jìn)行用戶認(rèn)證和根據(jù)用戶規(guī)則來(lái)限制對(duì)來(lái)限制對(duì)POJO的訪問(wèn)。的訪問(wèn)。q 對(duì)每一個(gè)對(duì)每一個(gè)POJO來(lái)說(shuō),可以使用來(lái)說(shuō),可以
19、使用SecurityDomain注釋為它指定注釋為它指定一個(gè)安全域,安全域告訴容器到哪里去找密碼和用戶角色列表。一個(gè)安全域,安全域告訴容器到哪里去找密碼和用戶角色列表。q Plain Old Java Objects,簡(jiǎn)單的,簡(jiǎn)單的Java對(duì)象,就是普通對(duì)象,就是普通JavaBeans,是為了避免和,是為了避免和EJB混淆所創(chuàng)造的簡(jiǎn)稱。混淆所創(chuàng)造的簡(jiǎn)稱。n JBoss中的中的other域指明要到域指明要到classpath下尋找下尋找pertes和和perties。q 對(duì)每一個(gè)方法來(lái)說(shuō),我們可以使用一個(gè)安全限制注釋來(lái)指定誰(shuí)可對(duì)每一個(gè)方法來(lái)說(shuō),我們可以使用一個(gè)
20、安全限制注釋來(lái)指定誰(shuí)可以運(yùn)行這個(gè)方法以運(yùn)行這個(gè)方法332.13 安全服務(wù)安全服務(wù)(Security service)n 本例使用本例使用Jboss默認(rèn)的安全域默認(rèn)的安全域“other”,“other”安全域告訴安全域告訴容器到容器到classpath下的下的perties和和perties中中尋找密碼和用戶角色列表。尋找密碼和用戶角色列表。n “other”安全域定義安全域定義q jboss安裝目錄安裝目錄/server/default/conf/login-config.xml文件中文件中342.13 安全服務(wù)安全服務(wù)(Security service)3
21、52.13 安全服務(wù)安全服務(wù)(Security service)下面我們開始安全服務(wù)的具體開發(fā):下面我們開始安全服務(wù)的具體開發(fā):n 第一步,定義安全域,安全域的定義有兩種方法:第一步,定義安全域,安全域的定義有兩種方法:n 第一種方法:通過(guò)第一種方法:通過(guò) Jboss 部署描述文件部署描述文件 jboss.xml 進(jìn)行定義進(jìn)行定義(本例采用的方法本例采用的方法) 指定我們使用的安全域是指定我們使用的安全域是“other”,AnonymousUser節(jié)點(diǎn)指定允許匿名用戶訪問(wèn)。節(jié)點(diǎn)指定允許匿名用戶訪問(wèn)。jboss.xml 必須必須 放進(jìn)放進(jìn) Jar 文件的文件的 META-INF 目錄。目錄。36
22、2.13 安全服務(wù)安全服務(wù)(Security service)372.13 安全服務(wù)安全服務(wù)(Security service)第三步,為業(yè)務(wù)方法定義訪問(wèn)角色(后臺(tái))。第三步,為業(yè)務(wù)方法定義訪問(wèn)角色(后臺(tái))。n RolesAllowed 注釋指定允許訪問(wèn)方法的角色列表,注釋指定允許訪問(wèn)方法的角色列表,如果角色存在多個(gè),可以用逗號(hào)分隔。如果角色存在多個(gè),可以用逗號(hào)分隔。n PermitAll 注釋指定注釋指定 任何角色都可以訪問(wèn)此方法。任何角色都可以訪問(wèn)此方法。382.13 安全服務(wù)安全服務(wù)(Security service)392.13 安全服務(wù)安全服務(wù)(Security service)40
23、2.13 安全服務(wù)安全服務(wù)(Security service)412.13.1 自定義安全域自定義安全域n 把用戶名把用戶名/密碼及角色存放在密碼及角色存放在pertes和和perties文件,不便于日后的管理。文件,不便于日后的管理。n 大多數(shù)情況下都希望把用戶名大多數(shù)情況下都希望把用戶名/密碼及角色存放在數(shù)據(jù)庫(kù)中。密碼及角色存放在數(shù)據(jù)庫(kù)中。n 我們需要自定義安全域,下面的例子定義了一個(gè)名為我們需要自定義安全域,下面的例子定義了一個(gè)名為foshanshop的安全域,它采用數(shù)據(jù)庫(kù)存儲(chǔ)用戶名及角色。的安全域,它采用數(shù)據(jù)庫(kù)存儲(chǔ)用戶名及角色。422.13.1 自定
24、義安全域自定義安全域432.13.1 自定義安全域自定義安全域“DefaultMySqlDS” 數(shù)據(jù)源,數(shù)據(jù)源,principalsQuery屬性指定如何通過(guò)給定的用戶名獲取密碼,屬性指定如何通過(guò)給定的用戶名獲取密碼,rolesQuery屬性指定如何通過(guò)給定的用戶名獲取角色列表。屬性指定如何通過(guò)給定的用戶名獲取角色列表。注意:注意:SQL中的中的Roles常量字段不能去掉。常量字段不能去掉。unauthenticatedIdentity屬性指定允許匿名用戶訪問(wèn)。屬性指定允許匿名用戶訪問(wèn)。442.13.1 自定義安全域自定義安全域452.13.1 自定義安全域自定義安全域46第三章第三章 實(shí)體實(shí)
25、體 Bean(Entity Bean)nJboss 數(shù)據(jù)源的配置數(shù)據(jù)源的配置n單表映射的實(shí)體單表映射的實(shí)體Bean n成員屬性映射成員屬性映射n建議重載實(shí)體建議重載實(shí)體 Bean的的 Equals()和和 Hashcode()方法方法n映射的表名或列名與數(shù)據(jù)庫(kù)保留字同名時(shí)的處理映射的表名或列名與數(shù)據(jù)庫(kù)保留字同名時(shí)的處理n多表映射的實(shí)體多表映射的實(shí)體Bean n持久化實(shí)體管理器持久化實(shí)體管理器 Entity Managern關(guān)系關(guān)系/對(duì)象映射對(duì)象映射nJPQL 查詢查詢473.1 JBoss 數(shù)據(jù)源的配置數(shù)據(jù)源的配置n 數(shù)據(jù)源用于配置數(shù)據(jù)庫(kù)的連接信息,每個(gè)數(shù)據(jù)源必須指定一個(gè)數(shù)據(jù)源用于配置數(shù)據(jù)庫(kù)的
26、連接信息,每個(gè)數(shù)據(jù)源必須指定一個(gè)唯一的唯一的JNDI名稱。應(yīng)用通過(guò)名稱。應(yīng)用通過(guò)JNDI名稱找到數(shù)據(jù)源。名稱找到數(shù)據(jù)源。q 在在Jboss中,有一個(gè)默認(rèn)的數(shù)據(jù)源中,有一個(gè)默認(rèn)的數(shù)據(jù)源DefaultDS,它使用,它使用Jboss內(nèi)置內(nèi)置的的HSQLDB數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)。q 實(shí)際項(xiàng)目中,可能使用不同的數(shù)據(jù)庫(kù),如實(shí)際項(xiàng)目中,可能使用不同的數(shù)據(jù)庫(kù),如MySql、SqlServer、Oracle等。等。n 每種數(shù)據(jù)庫(kù)的數(shù)據(jù)源配置模版可以在每種數(shù)據(jù)庫(kù)的數(shù)據(jù)源配置模版可以在Jboss安裝目安裝目錄錄docsexamplesjca目錄中找到,名稱為:數(shù)據(jù)庫(kù)名目錄中找到,名稱為:數(shù)據(jù)庫(kù)名+-ds.xml。483.
27、1 JBoss 數(shù)據(jù)源的配置數(shù)據(jù)源的配置n 數(shù)據(jù)源部署的過(guò)程很簡(jiǎn)單,直接把它拷貝到數(shù)據(jù)源部署的過(guò)程很簡(jiǎn)單,直接把它拷貝到j(luò)boss的的deploy目目錄即可。錄即可。n 容器遇到以容器遇到以*-ds.xml結(jié)尾的文件時(shí),會(huì)進(jìn)行動(dòng)態(tài)發(fā)布。發(fā)布完結(jié)尾的文件時(shí),會(huì)進(jìn)行動(dòng)態(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ù)源的配置數(shù)據(jù)源的配置n 數(shù)據(jù)源配置文件的取名格式必須為數(shù)據(jù)源配置文件的取名格式必須為xxxds.xml,其中,其中x
28、xx代表代表任意名稱,如任意名稱,如:mysql-ds.xml,mssqlserver-ds.xml,oracle-ds.xml。n 數(shù)據(jù)源部署前,必須把數(shù)據(jù)庫(kù)驅(qū)動(dòng)數(shù)據(jù)源部署前,必須把數(shù)據(jù)庫(kù)驅(qū)動(dòng)Jar拷貝到拷貝到j(luò)boss安裝目安裝目錄錄/server/配置名配置名/lib目錄,本書采用的配置名為目錄,本書采用的配置名為default,因此,因此需要把數(shù)據(jù)庫(kù)驅(qū)動(dòng)拷貝到需要把數(shù)據(jù)庫(kù)驅(qū)動(dòng)拷貝到j(luò)boss安裝目錄安裝目錄/server/default/lib。完成拷貝后,必須重啟完成拷貝后,必須重啟Jboss服務(wù)器。服務(wù)器。n 本書使用的數(shù)據(jù)庫(kù)是本書使用的數(shù)據(jù)庫(kù)是mysql-5.0.22,其驅(qū)動(dòng)為,
29、其驅(qū)動(dòng)為mysql-connector-java-3.1.13-bin.jar。513.2 單表映射的實(shí)體單表映射的實(shí)體 Beann 在本例子,該表由持久化驅(qū)動(dòng)自動(dòng)生成,不需要我們創(chuàng)建。在本例子,該表由持久化驅(qū)動(dòng)自動(dòng)生成,不需要我們創(chuàng)建。 523.2 單表映射的實(shí)體單表映射的實(shí)體 Bean53Session Bean 的業(yè)務(wù)接口的業(yè)務(wù)接口 n 在在EJB3.0,實(shí)體,實(shí)體Bean并不直接與客戶端打并不直接與客戶端打交道。而是被交道。而是被Session bean或或Message-Driven Bean使用。使用。n 定義一個(gè)定義一個(gè)Session Bean,在,在Session Bean中通
30、過(guò)實(shí)體中通過(guò)實(shí)體bean間接操作數(shù)據(jù)庫(kù)。間接操作數(shù)據(jù)庫(kù)。54Session Bean的實(shí)現(xiàn)的實(shí)現(xiàn) Database name55Session Bean的實(shí)現(xiàn)的實(shí)現(xiàn) Database nameem.find()方法用于查找方法用于查找特定主鍵的實(shí)體特定主鍵的實(shí)體bean。em.persist()方法用于保存實(shí)方法用于保存實(shí)體體bean,即插入一條記錄。,即插入一條記錄。em.merge()方法用于更新或保存實(shí)體方法用于更新或保存實(shí)體 當(dāng)實(shí)體不存在時(shí),執(zhí)行保存操作當(dāng)實(shí)體不存在時(shí),執(zhí)行保存操作 當(dāng)實(shí)體已經(jīng)存在時(shí),執(zhí)行更新操作當(dāng)實(shí)體已經(jīng)存在時(shí),執(zhí)行更新操作em.remove()方法用于刪除實(shí)體,方法
31、用于刪除實(shí)體,即刪除一條記錄。即刪除一條記錄。em.createQuery()用于執(zhí)行用于執(zhí)行JPQL語(yǔ)句。語(yǔ)句。56 JSP 客戶端代碼:客戶端代碼:EntityBeanTest.jsp 573.6 多表映射的實(shí)體多表映射的實(shí)體Beann 如果實(shí)體的成員屬性映射的字段分布在多張表中,如何處理?如果實(shí)體的成員屬性映射的字段分布在多張表中,如何處理?q 本例子的實(shí)體本例子的實(shí)體MainTable具有四個(gè)成員屬性:具有四個(gè)成員屬性:id、name、address和和postcode。q 其中與其中與id和和name映射的字段在映射的字段在MainTable表,與表,與address和和postco
32、de屬性映射的字段在屬性映射的字段在Address表。表。q 需要使用需要使用javax.persistence.SecondaryTable注釋和注釋和Column.table()屬性屬性583.6 多表映射的實(shí)體多表映射的實(shí)體BeanMainTable.class593.6 多表映射的實(shí)體多表映射的實(shí)體Bean603.6 多表映射的實(shí)體多表映射的實(shí)體Bean重載實(shí)體重載實(shí)體 equals() 方法方法重載實(shí)體重載實(shí)體 hashCode()方法方法重載實(shí)體重載實(shí)體 toString() 方法方法613.6 多表映射的實(shí)體多表映射的實(shí)體BeanMultitableMappingDAO.java
33、n實(shí)體實(shí)體Bean的使用者的使用者Session Bean623.6 多表映射的實(shí)體多表映射的實(shí)體BeanMultitableMappingDAOBean.class633.6 多表映射的實(shí)體多表映射的實(shí)體BeanMultitableMappingTest.jsp643.6 多表映射的實(shí)體多表映射的實(shí)體Bean653.8 關(guān)系關(guān)系/對(duì)象映射對(duì)象映射n雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射n單向一對(duì)多單向一對(duì)多n單向多對(duì)一單向多對(duì)一n雙向一對(duì)一映射雙向一對(duì)一映射n單向一對(duì)一單向一對(duì)一n雙向多對(duì)多映射雙向多對(duì)多映射n單向多對(duì)多單向多對(duì)多663.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一
34、映射n 現(xiàn)實(shí)應(yīng)用中存在很多一對(duì)多的情況,如一項(xiàng)訂單中存在一個(gè)或現(xiàn)實(shí)應(yīng)用中存在很多一對(duì)多的情況,如一項(xiàng)訂單中存在一個(gè)或多個(gè)訂購(gòu)項(xiàng)。多個(gè)訂購(gòu)項(xiàng)。n 當(dāng)當(dāng)one方存在與方存在與many方關(guān)系的定義,而方關(guān)系的定義,而many方同時(shí)也存在與方同時(shí)也存在與one方關(guān)系的定義,這樣的關(guān)系被稱為雙向關(guān)系。方關(guān)系的定義,這樣的關(guān)系被稱為雙向關(guān)系。n 代碼上體現(xiàn)為在代碼上體現(xiàn)為在one方有一個(gè)集合屬性指向方有一個(gè)集合屬性指向many方,而在方,而在many方也有一個(gè)屬性指向方也有一個(gè)屬性指向one方。方。673.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射n 雙向一對(duì)多關(guān)系,必須包含一個(gè)關(guān)系維護(hù)端。持久
35、化規(guī)范要求雙向一對(duì)多關(guān)系,必須包含一個(gè)關(guān)系維護(hù)端。持久化規(guī)范要求多多的一方為關(guān)系維護(hù)端(的一方為關(guān)系維護(hù)端(ownerside),),一一的一方為關(guān)系被維的一方為關(guān)系被維護(hù)端(護(hù)端(inverseside)。)。n 在在one方的方的OneToMany注釋設(shè)置注釋設(shè)置mappedBy屬性,以指定屬性,以指定它是這一關(guān)聯(lián)中的被維護(hù)端,它是這一關(guān)聯(lián)中的被維護(hù)端,Many方是關(guān)系維護(hù)端。方是關(guān)系維護(hù)端。683.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射Order.java 693.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射指明指明Order與與OrderItem關(guān)聯(lián)關(guān)系為一對(duì)多關(guān)
36、系關(guān)聯(lián)關(guān)系為一對(duì)多關(guān)系703.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射713.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射OrderItem.java 變量變量定義定義 構(gòu)造構(gòu)造函數(shù)函數(shù) 723.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射733.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射public interface ManyToOneClass targetEntity( ) default void.class; CascadeType cascade( ) default ; FetchType fetch( ) default EAGER; b
37、oolean optional( ) default true;targetEntity()、cascade()和和fetch()的具體含義和的具體含義和OneToMany注釋的同名屬性相同,但注釋的同名屬性相同,但ManyToOne注釋的注釋的fetch()屬性默認(rèn)值是屬性默認(rèn)值是FetchType.EAGER。optional()指定關(guān)聯(lián)方是否可以為空指定關(guān)聯(lián)方是否可以為空(null),該屬性值默認(rèn)為,該屬性值默認(rèn)為true。若將其設(shè)為若將其設(shè)為false,則要求雙方必須存在。,則要求雙方必須存在。我們不需要設(shè)置我們不需要設(shè)置JoinColumn注釋的注釋的nullable()屬性。屬性。
38、通過(guò)通過(guò)EntityManager.find()、EntityManager.getReference()查詢查詢OrderItem實(shí)體:實(shí)體:u 當(dāng)當(dāng)optional=false時(shí),時(shí),OrderItem與與Order關(guān)聯(lián)形式為關(guān)聯(lián)形式為inner join,u 當(dāng)當(dāng)optional=true時(shí),時(shí),OrderItem與與Order關(guān)聯(lián)形式為關(guān)聯(lián)形式為left join。743.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射n SessionBean的業(yè)務(wù)接口:的業(yè)務(wù)接口:OrderDAO.java753.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射n SessionBean的
39、業(yè)務(wù)接口:的業(yè)務(wù)接口:OrderDAOBean.java76JSP 客戶端代碼:客戶端代碼:OneToManyTest.jsp773.8.1 雙向一對(duì)多及多對(duì)一映射雙向一對(duì)多及多對(duì)一映射OrderItem表表Order表表783.8.2 單向一對(duì)多單向一對(duì)多Order.java 793.8.2 單向一對(duì)多單向一對(duì)多OrderItem.java 803.8.3 單向多對(duì)一單向多對(duì)一Order.java 813.8.3 單向多對(duì)一單向多對(duì)一指明指明Order與與OrderItem關(guān)聯(lián)關(guān)系為一對(duì)多關(guān)系關(guān)聯(lián)關(guān)系為一對(duì)多關(guān)系Order.java 823.8.3 單向多對(duì)一單向多對(duì)一OrderItem.j
40、ava 833.8.3 單向多對(duì)一單向多對(duì)一OrderItem.java 保持不變!保持不變!843.8.6 雙向多對(duì)多映射雙向多對(duì)多映射n 實(shí)現(xiàn)生活中,一個(gè)學(xué)生有多個(gè)老師,一個(gè)老師有多個(gè)學(xué)生,他實(shí)現(xiàn)生活中,一個(gè)學(xué)生有多個(gè)老師,一個(gè)老師有多個(gè)學(xué)生,他們具有明顯的多對(duì)多關(guān)系。們具有明顯的多對(duì)多關(guān)系。q 多對(duì)多映射采取中間表連接的映射策略,建立的中間表將分別引多對(duì)多映射采取中間表連接的映射策略,建立的中間表將分別引入兩邊的主鍵作為外鍵。入兩邊的主鍵作為外鍵。q EJB3對(duì)于中間表的元數(shù)據(jù)提供了可配置的方式,用戶可以自定義對(duì)于中間表的元數(shù)據(jù)提供了可配置的方式,用戶可以自定義中間表的表名、列名。中間表
41、的表名、列名。studentteacherteacher-student*853.8.6 雙向多對(duì)多映射雙向多對(duì)多映射n Student.java863.8.6 雙向多對(duì)多映射雙向多對(duì)多映射n Student.java在雙向在雙向ManyToMany關(guān)聯(lián)中,必須包含有一個(gè)關(guān)系維護(hù)端。關(guān)聯(lián)中,必須包含有一個(gè)關(guān)系維護(hù)端。在在Student的的ManyToMany注釋中指定注釋中指定mappedBy()屬性,屬性,將其標(biāo)識(shí)為關(guān)系將其標(biāo)識(shí)為關(guān)系被被維護(hù)端,自然維護(hù)端,自然Teacher就成了關(guān)系維護(hù)端。就成了關(guān)系維護(hù)端。ManyToMany注釋指定注釋指定Student是多對(duì)多關(guān)系的一端,是多對(duì)多關(guān)系
42、的一端,mappedBy屬性指定屬性指定Student為雙向關(guān)系的被維護(hù)端為雙向關(guān)系的被維護(hù)端(inverse side),指出該關(guān),指出該關(guān)系映射信息是在被關(guān)聯(lián)實(shí)體系映射信息是在被關(guān)聯(lián)實(shí)體Teacher的成員屬性的成員屬性students上定義的。上定義的。873.8.6 雙向多對(duì)多映射雙向多對(duì)多映射n Teacher.java883.8.6 雙向多對(duì)多映射雙向多對(duì)多映射n Teacher.java893.8.6 雙向多對(duì)多映射雙向多對(duì)多映射n TeacherDAO.java903.8.6 雙向多對(duì)多映射雙向多對(duì)多映射n TeacherDAOBean.java913.8.6 雙向多對(duì)多映射雙
43、向多對(duì)多映射n TeacherDAOBean.java923.8.6 雙向多對(duì)多映射雙向多對(duì)多映射n ManyToManyTest.jspteacherteacher_studentstudent933.8.7 單向多對(duì)多單向多對(duì)多n Teacher.java943.8.7 單向多對(duì)多單向多對(duì)多n Teacher.java953.8.7 單向多對(duì)多單向多對(duì)多n Student.java963.8.7 單向多對(duì)多單向多對(duì)多n Student.java973.9 JPQL查詢查詢n 命名參數(shù)查詢命名參數(shù)查詢n 位置參數(shù)查詢位置參數(shù)查詢n Date參數(shù)參數(shù)n 一個(gè)一個(gè)JPQL查詢例子查詢例子n 命名
44、查詢命名查詢n 排序排序(order by)n 查詢部分屬性查詢部分屬性n 查詢中使用構(gòu)造器查詢中使用構(gòu)造器(Constructor)n 聚合查詢聚合查詢(Aggregation)n 關(guān)聯(lián)關(guān)聯(lián)(join)n 排除相同的記錄排除相同的記錄DISTINCTn 比較比較Entityn 批量更新批量更新(Batch Update)n 批量刪除批量刪除(Batch Remove)n 邏輯非運(yùn)算符邏輯非運(yùn)算符NOTn 使用操作符使用操作符BETWEENn 使用操作符使用操作符INn 使用操作符使用操作符LIKEn 使用操作符使用操作符IS NULLn 使用操作符使用操作符IS EMPTYn 字符串函數(shù)字符
45、串函數(shù)n 日期和時(shí)間函數(shù)日期和時(shí)間函數(shù)n 數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù)n Member ofn 子查詢子查詢n EXISTSn All, ANY, SOMEn 結(jié)果集分頁(yè)結(jié)果集分頁(yè)98實(shí)例數(shù)據(jù)庫(kù)實(shí)例數(shù)據(jù)庫(kù)Person表表Order表表OrderItem表表99(1) 命名參數(shù)查詢命名參數(shù)查詢n 命名參數(shù)的格式為冒號(hào)加上參數(shù)名:命名參數(shù)的格式為冒號(hào)加上參數(shù)名:“:+參數(shù)名參數(shù)名”100(2) 位置參數(shù)查詢位置參數(shù)查詢n 位置參數(shù)的格式為問(wèn)號(hào)加上位置編號(hào):位置參數(shù)的格式為問(wèn)號(hào)加上位置編號(hào):“?+位置編號(hào)位置編號(hào)”101(3) Date參數(shù)參數(shù)n 如果需要將如果需要將 java.util.Date 或或 jav
46、a.util.Calendar 作為參數(shù)傳作為參數(shù)傳進(jìn)一個(gè)參數(shù)查詢,使用對(duì)應(yīng)的進(jìn)一個(gè)參數(shù)查詢,使用對(duì)應(yīng)的 setParameter()方法方法102Person.java 103Person.java104Person.javaOrder表表105Order.java106Order.java107OrderItem.java108OrderItem.javaOrder表表109QueryDAOBean.javaPerson表表Order表表OrderItem表表110QueryDAOBean.java111 JSP客戶端代碼:客戶端代碼:QueryTest.jsp 112(5) 命名查詢命名
47、查詢n 你可以在實(shí)體你可以在實(shí)體bean上定義一個(gè)或多個(gè)查詢語(yǔ)句,這樣可以減少上定義一個(gè)或多個(gè)查詢語(yǔ)句,這樣可以減少每次因書寫錯(cuò)誤而引起的每次因書寫錯(cuò)誤而引起的BUG。n 實(shí)際應(yīng)用中,一般把經(jīng)常使用的查詢語(yǔ)句定義成命名查詢。實(shí)際應(yīng)用中,一般把經(jīng)常使用的查詢語(yǔ)句定義成命名查詢。當(dāng)命名查詢定義好了之后,我們可以通過(guò)其名稱執(zhí)行查詢:當(dāng)命名查詢定義好了之后,我們可以通過(guò)其名稱執(zhí)行查詢:113(5) 命名查詢命名查詢n 如果需要定義多個(gè)命名查詢,可以使用如果需要定義多個(gè)命名查詢,可以使用javax.persistence.NamedQueries注釋。注釋。n 在該注釋里面,可以放置多個(gè)在該注釋里面,可
48、以放置多個(gè)NamedQuery注釋:注釋:當(dāng)命名查詢定義好了之后,我們可以通過(guò)其名稱執(zhí)行查詢:當(dāng)命名查詢定義好了之后,我們可以通過(guò)其名稱執(zhí)行查詢:114(6) 排序排序(order by)n ASC和和DESC分別為升序和降序,如果不顯式指定,分別為升序和降序,如果不顯式指定,JPQL默認(rèn)使用默認(rèn)使用ASC升序。升序。(QueryDAOBean.java)115(7) 查詢部分屬性查詢部分屬性(QueryDAOBean.java)n 在前面的例子中,都是針對(duì)實(shí)體的查詢,返回的結(jié)果也是實(shí)體在前面的例子中,都是針對(duì)實(shí)體的查詢,返回的結(jié)果也是實(shí)體類型。類型。JPQL允許查詢返回我們需要的成員屬性。在
49、一些實(shí)體成允許查詢返回我們需要的成員屬性。在一些實(shí)體成員屬性比較多的情況,這樣的查詢可以提高性能。員屬性比較多的情況,這樣的查詢可以提高性能。116(8) 查詢中使用構(gòu)造器查詢中使用構(gòu)造器(Constructor)n JPQL支持將查詢的結(jié)果直接作為一個(gè)支持將查詢的結(jié)果直接作為一個(gè)Java類的構(gòu)造器參數(shù),類的構(gòu)造器參數(shù),并產(chǎn)生類對(duì)象作為結(jié)果返回。并產(chǎn)生類對(duì)象作為結(jié)果返回。117(8) 查詢中使用構(gòu)造器查詢中使用構(gòu)造器(Constructor)n 將查詢的屬性結(jié)果直接作為將查詢的屬性結(jié)果直接作為 SimplePerson 的構(gòu)造器參數(shù)。的構(gòu)造器參數(shù)。 118(9) 聚合查詢聚合查詢(Aggreg
50、ation)n像大部分的像大部分的SQL一樣,一樣,JPQL也支持查詢中的聚合函數(shù):也支持查詢中的聚合函數(shù):nAVG()求平均數(shù),返回值類型為求平均數(shù),返回值類型為Double;nSUM()求和,返回值類型為被求值的成員屬性所對(duì)應(yīng)的類型;求和,返回值類型為被求值的成員屬性所對(duì)應(yīng)的類型;nCOUNT()統(tǒng)計(jì),返回類型為統(tǒng)計(jì),返回類型為L(zhǎng)ong,注意,注意count(*)語(yǔ)法并不屬語(yǔ)法并不屬于于JPA規(guī)范,它在規(guī)范,它在hibernate中可用;中可用;nMAX()求最大值,返回值類型為被求值的成員屬性所對(duì)應(yīng)的類求最大值,返回值類型為被求值的成員屬性所對(duì)應(yīng)的類型??捎糜诨緮?shù)據(jù)類型,字符串及可序列
51、化對(duì)象;型??捎糜诨緮?shù)據(jù)類型,字符串及可序列化對(duì)象;nMIN()求最小值,返回值類型為被求值的成員屬性所對(duì)應(yīng)的類求最小值,返回值類型為被求值的成員屬性所對(duì)應(yīng)的類型??捎糜诨緮?shù)據(jù)類型,字符串及可序列化對(duì)象。型??捎糜诨緮?shù)據(jù)類型,字符串及可序列化對(duì)象。q聚合函數(shù)在統(tǒng)計(jì)時(shí),會(huì)忽略掉帶聚合函數(shù)在統(tǒng)計(jì)時(shí),會(huì)忽略掉帶null值的記錄。值的記錄。1.如果查詢的集合為空(即沒(méi)有記錄),如果查詢的集合為空(即沒(méi)有記錄),count()在處理時(shí)會(huì)返回在處理時(shí)會(huì)返回0,而而AVG()、SUM()、MAX()、MIN()返回返回null值。值。119(9) 聚合查詢聚合查詢(Aggregation)120(9)
52、 聚合查詢聚合查詢(Aggregation)n 和和SQL一樣,如果聚合函數(shù)不是一樣,如果聚合函數(shù)不是select.from的唯一一個(gè)返回的唯一一個(gè)返回列,需要使用列,需要使用GROUPBY語(yǔ)句。語(yǔ)句。121/去掉相同的編號(hào)去掉相同的編號(hào)(10)關(guān)聯(lián)關(guān)聯(lián)(join)n left out join/left join等,都是允許右邊表達(dá)式的實(shí)體為空。等,都是允許右邊表達(dá)式的實(shí)體為空。OrderOrderItem122(10)關(guān)聯(lián)關(guān)聯(lián)(join)n inner join 要求右邊表達(dá)式的實(shí)體必須存在。要求右邊表達(dá)式的實(shí)體必須存在。OrderOrderItem123(10)關(guān)聯(lián)關(guān)聯(lián)(join)n l
53、eft/left out/inner join fetch 提供了一種靈活的查詢加載方式來(lái)提供了一種靈活的查詢加載方式來(lái)提高查詢的性能。提高查詢的性能。n 在默認(rèn)的查詢中,實(shí)體的延遲屬性不會(huì)被加載。在默認(rèn)的查詢中,實(shí)體的延遲屬性不會(huì)被加載。 當(dāng)應(yīng)用需要時(shí),當(dāng)應(yīng)用需要時(shí),EJB3 Runtime才會(huì)執(zhí)行一條才會(huì)執(zhí)行一條SQL語(yǔ)句來(lái)加語(yǔ)句來(lái)加載屬于當(dāng)前載屬于當(dāng)前Order的的OrderItems。使用了使用了fetch,這個(gè)查詢只會(huì)產(chǎn)生一條,這個(gè)查詢只會(huì)產(chǎn)生一條 SQL 語(yǔ)句。語(yǔ)句。124(11) 排除相同的記錄排除相同的記錄Distinctn 使用關(guān)聯(lián)查詢,我們很經(jīng)常得到重復(fù)的對(duì)象,如下面語(yǔ)句:
54、使用關(guān)聯(lián)查詢,我們很經(jīng)常得到重復(fù)的對(duì)象,如下面語(yǔ)句:select o from Order o inner join fetch o.orderItems order by o.orderidq 如果一個(gè)如果一個(gè)Order有多個(gè)有多個(gè)orderItem,返回的結(jié)果就會(huì)有多個(gè)相同返回的結(jié)果就會(huì)有多個(gè)相同的的Order,需要使用,需要使用Distinct關(guān)鍵字排除相同的對(duì)象。關(guān)鍵字排除相同的對(duì)象。q Distinct 操作符還可以與任何聚合函數(shù)結(jié)合使用,首先去掉重復(fù)值,操作符還可以與任何聚合函數(shù)結(jié)合使用,首先去掉重復(fù)值,然后再統(tǒng)計(jì)。然后再統(tǒng)計(jì)。125(12) 比較比較Entityn 在使用參數(shù)查詢
55、時(shí),參數(shù)類型除了在使用參數(shù)查詢時(shí),參數(shù)類型除了String、原始數(shù)據(jù)類型、原始數(shù)據(jù)類型(int, double等等)和它們的對(duì)象類型和它們的對(duì)象類型(Integer, Double等等),也可以是實(shí)體對(duì)象。,也可以是實(shí)體對(duì)象。126(13)批量更新批量更新(Batch Update)Order表表(修改前修改前)127(14) 批量刪除批量刪除(Batch Remove)128(15) 邏輯非運(yùn)算符邏輯非運(yùn)算符NOT129(16) 使用操作符使用操作符BETWEEN130(17) 使用操作符使用操作符IN131(18) 使用操作符使用操作符LIKE132(19) 使用操作符使用操作符IS NU
56、LL133(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截取長(zhǎng)度為截取長(zhǎng)度為length字符。字符。n LOWER(string)q 將一個(gè)字符串將一個(gè)字符串string轉(zhuǎn)換成小寫形式。轉(zhuǎn)換成小寫形式。n UPPER(string)q 將一個(gè)字符串將一個(gè)字符串string轉(zhuǎn)換成大寫形
57、式。轉(zhuǎn)換成大寫形式。n LENGTH(string)q 返回字符串返回字符串string的長(zhǎng)度,為整數(shù)。的長(zhǎng)度,為整數(shù)。n TRIM(LEADING|TRAILING|BOTH char FROM string)q 去掉字符串去掉字符串string頭,尾或兩者的字符頭,尾或兩者的字符char。最簡(jiǎn)形式是。最簡(jiǎn)形式是TRIM(string),可,可以去掉字符串以去掉字符串string頭尾的空格字符。頭尾的空格字符。n LOCATE(string1, string2 ,start)q 返回返回string2在在string1的位置。定位函數(shù)有一個(gè)可選的起始位置的位置。定位函數(shù)有一個(gè)可選的起始位置s
58、tart。135(21) 字符串函數(shù)字符串函數(shù)136(23) 數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù)n ABS (arithmetic expression)q 返回算術(shù)表達(dá)式的返回算術(shù)表達(dá)式的絕對(duì)值絕對(duì)值。n SQRT (arithmetic expression)q 求算術(shù)表達(dá)式的求算術(shù)表達(dá)式的方根方根,返回一個(gè),返回一個(gè)Double。n MOD (arithmetic expression 1, arithmetic expression 2)q 求參數(shù)求參數(shù)1與參數(shù)與參數(shù)2的的模模,返回一個(gè)整數(shù)。,返回一個(gè)整數(shù)。n SIZE (collection-valued path-expression)q 計(jì)算一個(gè)
59、集合中元素的計(jì)算一個(gè)集合中元素的數(shù)量數(shù)量,并返回一個(gè)整數(shù)。,并返回一個(gè)整數(shù)。q 如果集合為空,返回如果集合為空,返回0。137(23) 數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù)138(24) Member ofn Member of操作符用于判斷實(shí)體是否是集合中的一員。操作符用于判斷實(shí)體是否是集合中的一員。 139(25) 子查詢子查詢n 子查詢可以用于子查詢可以用于WHERE和和HAVING條件語(yǔ)句中。條件語(yǔ)句中。140(26) EXISTSn EXISTS需要和子查詢配合使用,用來(lái)判斷子查詢是否存在記錄。需要和子查詢配合使用,用來(lái)判斷子查詢是否存在記錄。141(26) EXISTSn EXISTS需要和子查詢配合
60、使用,用來(lái)判斷子查詢是否存在記錄。需要和子查詢配合使用,用來(lái)判斷子查詢是否存在記錄。142(27) All, ANY, SOMEn 當(dāng)子查詢返回多條記錄時(shí),你可以使用表達(dá)式當(dāng)子查詢返回多條記錄時(shí),你可以使用表達(dá)式ALL、ANY和和SOME對(duì)結(jié)果做進(jìn)一步限定。對(duì)結(jié)果做進(jìn)一步限定。143(28) 結(jié)果集分頁(yè)結(jié)果集分頁(yè)n 有些時(shí)候執(zhí)行一個(gè)查詢會(huì)返回成千上萬(wàn)條記錄,事實(shí)上我們只有些時(shí)候執(zhí)行一個(gè)查詢會(huì)返回成千上萬(wàn)條記錄,事實(shí)上我們只需要顯示其中一部分?jǐn)?shù)據(jù),這時(shí)我們需要對(duì)結(jié)果集進(jìn)行分頁(yè)。需要顯示其中一部分?jǐn)?shù)據(jù),這時(shí)我們需要對(duì)結(jié)果集進(jìn)行分頁(yè)。n QueryAPI有兩個(gè)接口方法可以解決這個(gè)問(wèn)題:有兩個(gè)接口方法
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024幼兒園安全生產(chǎn)月活動(dòng)工作總結(jié)范文(31篇)
- 酒店管理崗位關(guān)鍵能力
- 2024物業(yè)租賃合同(34篇)
- 黃金卷1-【贏在中考·黃金八卷】(解析版)
- 烏魯木齊市實(shí)驗(yàn)學(xué)校2024屆高三上學(xué)期1月月考數(shù)學(xué)試題(解析版)
- 2025屆江西省新余一中學(xué)中考四模生物試題含解析
- 2022-2023學(xué)年山東省濱州市高一上學(xué)期期末考試地理試題(解析版)
- 2024年度天津市公共營(yíng)養(yǎng)師之二級(jí)營(yíng)養(yǎng)師自我檢測(cè)試卷A卷附答案
- 2025年中國(guó)血壓計(jì)治療儀行業(yè)未來(lái)趨勢(shì)預(yù)測(cè)分析及投資規(guī)劃研究建議報(bào)告
- 2024年度四川省公共營(yíng)養(yǎng)師之四級(jí)營(yíng)養(yǎng)師練習(xí)題及答案
- 江西省景德鎮(zhèn)市2023-2024學(xué)年高二上學(xué)期1月期末質(zhì)量檢測(cè)數(shù)學(xué)試題 附答案
- 2024年辦公樓衛(wèi)生管理制度模版(3篇)
- 船舶防火與滅火(課件)
- 保險(xiǎn)公司2024年工作總結(jié)(34篇)
- 2024年01月22503學(xué)前兒童健康教育活動(dòng)指導(dǎo)期末試題答案
- 湖北省荊州市八縣市2023-2024學(xué)年高一上學(xué)期1月期末考試 化學(xué) 含解析
- 2024年世界職業(yè)院校技能大賽中職組“嬰幼兒保育組”賽項(xiàng)考試題庫(kù)-上(單選題)
- 《水文化概論》全套教學(xué)課件
- 期末測(cè)評(píng)(基礎(chǔ)卷二)-2024-2025學(xué)年一年級(jí)上冊(cè)數(shù)學(xué)人教版
- 深圳大學(xué)《數(shù)值計(jì)算方法》2021-2022學(xué)年第一學(xué)期期末試卷
- 社區(qū)共享菜園建設(shè)方案及實(shí)施計(jì)劃
評(píng)論
0/150
提交評(píng)論