版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1,EJB3.0入門經(jīng)典,趙端陽 信息工程分院 ,2,關(guān)于開題報(bào)告答辯,請(qǐng)各位同學(xué),根據(jù)答辯時(shí)老師的建議,認(rèn)真修改三大件; 將修改結(jié)束以壓縮包的形式發(fā)給指導(dǎo)教師。,3,重點(diǎn)章節(jié),第2章 會(huì)話Bean (Session Bean) 第3章 實(shí)體Bean (Entity Bean) 第6章 Web服務(wù) (Web Service),4,題型,讀程序,寫結(jié)果; 編程; 寫操作步驟。,5,2.1.2 開發(fā)只實(shí)現(xiàn) Local 接口的無狀態(tài) Session Bean,開發(fā)只有 Local 接口的無狀態(tài)會(huì)話Session Bean,使用Local 注釋聲明接口是本地接口。 開發(fā)只
2、有 Remote 接口的無狀態(tài)會(huì)話Session Bean ,使用Remote 注釋聲明接口是遠(yuǎn)程接口。 當(dāng)Local 和Remote 注釋都不存在時(shí),容器會(huì)將 Bean class 實(shí)現(xiàn)的接口默認(rèn)為 Local 接口。如果 EJB 與客戶端 部署在同一個(gè)應(yīng)用服務(wù)器,采用 Local 接口訪問 EJB 優(yōu)于 Remote 接口。,6,業(yè)務(wù)接口:LocalHelloWorld.java,工程:LocalSessionBean,7,2.4 Stateful Session Bean開發(fā),在一些應(yīng)用場(chǎng)合中,有時(shí)我們需要每個(gè)用戶都有自己的一個(gè)實(shí)例,這個(gè)實(shí)例不受其他用戶影響。 購物車對(duì)象,每個(gè)用戶都應(yīng)有
3、自己的購物車,不希望有人往你的購物車?yán)锾砑踊蚰玫羯唐?,而有狀態(tài)Bean正好滿足你的這種需求。 每個(gè)有狀態(tài)Bean在bean實(shí)例的生命周期內(nèi)都只服務(wù)于一個(gè)用戶,bean class的成員變量可以在不同的方法調(diào)用間維護(hù)特定于某個(gè)用戶的數(shù)據(jù)。,8,2.4 Stateful Session Bean開發(fā),9,Bean 類:CartBean.java,10,有狀態(tài) Bean 的 JSP 客戶端代碼:StatefulBeanTest.jsp,先試圖從session中獲取購物車的存根。 如果當(dāng)前session不存在購物車,就創(chuàng)建一個(gè)新的購物車放入session中。 后面每執(zhí)行一次頁面都會(huì)添加一個(gè)相同的商品。
4、,11,2.9 Session Bean的生命周期事件,PostConstruct:當(dāng)bean對(duì)象完成實(shí)例化后會(huì)被立即調(diào)用,每個(gè)beanclass只能定義一個(gè)PostConstruct方法。這個(gè)注釋同時(shí)適用于有狀態(tài)和無狀態(tài)會(huì)話bean。 PreDestroy:標(biāo)注了這個(gè)注釋的方法會(huì)在容器銷毀一個(gè)無用的或者過期的bean實(shí)例之前調(diào)用。這個(gè)注釋同時(shí)適用于有狀態(tài)和無狀態(tài)會(huì)話bean。 PrePassivate:當(dāng)一個(gè)有狀態(tài)的bean實(shí)例空閑時(shí)間過長,就會(huì)發(fā)生鈍化(passivate)。標(biāo)注了這個(gè)注釋的方法會(huì)在鈍化之前被調(diào)用。bean實(shí)例被鈍化后,在一段時(shí)間內(nèi),如果仍然沒有用戶對(duì)bean實(shí)例進(jìn)行操作,
5、容器將會(huì)從硬盤中刪除它。以后,任何針對(duì)該bean方法的調(diào)用,容器都會(huì)拋出例外。這個(gè)注釋適用于有狀態(tài)會(huì)話bean。,12,2.9 Session Bean的生命周期事件,PostActivate:當(dāng)客戶端再次使用已經(jīng)被鈍化的有狀態(tài)bean時(shí),EJB容器會(huì)重新實(shí)例化一個(gè)Bean實(shí)例,并從硬盤中將之前的狀態(tài)恢復(fù)。標(biāo)注了這個(gè)注釋的方法會(huì)在激活完成時(shí)被調(diào)用。這個(gè)注釋只適用于有狀態(tài)會(huì)話bean。 Init:這個(gè)注釋指定了有狀態(tài)bean初始化的方法。它區(qū)別于PostConstruct注釋在于:多個(gè)Init注釋方法可以同時(shí)存在于有狀態(tài)sessionbean中,但每個(gè)bean實(shí)例只會(huì)有一個(gè)Init注釋的方法會(huì)被
6、調(diào)用。PostConstruct在Init之后被調(diào)用。 Remove:當(dāng)客戶端調(diào)用標(biāo)注了Remove注釋的方法時(shí),容器將在方法執(zhí)行結(jié)束后把bean實(shí)例刪除。,13,2.9 Session Bean的生命周期事件,14,2.9 Session Bean的生命周期事件,15,16,2.10 攔截器(Interceptor),攔截器可以攔截Session bean和message-driven bean的方法調(diào)用或生命周期事件。 攔截器用于封裝應(yīng)用的公用行為,使這些行為與業(yè)務(wù)邏輯分離,一旦這些公用行為發(fā)生改變,而不必修改很多業(yè)務(wù)類。 攔截器可以是同一bean類中的方法或是一個(gè)外部類。,17,2.10
7、 攔截器(Interceptor),Interceptors 注釋指定一個(gè)或多個(gè)在外部類中定義的攔截器,多個(gè)攔截器類之間用逗號(hào)分隔,如: Interceptors(A.class,B.class,C.class),如果只有一個(gè)攔截器可以省略大括號(hào)。,18,2.10 攔截器(Interceptor),AroundInvoke注釋指定了要用作攔截器的方法,攔截器方法與被攔截的業(yè)務(wù)方法執(zhí)行在同一個(gè)java調(diào)用堆棧、同一個(gè)事務(wù)和安全上下文中。 用AroundInvoke注釋指定的方法必須遵守以下格式: public Object XXX(erceptor.InvocationCont
8、ext ctx) throws Exception XXX代表方法名可以任意 erceptor.InvocationContext封裝客戶端所調(diào)用業(yè)務(wù)方法的一些信息,19,2.10 攔截器(Interceptor),20,2.10 攔截器(Interceptor),21,2.11 依賴注入(dependency injection),在實(shí)際應(yīng)用中,EJB可能會(huì)使用到其它EJB或資源。 在傳統(tǒng)的開發(fā)中,我們要使用某個(gè)類對(duì)象,可以通過new object的方式來使用它。 但在EJB中,不能這樣做,因?yàn)镋JB實(shí)例的創(chuàng)建及銷毀是由容器管理的。 要在bean中要用其它EJB,必須通過J
9、NDI查找或注入注釋。 如在InjectionBean中使用HelloBean EJB,需要在InjectionBean中通過JNDI查找HelloBean的引用,22,2.11 依賴注入(dependency injection),通過注入注釋,23,2.11 依賴注入(dependency injection),通過ejb-jar.xml 添加注冊(cè)項(xiàng),該文件需放在 jar的 META-INF,24,Bean 類:InjectionBean.java,25,2.11.1 資源類型的注入,如何注入數(shù)據(jù)源? “DefaultMySqlDS”是數(shù)據(jù)源的局部 JNDI 名稱,只供 Jboss 容器內(nèi)
10、的應(yīng)用訪問。 查找該局部 JNDI 名稱時(shí),需要帶有前綴“java:/”。,26,2.11.1 資源類型的注入,27,2.12 定時(shí)服務(wù)(Timer Service),定時(shí)服務(wù)可以用在stateless session bean和message-driven bean,當(dāng)某個(gè)stateless session bean或message-driven bean的定時(shí)器啟動(dòng)時(shí),容器會(huì)從實(shí)例池中選擇bean的一個(gè)實(shí)例,然后調(diào)用其timeout回調(diào)方法。 可以使用Resource注釋注入定時(shí)服務(wù),或者使用容器對(duì)象SessionContext創(chuàng)建定時(shí)器。 下面例子在session bean中定義一個(gè)定時(shí)
11、器,每隔3秒鐘觸發(fā)一次事件,當(dāng)定時(shí)事件觸發(fā)5次的時(shí)候便終止定時(shí)器的執(zhí)行。,28,2.12 定時(shí)服務(wù)(Timer Service),29,2.12 定時(shí)服務(wù)(Timer Service),當(dāng)定時(shí)器創(chuàng)建完成后,我們還需要添加定時(shí)事件的回調(diào)方法。回調(diào)方法使用javax.ejb.Timeout注釋標(biāo)注,必須返回void,并接受一個(gè)javax.ejb.Timer類型的參數(shù),回調(diào)方法聲明的格式: void XXX(Timer timer) 在定時(shí)事件發(fā)生時(shí),此方法將被執(zhí)行。,30,JSP 客戶端代碼:TimerServiceTest.jsp,31,2.13 安全服務(wù)(Security service),使
12、用Java驗(yàn)證和授權(quán)服務(wù)(Java Authentication Authorization Services JAAS)可以很好地解決上面的問題,可以用它來管理應(yīng)用程序的安全性。 驗(yàn)證(Authentication)認(rèn)證是完成用戶名和密碼的匹配校驗(yàn);其校驗(yàn)的對(duì)象是試圖訪問受保護(hù)系統(tǒng)的用戶。在進(jìn)行校驗(yàn)時(shí),應(yīng)用服務(wù)器會(huì)檢查用戶是否存在于系統(tǒng)之中,是否提供了憑證(通常指密碼)。 授權(quán)(authorization)用戶一旦通過了系統(tǒng)驗(yàn)證,需要與系統(tǒng)進(jìn)行某種形式的交互。授權(quán)就是決定用戶是否有權(quán)執(zhí)行某項(xiàng)操作的過程,授權(quán)是基于角色的。,32,2.13 安全服務(wù)(Security service),Jbos
13、s服務(wù)器提供了安全服務(wù)來進(jìn)行用戶認(rèn)證和根據(jù)用戶規(guī)則來限制對(duì)POJO的訪問。 對(duì)每一個(gè)POJO來說,可以使用SecurityDomain注釋為它指定一個(gè)安全域,安全域告訴容器到哪里去找密碼和用戶角色列表。 Plain Old Java Objects,簡單的Java對(duì)象,就是普通JavaBeans,是為了避免和EJB混淆所創(chuàng)造的簡稱。 JBoss中的other域指明要到classpath下尋找pertes和perties。 對(duì)每一個(gè)方法來說,我們可以使用一個(gè)安全限制注釋來指定誰可以運(yùn)行這個(gè)方法,33,2.13 安全服務(wù)(Security service),本例
14、使用Jboss默認(rèn)的安全域“other”,“other”安全域告訴容器到classpath下的perties和perties中尋找密碼和用戶角色列表。 “other”安全域定義 jboss安裝目錄/server/default/conf/login-config.xml文件中,34,2.13 安全服務(wù)(Security service),35,2.13 安全服務(wù)(Security service),下面我們開始安全服務(wù)的具體開發(fā): 第一步,定義安全域,安全域的定義有兩種方法: 第一種方法:通過 Jboss 部署描述文件 jboss.xml 進(jìn)行定義(本例采用
15、的方法),指定我們使用的安全域是“other”, AnonymousUser節(jié)點(diǎn)指定允許匿名用戶訪問。 jboss.xml 必須 放進(jìn) Jar 文件的 META-INF 目錄。,36,2.13 安全服務(wù)(Security service),37,2.13 安全服務(wù)(Security service),第三步,為業(yè)務(wù)方法定義訪問角色(后臺(tái))。 RolesAllowed 注釋指定允許訪問方法的角色列表,如果角色存在多個(gè),可以用逗號(hào)分隔。 PermitAll 注釋指定 任何角色都可以訪問此方法。,38,2.13 安全服務(wù)(Security service),39,2.13 安全服務(wù)(Security
16、 service),40,2.13 安全服務(wù)(Security service),41,2.13.1 自定義安全域,把用戶名/密碼及角色存放在pertes和perties文件,不便于日后的管理。 大多數(shù)情況下都希望把用戶名/密碼及角色存放在數(shù)據(jù)庫中。 我們需要自定義安全域,下面的例子定義了一個(gè)名為foshanshop的安全域,它采用數(shù)據(jù)庫存儲(chǔ)用戶名及角色。,42,2.13.1 自定義安全域,43,2.13.1 自定義安全域,“DefaultMySqlDS” 數(shù)據(jù)源, principalsQuery屬性指定如何通過給定的用戶名獲取密碼, rolesQuery屬
17、性指定如何通過給定的用戶名獲取角色列表。 注意:SQL中的Roles常量字段不能去掉。 unauthenticatedIdentity屬性指定允許匿名用戶訪問。,44,2.13.1 自定義安全域,45,2.13.1 自定義安全域,46,第三章 實(shí)體 Bean(Entity Bean),Jboss 數(shù)據(jù)源的配置 單表映射的實(shí)體Bean 成員屬性映射 建議重載實(shí)體 Bean的 Equals()和 Hashcode()方法 映射的表名或列名與數(shù)據(jù)庫保留字同名時(shí)的處理 多表映射的實(shí)體Bean 持久化實(shí)體管理器 Entity Manager 關(guān)系/對(duì)象映射 JPQL 查詢,47,3.1 JBoss 數(shù)據(jù)
18、源的配置,數(shù)據(jù)源用于配置數(shù)據(jù)庫的連接信息,每個(gè)數(shù)據(jù)源必須指定一個(gè)唯一的JNDI名稱。應(yīng)用通過JNDI名稱找到數(shù)據(jù)源。 在Jboss中,有一個(gè)默認(rèn)的數(shù)據(jù)源DefaultDS,它使用Jboss內(nèi)置的HSQLDB數(shù)據(jù)庫。 實(shí)際項(xiàng)目中,可能使用不同的數(shù)據(jù)庫,如MySql、SqlServer、Oracle等。 每種數(shù)據(jù)庫的數(shù)據(jù)源配置模版可以在Jboss安裝目錄docsexamplesjca目錄中找到,名稱為:數(shù)據(jù)庫名+-ds.xml。,48,3.1 JBoss 數(shù)據(jù)源的配置,數(shù)據(jù)源部署的過程很簡單,直接把它拷貝到j(luò)boss的deploy目錄即可。 容器遇到以*-ds.xml結(jié)尾的文件時(shí),會(huì)進(jìn)行動(dòng)態(tài)發(fā)布。
19、發(fā)布完成后,你可以在http:/localhost:8080/jmx-console/查看到數(shù)據(jù)源的信息,49,3.1 JBoss 數(shù)據(jù)源的配置,50,3.1 JBoss 數(shù)據(jù)源的配置,數(shù)據(jù)源配置文件的取名格式必須為xxxds.xml,其中xxx代表任意名稱,如:mysql-ds.xml,mssqlserver-ds.xml,oracle-ds.xml。 數(shù)據(jù)源部署前,必須把數(shù)據(jù)庫驅(qū)動(dòng)Jar拷貝到j(luò)boss安裝目錄/server/配置名/lib目錄,本書采用的配置名為default,因此需要把數(shù)據(jù)庫驅(qū)動(dòng)拷貝到j(luò)boss安裝目錄/server/default/lib。完成拷貝后,必須重啟Jbos
20、s服務(wù)器。 本書使用的數(shù)據(jù)庫是mysql-5.0.22,其驅(qū)動(dòng)為mysql-connector-java-3.1.13-bin.jar。,51,3.2 單表映射的實(shí)體 Bean,在本例子,該表由持久化驅(qū)動(dòng)自動(dòng)生成,不需要我們創(chuàng)建。,52,3.2 單表映射的實(shí)體 Bean,53,Session Bean 的業(yè)務(wù)接口,在EJB3.0,實(shí)體Bean并不直接與客戶端打交道。而是被Session bean或Message-Driven Bean使用。 定義一個(gè)Session Bean,在Session Bean中通過實(shí)體bean間接操作數(shù)據(jù)庫。,54,Session Bean的實(shí)現(xiàn),Database n
21、ame,55,Session Bean的實(shí)現(xiàn),Database name,em.find()方法用于查找特定主鍵的實(shí)體bean。,em.persist()方法用于保存實(shí)體bean,即插入一條記錄。,em.merge()方法用于更新或保存實(shí)體 當(dāng)實(shí)體不存在時(shí),執(zhí)行保存操作 當(dāng)實(shí)體已經(jīng)存在時(shí),執(zhí)行更新操作,em.remove()方法用于刪除實(shí)體,即刪除一條記錄。,em.createQuery()用于執(zhí)行JPQL語句。,56,JSP 客戶端代碼:EntityBeanTest.jsp,57,3.6 多表映射的實(shí)體Bean,如果實(shí)體的成員屬性映射的字段分布在多張表中,如何處理? 本例子的實(shí)體MainTa
22、ble具有四個(gè)成員屬性:id、name、address和postcode。 其中與id和name映射的字段在MainTable表,與address和postcode屬性映射的字段在Address表。 需要使用javax.persistence.SecondaryTable注釋和Column.table()屬性,58,3.6 多表映射的實(shí)體BeanMainTable.class,59,3.6 多表映射的實(shí)體Bean,60,3.6 多表映射的實(shí)體Bean,重載實(shí)體 equals() 方法,重載實(shí)體 hashCode()方法,重載實(shí)體 toString() 方法,61,3.6 多表映射的實(shí)體Bean
23、MultitableMappingDAO.java,實(shí)體Bean的使用者Session Bean,62,3.6 多表映射的實(shí)體BeanMultitableMappingDAOBean.class,63,3.6 多表映射的實(shí)體BeanMultitableMappingTest.jsp,64,3.6 多表映射的實(shí)體Bean,65,3.8 關(guān)系/對(duì)象映射,雙向一對(duì)多及多對(duì)一映射 單向一對(duì)多 單向多對(duì)一 雙向一對(duì)一映射 單向一對(duì)一 雙向多對(duì)多映射 單向多對(duì)多,66,3.8.1 雙向一對(duì)多及多對(duì)一映射,現(xiàn)實(shí)應(yīng)用中存在很多一對(duì)多的情況,如一項(xiàng)訂單中存在一個(gè)或多個(gè)訂購項(xiàng)。 當(dāng)one方存在與many方關(guān)系的定
24、義,而many方同時(shí)也存在與one方關(guān)系的定義,這樣的關(guān)系被稱為雙向關(guān)系。 代碼上體現(xiàn)為在one方有一個(gè)集合屬性指向many方,而在many方也有一個(gè)屬性指向one方。,67,3.8.1 雙向一對(duì)多及多對(duì)一映射,雙向一對(duì)多關(guān)系,必須包含一個(gè)關(guān)系維護(hù)端。持久化規(guī)范要求多的一方為關(guān)系維護(hù)端(ownerside),一的一方為關(guān)系被維護(hù)端(inverseside)。 在one方的OneToMany注釋設(shè)置mappedBy屬性,以指定它是這一關(guān)聯(lián)中的被維護(hù)端,Many方是關(guān)系維護(hù)端。,68,3.8.1 雙向一對(duì)多及多對(duì)一映射,Order.java,69,3.8.1 雙向一對(duì)多及多對(duì)一映射,指明Order
25、與OrderItem關(guān)聯(lián)關(guān)系為一對(duì)多關(guān)系,70,3.8.1 雙向一對(duì)多及多對(duì)一映射,71,3.8.1 雙向一對(duì)多及多對(duì)一映射,OrderItem.java,變量定義,構(gòu)造函數(shù),72,3.8.1 雙向一對(duì)多及多對(duì)一映射,73,3.8.1 雙向一對(duì)多及多對(duì)一映射,public interface ManyToOne Class targetEntity( ) default void.class; CascadeType cascade( ) default ; FetchType fetch( ) default EAGER; boolean optional( ) default true;
26、,targetEntity()、cascade()和fetch()的具體含義和OneToMany注釋的同名屬性相同,但ManyToOne注釋的fetch()屬性默認(rèn)值是FetchType.EAGER。,optional()指定關(guān)聯(lián)方是否可以為空(null),該屬性值默認(rèn)為true。 若將其設(shè)為false,則要求雙方必須存在。 我們不需要設(shè)置JoinColumn注釋的nullable()屬性。 通過EntityManager.find()、EntityManager.getReference()查詢OrderItem實(shí)體: 當(dāng)optional=false時(shí),OrderItem與Order關(guān)聯(lián)形式
27、為inner join, 當(dāng)optional=true時(shí),OrderItem與Order關(guān)聯(lián)形式為left join。,74,3.8.1 雙向一對(duì)多及多對(duì)一映射,SessionBean的業(yè)務(wù)接口:OrderDAO.java,75,3.8.1 雙向一對(duì)多及多對(duì)一映射,SessionBean的業(yè)務(wù)接口:OrderDAOBean.java,76,JSP 客戶端代碼:OneToManyTest.jsp,77,3.8.1 雙向一對(duì)多及多對(duì)一映射,OrderItem表,Order表,78,3.8.2 單向一對(duì)多,Order.java,79,3.8.2 單向一對(duì)多,OrderItem.java,80,3.8
28、.3 單向多對(duì)一,Order.java,81,3.8.3 單向多對(duì)一,指明Order與OrderItem關(guān)聯(lián)關(guān)系為一對(duì)多關(guān)系,Order.java,82,3.8.3 單向多對(duì)一,OrderItem.java,83,3.8.3 單向多對(duì)一,OrderItem.java 保持不變!,84,3.8.6 雙向多對(duì)多映射,實(shí)現(xiàn)生活中,一個(gè)學(xué)生有多個(gè)老師,一個(gè)老師有多個(gè)學(xué)生,他們具有明顯的多對(duì)多關(guān)系。 多對(duì)多映射采取中間表連接的映射策略,建立的中間表將分別引入兩邊的主鍵作為外鍵。 EJB3對(duì)于中間表的元數(shù)據(jù)提供了可配置的方式,用戶可以自定義中間表的表名、列名。,85,3.8.6 雙向多對(duì)多映射,Stude
29、nt.java,86,3.8.6 雙向多對(duì)多映射,Student.java,在雙向ManyToMany關(guān)聯(lián)中,必須包含有一個(gè)關(guān)系維護(hù)端。 在Student的ManyToMany注釋中指定mappedBy()屬性,將其標(biāo)識(shí)為關(guān)系被維護(hù)端,自然Teacher就成了關(guān)系維護(hù)端。,ManyToMany注釋指定Student是多對(duì)多關(guān)系的一端,mappedBy屬性指定Student為雙向關(guān)系的被維護(hù)端(inverse side),指出該關(guān)系映射信息是在被關(guān)聯(lián)實(shí)體Teacher的成員屬性students上定義的。,87,3.8.6 雙向多對(duì)多映射,Teacher.java,88,3.8.6 雙向多對(duì)多映射
30、,Teacher.java,89,3.8.6 雙向多對(duì)多映射,TeacherDAO.java,90,3.8.6 雙向多對(duì)多映射,TeacherDAOBean.java,91,3.8.6 雙向多對(duì)多映射,TeacherDAOBean.java,92,3.8.6 雙向多對(duì)多映射,ManyToManyTest.jsp,93,3.8.7 單向多對(duì)多,Teacher.java,94,3.8.7 單向多對(duì)多,Teacher.java,95,3.8.7 單向多對(duì)多,Student.java,96,3.8.7 單向多對(duì)多,Student.java,97,3.9 JPQL查詢,命名參數(shù)查詢 位置參數(shù)查詢 Dat
31、e參數(shù) 一個(gè)JPQL查詢例子 命名查詢 排序(order by) 查詢部分屬性 查詢中使用構(gòu)造器(Constructor) 聚合查詢(Aggregation) 關(guān)聯(lián)(join) 排除相同的記錄DISTINCT 比較Entity 批量更新(Batch Update) 批量刪除(Batch Remove),邏輯非運(yùn)算符NOT 使用操作符BETWEEN 使用操作符IN 使用操作符LIKE 使用操作符IS NULL 使用操作符IS EMPTY 字符串函數(shù) 日期和時(shí)間函數(shù) 數(shù)學(xué)函數(shù) Member of 子查詢 EXISTS All, ANY, SOME 結(jié)果集分頁,98,實(shí)例數(shù)據(jù)庫,Person表,Or
32、der表,OrderItem表,99,(1) 命名參數(shù)查詢,命名參數(shù)的格式為冒號(hào)加上參數(shù)名:“:+參數(shù)名”,100,(2) 位置參數(shù)查詢,位置參數(shù)的格式為問號(hào)加上位置編號(hào):“?+位置編號(hào)”,101,(3) Date參數(shù),如果需要將 java.util.Date 或 java.util.Calendar 作為參數(shù)傳進(jìn)一個(gè)參數(shù)查詢,使用對(duì)應(yīng)的 setParameter()方法,102,Person.java,103,Person.java,104,Person.java,Order表,105,Order.java,106,Order.java,107,OrderItem.java,108,Orde
33、rItem.java,Order表,109,QueryDAOBean.java,Person表,Order表,OrderItem表,110,QueryDAOBean.java,111,JSP客戶端代碼:QueryTest.jsp,112,(5) 命名查詢,你可以在實(shí)體bean上定義一個(gè)或多個(gè)查詢語句,這樣可以減少每次因書寫錯(cuò)誤而引起的BUG。 實(shí)際應(yīng)用中,一般把經(jīng)常使用的查詢語句定義成命名查詢。,113,(5) 命名查詢,如果需要定義多個(gè)命名查詢,可以使用javax.persistence.NamedQueries注釋。 在該注釋里面,可以放置多個(gè)NamedQuery注釋:,114,(6) 排
34、序(order by),ASC和DESC分別為升序和降序,如果不顯式指定,JPQL默認(rèn)使用ASC升序。(QueryDAOBean.java),115,(7) 查詢部分屬性(QueryDAOBean.java),在前面的例子中,都是針對(duì)實(shí)體的查詢,返回的結(jié)果也是實(shí)體類型。JPQL允許查詢返回我們需要的成員屬性。在一些實(shí)體成員屬性比較多的情況,這樣的查詢可以提高性能。,116,(8) 查詢中使用構(gòu)造器(Constructor),JPQL支持將查詢的結(jié)果直接作為一個(gè)Java類的構(gòu)造器參數(shù),并產(chǎn)生類對(duì)象作為結(jié)果返回。,117,(8) 查詢中使用構(gòu)造器(Constructor),將查詢的屬性結(jié)果直接作為
35、 SimplePerson 的構(gòu)造器參數(shù)。,118,(9) 聚合查詢(Aggregation),像大部分的SQL一樣,JPQL也支持查詢中的聚合函數(shù): AVG()求平均數(shù),返回值類型為Double; SUM()求和,返回值類型為被求值的成員屬性所對(duì)應(yīng)的類型; COUNT()統(tǒng)計(jì),返回類型為Long,注意count(*)語法并不屬于JPA規(guī)范,它在hibernate中可用; MAX()求最大值,返回值類型為被求值的成員屬性所對(duì)應(yīng)的類型??捎糜诨緮?shù)據(jù)類型,字符串及可序列化對(duì)象; MIN()求最小值,返回值類型為被求值的成員屬性所對(duì)應(yīng)的類型??捎糜诨緮?shù)據(jù)類型,字符串及可序列化對(duì)象。 聚合函數(shù)在統(tǒng)
36、計(jì)時(shí),會(huì)忽略掉帶null值的記錄。 如果查詢的集合為空(即沒有記錄),count()在處理時(shí)會(huì)返回0,而AVG()、SUM()、MAX()、MIN()返回null值。,119,(9) 聚合查詢(Aggregation),120,(9) 聚合查詢(Aggregation),和SQL一樣,如果聚合函數(shù)不是select.from的唯一一個(gè)返回列,需要使用GROUPBY語句。,121,/去掉相同的編號(hào),(10)關(guān)聯(lián)(join),left out join/left join等,都是允許右邊表達(dá)式的實(shí)體為空。,122,(10)關(guān)聯(lián)(join),inner join 要求右邊表達(dá)式的實(shí)體必須存在。,123
37、,(10)關(guān)聯(lián)(join),left/left out/inner join fetch 提供了一種靈活的查詢加載方式來提高查詢的性能。 在默認(rèn)的查詢中,實(shí)體的延遲屬性不會(huì)被加載。,當(dāng)應(yīng)用需要時(shí),EJB3 Runtime才會(huì)執(zhí)行一條SQL語句來加載屬于當(dāng)前Order的OrderItems。 使用了fetch,這個(gè)查詢只會(huì)產(chǎn)生一條 SQL 語句。,124,(11) 排除相同的記錄Distinct,使用關(guān)聯(lián)查詢,我們很經(jīng)常得到重復(fù)的對(duì)象,如下面語句: select o from Order o inner join fetch o.orderItems order by o.orderid 如果一
38、個(gè)Order有多個(gè)orderItem,返回的結(jié)果就會(huì)有多個(gè)相同的Order,需要使用Distinct關(guān)鍵字排除相同的對(duì)象。 Distinct 操作符還可以與任何聚合函數(shù)結(jié)合使用,首先去掉重復(fù)值,然后再統(tǒng)計(jì)。,125,(12) 比較Entity,在使用參數(shù)查詢時(shí),參數(shù)類型除了String、原始數(shù)據(jù)類型(int, double等)和它們的對(duì)象類型(Integer, Double等),也可以是實(shí)體對(duì)象。,126,(13)批量更新(Batch Update),Order表(修改前),127,(14) 批量刪除(Batch Remove),128,(15) 邏輯非運(yùn)算符NOT,129,(16) 使用操作
39、符BETWEEN,130,(17) 使用操作符IN,131,(18) 使用操作符LIKE,132,(19) 使用操作符IS NULL,133,(20) 使用操作符IS EMPTY,134,(21) 字符串函數(shù),CONCAT(string 1, string 2) 將字符串2追加到字符串1。 SUBSTRING(string, starting position, length) 從字符串string開始位置starting position截取長度為length字符。 LOWER(string) 將一個(gè)字符串string轉(zhuǎn)換成小寫形式。 UPPER(string) 將一個(gè)字符串string轉(zhuǎn)換
40、成大寫形式。 LENGTH(string) 返回字符串string的長度,為整數(shù)。 TRIM(LEADING|TRAILING|BOTH char FROM string) 去掉字符串string頭,尾或兩者的字符char。最簡形式是TRIM(string),可以去掉字符串string頭尾的空格字符。 LOCATE(string1, string2 ,start) 返回string2在string1的位置。定位函數(shù)有一個(gè)可選的起始位置start。,135,(21) 字符串函數(shù),136,(23) 數(shù)學(xué)函數(shù),ABS (arithmetic expression) 返回算術(shù)表達(dá)式的絕對(duì)值。 SQRT
41、 (arithmetic expression) 求算術(shù)表達(dá)式的方根,返回一個(gè)Double。 MOD (arithmetic expression 1, arithmetic expression 2) 求參數(shù)1與參數(shù)2的模,返回一個(gè)整數(shù)。 SIZE (collection-valued path-expression) 計(jì)算一個(gè)集合中元素的數(shù)量,并返回一個(gè)整數(shù)。 如果集合為空,返回0。,137,(23) 數(shù)學(xué)函數(shù),138,(24) Member of,Member of操作符用于判斷實(shí)體是否是集合中的一員。,139,(25) 子查詢,子查詢可以用于WHERE和HAVING條件語句中。,140
42、,(26) EXISTS,EXISTS需要和子查詢配合使用,用來判斷子查詢是否存在記錄。,141,(26) EXISTS,EXISTS需要和子查詢配合使用,用來判斷子查詢是否存在記錄。,142,(27) All, ANY, SOME,當(dāng)子查詢返回多條記錄時(shí),你可以使用表達(dá)式ALL、ANY和SOME對(duì)結(jié)果做進(jìn)一步限定。,143,(28) 結(jié)果集分頁,有些時(shí)候執(zhí)行一個(gè)查詢會(huì)返回成千上萬條記錄,事實(shí)上我們只需要顯示其中一部分?jǐn)?shù)據(jù),這時(shí)我們需要對(duì)結(jié)果集進(jìn)行分頁。 QueryAPI有兩個(gè)接口方法可以解決這個(gè)問題: setMaxResults方法設(shè)置獲取多少條記錄 setFirstResult方法設(shè)置從結(jié)
43、果集中的那個(gè)索引開始獲?。ㄋ饕龔?開始),144,(28) 結(jié)果集分頁,JSP 客戶端調(diào)用代碼片斷,設(shè)置每頁記錄數(shù)為2,如果數(shù)據(jù)庫中存在7條記錄,第一頁顯示的記錄索引應(yīng)為(0,1),第二頁為(2,3),第三頁為(3,4).等。 在分頁中,為了顯示數(shù)據(jù)有序,建議在查詢中進(jìn)行排序。,145,3.10 調(diào)用存儲(chǔ)過程,調(diào)用無返回值的存儲(chǔ)過程 調(diào)用返回單值的存儲(chǔ)過程 調(diào)用返回表全部列的存儲(chǔ)過程 調(diào)用返回部分列的存儲(chǔ)過程,146,1、調(diào)用無返回值的存儲(chǔ)過程,存儲(chǔ)過程,147,2、調(diào)用返回單值的存儲(chǔ)過程,有一個(gè)INTEGER類型的輸入?yún)?shù),148,2、調(diào)用返回單值的存儲(chǔ)過程,如果程序或線程總是對(duì)同樣的輸入?yún)?/p>
44、數(shù)產(chǎn)生同樣的結(jié)果,則被認(rèn)為它是“確定的”,否則就是“非確定”的。如果既沒有給定DETERMINISTIC也沒有給定NOT DETERMINISTIC,默認(rèn)的就是NOT DETERMINISTIC。 SQL SECURITY特征可以用來指定子程序該用創(chuàng)建子程序者的許可來執(zhí)行,還是使用調(diào)用者的許可來執(zhí)行。默認(rèn)值是DEFINER。 COMMENT子句是一個(gè)MySQL的擴(kuò)展,它可以被用來描述存儲(chǔ)程序。,149,3、調(diào)用返回表全部列的存儲(chǔ)過程,讓EJB3 Persistence運(yùn)行環(huán)境將列值直接填充入實(shí)體對(duì)象(本例填充進(jìn)Person對(duì)象),返回結(jié)果為實(shí)體類型的List。,150,4、調(diào)用返回部分列的存儲(chǔ)
45、過程,151,3.11復(fù)合主鍵(Composite Primary Key),當(dāng)需要使用多個(gè)屬性變量(多列)聯(lián)合起來作為主鍵,需要使用復(fù)合主鍵。復(fù)合主鍵要求我們編寫一個(gè)復(fù)合主鍵類( Composite Primary Key Class )。 復(fù)合主鍵類需要符合以下一些要求: 復(fù)合主鍵類必須是public和具備一個(gè)沒有參數(shù)的構(gòu)造函數(shù); 復(fù)合主鍵類的每個(gè)屬性變量必須有g(shù)etter/setter。如果沒有,每個(gè)屬性變量則必須是public或者protected; 復(fù)合主鍵類必須實(shí)現(xiàn)java.io.serializable; 復(fù)合主鍵類必須實(shí)現(xiàn)equals()和hashcode()方法; 復(fù)合主鍵類
46、中的主鍵屬性變量的名字必須和對(duì)應(yīng)的Entity中主鍵屬性變量的名字相同。,152,示例:一條航線是由出發(fā)地和到達(dá)地決定的,153,AirtLinePK.java,154,AirLine.java,155,AirLine.java,156,Flight.java,157,Flight.java,158,Flight.java,159,AirLineDAOBean.java,160,EJBTest/web/CompositePKTest.jsp,161,第6章 Web服務(wù)(Web Service),EJB容器模型的Web Service開發(fā) Web容器模型的Web Service開發(fā) Web Se
47、rvice的客戶端調(diào)用 3.1在J2SE或Web中調(diào)用Web Service 3.2在EJB中調(diào)用Web Service,162,第6章 Web服務(wù)(Web Service),Web服務(wù)也是一種分布式技術(shù),它與EJB最大的不同是,Web服務(wù)屬于行業(yè)規(guī)范,可以跨平臺(tái)及語言。 EJB屬于java平臺(tái)的規(guī)范,盡管理論上可以跨平臺(tái),但實(shí)現(xiàn)起來比較復(fù)雜,所以其應(yīng)用范圍局限在java平臺(tái)。 看上去兩者好像是互相競爭的關(guān)系,其實(shí)不是。 它們兩者的偏重點(diǎn)不一樣,Web服務(wù)偏重的是這個(gè)系統(tǒng)對(duì)外提供什么功能,而EJB偏重的是如何用一個(gè)個(gè)組件組裝這些功能。 就好比一個(gè)硬盤,它對(duì)外提供的是存儲(chǔ)服務(wù),這是web服務(wù)的關(guān)注點(diǎn)。對(duì)于怎樣組裝這個(gè)硬盤,怎樣構(gòu)造這些小零件,web服務(wù)并不關(guān)心,但這些卻是EJB所關(guān)注的。,163,第6章 Web服務(wù)(Web Service),Web Service技術(shù)到今天仍在不斷地發(fā)展,規(guī)范也在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 消防安全八大要點(diǎn)
- 軟件銷售精英路徑
- 人工智能家居系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 護(hù)理不良事件的管理體系
- 直播飾品銷售話術(shù)
- 騎車保險(xiǎn)銷售話術(shù)精要
- 隧道渡槽施工方案(3篇)
- 醫(yī)患關(guān)系主題腳本撰寫指南
- 甲方安全生產(chǎn)預(yù)案模板講解
- 新冠疫情期間護(hù)理資源調(diào)配
- 加氫裂化裝置技術(shù)問答
- 廣東省東莞市東華中學(xué)2023-2024學(xué)年數(shù)學(xué)九上期末考試試題含解析
- 關(guān)于安吉物流市場(chǎng)的調(diào)查報(bào)告
- 抑郁病診斷證明書
- 維克多高中英語3500詞匯
- 病理生理學(xué)復(fù)習(xí)重點(diǎn)縮印
- 第五屆全國輔導(dǎo)員職業(yè)能力大賽案例分析與談心談話試題(附答案)
- 《大數(shù)的認(rèn)識(shí)》復(fù)習(xí)教學(xué)設(shè)計(jì)
- GB/T 3513-2018硫化橡膠與單根鋼絲粘合力的測(cè)定抽出法
- GB/T 34590.3-2017道路車輛功能安全第3部分:概念階段
- 統(tǒng)編教材部編人教版小學(xué)語文習(xí)作單元教材解讀培訓(xùn)課件:統(tǒng)編小語四-六年級(jí)習(xí)作梳理解讀及教學(xué)建議
評(píng)論
0/150
提交評(píng)論