




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1,EJB3.0入門經(jīng)典,趙端陽 信息工程分院 ,2,關(guān)于開題報告答辯,請各位同學,根據(jù)答辯時老師的建議,認真修改三大件; 將修改結(jié)束以壓縮包的形式發(fā)給指導教師。,3,重點章節(jié),第2章 會話Bean (Session Bean) 第3章 實體Bean (Entity Bean) 第6章 Web服務(wù) (Web Service),4,題型,讀程序,寫結(jié)果; 編程; 寫操作步驟。,5,2.1.2 開發(fā)只實現(xiàn) Local 接口的無狀態(tài) Session Bean,開發(fā)只有 Local 接口的無狀態(tài)會話Session Bean,使用Local 注釋聲明接口是本地接口。 開發(fā)只
2、有 Remote 接口的無狀態(tài)會話Session Bean ,使用Remote 注釋聲明接口是遠程接口。 當Local 和Remote 注釋都不存在時,容器會將 Bean class 實現(xiàn)的接口默認為 Local 接口。如果 EJB 與客戶端 部署在同一個應(yīng)用服務(wù)器,采用 Local 接口訪問 EJB 優(yōu)于 Remote 接口。,6,業(yè)務(wù)接口:LocalHelloWorld.java,工程:LocalSessionBean,7,2.4 Stateful Session Bean開發(fā),在一些應(yīng)用場合中,有時我們需要每個用戶都有自己的一個實例,這個實例不受其他用戶影響。 購物車對象,每個用戶都應(yīng)有
3、自己的購物車,不希望有人往你的購物車里添加或拿掉商品,而有狀態(tài)Bean正好滿足你的這種需求。 每個有狀態(tài)Bean在bean實例的生命周期內(nèi)都只服務(wù)于一個用戶,bean class的成員變量可以在不同的方法調(diào)用間維護特定于某個用戶的數(shù)據(jù)。,8,2.4 Stateful Session Bean開發(fā),9,Bean 類:CartBean.java,10,有狀態(tài) Bean 的 JSP 客戶端代碼:StatefulBeanTest.jsp,先試圖從session中獲取購物車的存根。 如果當前session不存在購物車,就創(chuàng)建一個新的購物車放入session中。 后面每執(zhí)行一次頁面都會添加一個相同的商品。
4、,11,2.9 Session Bean的生命周期事件,PostConstruct:當bean對象完成實例化后會被立即調(diào)用,每個beanclass只能定義一個PostConstruct方法。這個注釋同時適用于有狀態(tài)和無狀態(tài)會話bean。 PreDestroy:標注了這個注釋的方法會在容器銷毀一個無用的或者過期的bean實例之前調(diào)用。這個注釋同時適用于有狀態(tài)和無狀態(tài)會話bean。 PrePassivate:當一個有狀態(tài)的bean實例空閑時間過長,就會發(fā)生鈍化(passivate)。標注了這個注釋的方法會在鈍化之前被調(diào)用。bean實例被鈍化后,在一段時間內(nèi),如果仍然沒有用戶對bean實例進行操作,
5、容器將會從硬盤中刪除它。以后,任何針對該bean方法的調(diào)用,容器都會拋出例外。這個注釋適用于有狀態(tài)會話bean。,12,2.9 Session Bean的生命周期事件,PostActivate:當客戶端再次使用已經(jīng)被鈍化的有狀態(tài)bean時,EJB容器會重新實例化一個Bean實例,并從硬盤中將之前的狀態(tài)恢復。標注了這個注釋的方法會在激活完成時被調(diào)用。這個注釋只適用于有狀態(tài)會話bean。 Init:這個注釋指定了有狀態(tài)bean初始化的方法。它區(qū)別于PostConstruct注釋在于:多個Init注釋方法可以同時存在于有狀態(tài)sessionbean中,但每個bean實例只會有一個Init注釋的方法會被
6、調(diào)用。PostConstruct在Init之后被調(diào)用。 Remove:當客戶端調(diào)用標注了Remove注釋的方法時,容器將在方法執(zhí)行結(jié)束后把bean實例刪除。,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類中的方法或是一個外部類。,17,2.10
7、 攔截器(Interceptor),Interceptors 注釋指定一個或多個在外部類中定義的攔截器,多個攔截器類之間用逗號分隔,如: Interceptors(A.class,B.class,C.class),如果只有一個攔截器可以省略大括號。,18,2.10 攔截器(Interceptor),AroundInvoke注釋指定了要用作攔截器的方法,攔截器方法與被攔截的業(yè)務(wù)方法執(zhí)行在同一個java調(diào)用堆棧、同一個事務(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),在實際應(yīng)用中,EJB可能會使用到其它EJB或資源。 在傳統(tǒng)的開發(fā)中,我們要使用某個類對象,可以通過new object的方式來使用它。 但在EJB中,不能這樣做,因為EJB實例的創(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 添加注冊項,該文件需放在 jar的 META-INF,24,Bean 類:InjectionBean.java,25,2.11.1 資源類型的注入,如何注入數(shù)據(jù)源? “DefaultMySqlDS”是數(shù)據(jù)源的局部 JNDI 名稱,只供 Jboss 容器內(nèi)
10、的應(yīng)用訪問。 查找該局部 JNDI 名稱時,需要帶有前綴“java:/”。,26,2.11.1 資源類型的注入,27,2.12 定時服務(wù)(Timer Service),定時服務(wù)可以用在stateless session bean和message-driven bean,當某個stateless session bean或message-driven bean的定時器啟動時,容器會從實例池中選擇bean的一個實例,然后調(diào)用其timeout回調(diào)方法。 可以使用Resource注釋注入定時服務(wù),或者使用容器對象SessionContext創(chuàng)建定時器。 下面例子在session bean中定義一個定時
11、器,每隔3秒鐘觸發(fā)一次事件,當定時事件觸發(fā)5次的時候便終止定時器的執(zhí)行。,28,2.12 定時服務(wù)(Timer Service),29,2.12 定時服務(wù)(Timer Service),當定時器創(chuàng)建完成后,我們還需要添加定時事件的回調(diào)方法?;卣{(diào)方法使用javax.ejb.Timeout注釋標注,必須返回void,并接受一個javax.ejb.Timer類型的參數(shù),回調(diào)方法聲明的格式: void XXX(Timer timer) 在定時事件發(fā)生時,此方法將被執(zhí)行。,30,JSP 客戶端代碼:TimerServiceTest.jsp,31,2.13 安全服務(wù)(Security service),使
12、用Java驗證和授權(quán)服務(wù)(Java Authentication Authorization Services JAAS)可以很好地解決上面的問題,可以用它來管理應(yīng)用程序的安全性。 驗證(Authentication)認證是完成用戶名和密碼的匹配校驗;其校驗的對象是試圖訪問受保護系統(tǒng)的用戶。在進行校驗時,應(yīng)用服務(wù)器會檢查用戶是否存在于系統(tǒng)之中,是否提供了憑證(通常指密碼)。 授權(quán)(authorization)用戶一旦通過了系統(tǒng)驗證,需要與系統(tǒng)進行某種形式的交互。授權(quán)就是決定用戶是否有權(quán)執(zhí)行某項操作的過程,授權(quán)是基于角色的。,32,2.13 安全服務(wù)(Security service),Jbos
13、s服務(wù)器提供了安全服務(wù)來進行用戶認證和根據(jù)用戶規(guī)則來限制對POJO的訪問。 對每一個POJO來說,可以使用SecurityDomain注釋為它指定一個安全域,安全域告訴容器到哪里去找密碼和用戶角色列表。 Plain Old Java Objects,簡單的Java對象,就是普通JavaBeans,是為了避免和EJB混淆所創(chuàng)造的簡稱。 JBoss中的other域指明要到classpath下尋找pertes和perties。 對每一個方法來說,我們可以使用一個安全限制注釋來指定誰可以運行這個方法,33,2.13 安全服務(wù)(Security service),本例
14、使用Jboss默認的安全域“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 進行定義(本例采用
15、的方法),指定我們使用的安全域是“other”, AnonymousUser節(jié)點指定允許匿名用戶訪問。 jboss.xml 必須 放進 Jar 文件的 META-INF 目錄。,36,2.13 安全服務(wù)(Security service),37,2.13 安全服務(wù)(Security service),第三步,為業(yè)務(wù)方法定義訪問角色(后臺)。 RolesAllowed 注釋指定允許訪問方法的角色列表,如果角色存在多個,可以用逗號分隔。 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ù)庫中。 我們需要自定義安全域,下面的例子定義了一個名為foshanshop的安全域,它采用數(shù)據(jù)庫存儲用戶名及角色。,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,第三章 實體 Bean(Entity Bean),Jboss 數(shù)據(jù)源的配置 單表映射的實體Bean 成員屬性映射 建議重載實體 Bean的 Equals()和 Hashcode()方法 映射的表名或列名與數(shù)據(jù)庫保留字同名時的處理 多表映射的實體Bean 持久化實體管理器 Entity Manager 關(guān)系/對象映射 JPQL 查詢,47,3.1 JBoss 數(shù)據(jù)
18、源的配置,數(shù)據(jù)源用于配置數(shù)據(jù)庫的連接信息,每個數(shù)據(jù)源必須指定一個唯一的JNDI名稱。應(yīng)用通過JNDI名稱找到數(shù)據(jù)源。 在Jboss中,有一個默認的數(shù)據(jù)源DefaultDS,它使用Jboss內(nèi)置的HSQLDB數(shù)據(jù)庫。 實際項目中,可能使用不同的數(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é)尾的文件時,會進行動態(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ū)動Jar拷貝到j(luò)boss安裝目錄/server/配置名/lib目錄,本書采用的配置名為default,因此需要把數(shù)據(jù)庫驅(qū)動拷貝到j(luò)boss安裝目錄/server/default/lib。完成拷貝后,必須重啟Jbos
20、s服務(wù)器。 本書使用的數(shù)據(jù)庫是mysql-5.0.22,其驅(qū)動為mysql-connector-java-3.1.13-bin.jar。,51,3.2 單表映射的實體 Bean,在本例子,該表由持久化驅(qū)動自動生成,不需要我們創(chuàng)建。,52,3.2 單表映射的實體 Bean,53,Session Bean 的業(yè)務(wù)接口,在EJB3.0,實體Bean并不直接與客戶端打交道。而是被Session bean或Message-Driven Bean使用。 定義一個Session Bean,在Session Bean中通過實體bean間接操作數(shù)據(jù)庫。,54,Session Bean的實現(xiàn),Database n
21、ame,55,Session Bean的實現(xiàn),Database name,em.find()方法用于查找特定主鍵的實體bean。,em.persist()方法用于保存實體bean,即插入一條記錄。,em.merge()方法用于更新或保存實體 當實體不存在時,執(zhí)行保存操作 當實體已經(jīng)存在時,執(zhí)行更新操作,em.remove()方法用于刪除實體,即刪除一條記錄。,em.createQuery()用于執(zhí)行JPQL語句。,56,JSP 客戶端代碼:EntityBeanTest.jsp,57,3.6 多表映射的實體Bean,如果實體的成員屬性映射的字段分布在多張表中,如何處理? 本例子的實體MainTa
22、ble具有四個成員屬性:id、name、address和postcode。 其中與id和name映射的字段在MainTable表,與address和postcode屬性映射的字段在Address表。 需要使用javax.persistence.SecondaryTable注釋和Column.table()屬性,58,3.6 多表映射的實體BeanMainTable.class,59,3.6 多表映射的實體Bean,60,3.6 多表映射的實體Bean,重載實體 equals() 方法,重載實體 hashCode()方法,重載實體 toString() 方法,61,3.6 多表映射的實體Bean
23、MultitableMappingDAO.java,實體Bean的使用者Session Bean,62,3.6 多表映射的實體BeanMultitableMappingDAOBean.class,63,3.6 多表映射的實體BeanMultitableMappingTest.jsp,64,3.6 多表映射的實體Bean,65,3.8 關(guān)系/對象映射,雙向一對多及多對一映射 單向一對多 單向多對一 雙向一對一映射 單向一對一 雙向多對多映射 單向多對多,66,3.8.1 雙向一對多及多對一映射,現(xiàn)實應(yīng)用中存在很多一對多的情況,如一項訂單中存在一個或多個訂購項。 當one方存在與many方關(guān)系的定
24、義,而many方同時也存在與one方關(guān)系的定義,這樣的關(guān)系被稱為雙向關(guān)系。 代碼上體現(xiàn)為在one方有一個集合屬性指向many方,而在many方也有一個屬性指向one方。,67,3.8.1 雙向一對多及多對一映射,雙向一對多關(guān)系,必須包含一個關(guān)系維護端。持久化規(guī)范要求多的一方為關(guān)系維護端(ownerside),一的一方為關(guān)系被維護端(inverseside)。 在one方的OneToMany注釋設(shè)置mappedBy屬性,以指定它是這一關(guān)聯(lián)中的被維護端,Many方是關(guān)系維護端。,68,3.8.1 雙向一對多及多對一映射,Order.java,69,3.8.1 雙向一對多及多對一映射,指明Order
25、與OrderItem關(guān)聯(lián)關(guān)系為一對多關(guān)系,70,3.8.1 雙向一對多及多對一映射,71,3.8.1 雙向一對多及多對一映射,OrderItem.java,變量定義,構(gòu)造函數(shù),72,3.8.1 雙向一對多及多對一映射,73,3.8.1 雙向一對多及多對一映射,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()屬性默認值是FetchType.EAGER。,optional()指定關(guān)聯(lián)方是否可以為空(null),該屬性值默認為true。 若將其設(shè)為false,則要求雙方必須存在。 我們不需要設(shè)置JoinColumn注釋的nullable()屬性。 通過EntityManager.find()、EntityManager.getReference()查詢OrderItem實體: 當optional=false時,OrderItem與Order關(guān)聯(lián)形式
27、為inner join, 當optional=true時,OrderItem與Order關(guān)聯(lián)形式為left join。,74,3.8.1 雙向一對多及多對一映射,SessionBean的業(yè)務(wù)接口:OrderDAO.java,75,3.8.1 雙向一對多及多對一映射,SessionBean的業(yè)務(wù)接口:OrderDAOBean.java,76,JSP 客戶端代碼:OneToManyTest.jsp,77,3.8.1 雙向一對多及多對一映射,OrderItem表,Order表,78,3.8.2 單向一對多,Order.java,79,3.8.2 單向一對多,OrderItem.java,80,3.8
28、.3 單向多對一,Order.java,81,3.8.3 單向多對一,指明Order與OrderItem關(guān)聯(lián)關(guān)系為一對多關(guān)系,Order.java,82,3.8.3 單向多對一,OrderItem.java,83,3.8.3 單向多對一,OrderItem.java 保持不變!,84,3.8.6 雙向多對多映射,實現(xiàn)生活中,一個學生有多個老師,一個老師有多個學生,他們具有明顯的多對多關(guān)系。 多對多映射采取中間表連接的映射策略,建立的中間表將分別引入兩邊的主鍵作為外鍵。 EJB3對于中間表的元數(shù)據(jù)提供了可配置的方式,用戶可以自定義中間表的表名、列名。,85,3.8.6 雙向多對多映射,Stude
29、nt.java,86,3.8.6 雙向多對多映射,Student.java,在雙向ManyToMany關(guān)聯(lián)中,必須包含有一個關(guān)系維護端。 在Student的ManyToMany注釋中指定mappedBy()屬性,將其標識為關(guān)系被維護端,自然Teacher就成了關(guān)系維護端。,ManyToMany注釋指定Student是多對多關(guān)系的一端,mappedBy屬性指定Student為雙向關(guān)系的被維護端(inverse side),指出該關(guān)系映射信息是在被關(guān)聯(lián)實體Teacher的成員屬性students上定義的。,87,3.8.6 雙向多對多映射,Teacher.java,88,3.8.6 雙向多對多映射
30、,Teacher.java,89,3.8.6 雙向多對多映射,TeacherDAO.java,90,3.8.6 雙向多對多映射,TeacherDAOBean.java,91,3.8.6 雙向多對多映射,TeacherDAOBean.java,92,3.8.6 雙向多對多映射,ManyToManyTest.jsp,93,3.8.7 單向多對多,Teacher.java,94,3.8.7 單向多對多,Teacher.java,95,3.8.7 單向多對多,Student.java,96,3.8.7 單向多對多,Student.java,97,3.9 JPQL查詢,命名參數(shù)查詢 位置參數(shù)查詢 Dat
31、e參數(shù) 一個JPQL查詢例子 命名查詢 排序(order by) 查詢部分屬性 查詢中使用構(gòu)造器(Constructor) 聚合查詢(Aggregation) 關(guān)聯(lián)(join) 排除相同的記錄DISTINCT 比較Entity 批量更新(Batch Update) 批量刪除(Batch Remove),邏輯非運算符NOT 使用操作符BETWEEN 使用操作符IN 使用操作符LIKE 使用操作符IS NULL 使用操作符IS EMPTY 字符串函數(shù) 日期和時間函數(shù) 數(shù)學函數(shù) Member of 子查詢 EXISTS All, ANY, SOME 結(jié)果集分頁,98,實例數(shù)據(jù)庫,Person表,Or
32、der表,OrderItem表,99,(1) 命名參數(shù)查詢,命名參數(shù)的格式為冒號加上參數(shù)名:“:+參數(shù)名”,100,(2) 位置參數(shù)查詢,位置參數(shù)的格式為問號加上位置編號:“?+位置編號”,101,(3) Date參數(shù),如果需要將 java.util.Date 或 java.util.Calendar 作為參數(shù)傳進一個參數(shù)查詢,使用對應(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) 命名查詢,你可以在實體bean上定義一個或多個查詢語句,這樣可以減少每次因書寫錯誤而引起的BUG。 實際應(yīng)用中,一般把經(jīng)常使用的查詢語句定義成命名查詢。,113,(5) 命名查詢,如果需要定義多個命名查詢,可以使用javax.persistence.NamedQueries注釋。 在該注釋里面,可以放置多個NamedQuery注釋:,114,(6) 排
34、序(order by),ASC和DESC分別為升序和降序,如果不顯式指定,JPQL默認使用ASC升序。(QueryDAOBean.java),115,(7) 查詢部分屬性(QueryDAOBean.java),在前面的例子中,都是針對實體的查詢,返回的結(jié)果也是實體類型。JPQL允許查詢返回我們需要的成員屬性。在一些實體成員屬性比較多的情況,這樣的查詢可以提高性能。,116,(8) 查詢中使用構(gòu)造器(Constructor),JPQL支持將查詢的結(jié)果直接作為一個Java類的構(gòu)造器參數(shù),并產(chǎn)生類對象作為結(jié)果返回。,117,(8) 查詢中使用構(gòu)造器(Constructor),將查詢的屬性結(jié)果直接作為
35、 SimplePerson 的構(gòu)造器參數(shù)。,118,(9) 聚合查詢(Aggregation),像大部分的SQL一樣,JPQL也支持查詢中的聚合函數(shù): AVG()求平均數(shù),返回值類型為Double; SUM()求和,返回值類型為被求值的成員屬性所對應(yīng)的類型; COUNT()統(tǒng)計,返回類型為Long,注意count(*)語法并不屬于JPA規(guī)范,它在hibernate中可用; MAX()求最大值,返回值類型為被求值的成員屬性所對應(yīng)的類型??捎糜诨緮?shù)據(jù)類型,字符串及可序列化對象; MIN()求最小值,返回值類型為被求值的成員屬性所對應(yīng)的類型??捎糜诨緮?shù)據(jù)類型,字符串及可序列化對象。 聚合函數(shù)在統(tǒng)
36、計時,會忽略掉帶null值的記錄。 如果查詢的集合為空(即沒有記錄),count()在處理時會返回0,而AVG()、SUM()、MAX()、MIN()返回null值。,119,(9) 聚合查詢(Aggregation),120,(9) 聚合查詢(Aggregation),和SQL一樣,如果聚合函數(shù)不是select.from的唯一一個返回列,需要使用GROUPBY語句。,121,/去掉相同的編號,(10)關(guān)聯(lián)(join),left out join/left join等,都是允許右邊表達式的實體為空。,122,(10)關(guān)聯(lián)(join),inner join 要求右邊表達式的實體必須存在。,123
37、,(10)關(guān)聯(lián)(join),left/left out/inner join fetch 提供了一種靈活的查詢加載方式來提高查詢的性能。 在默認的查詢中,實體的延遲屬性不會被加載。,當應(yīng)用需要時,EJB3 Runtime才會執(zhí)行一條SQL語句來加載屬于當前Order的OrderItems。 使用了fetch,這個查詢只會產(chǎn)生一條 SQL 語句。,124,(11) 排除相同的記錄Distinct,使用關(guān)聯(lián)查詢,我們很經(jīng)常得到重復的對象,如下面語句: select o from Order o inner join fetch o.orderItems order by o.orderid 如果一
38、個Order有多個orderItem,返回的結(jié)果就會有多個相同的Order,需要使用Distinct關(guān)鍵字排除相同的對象。 Distinct 操作符還可以與任何聚合函數(shù)結(jié)合使用,首先去掉重復值,然后再統(tǒng)計。,125,(12) 比較Entity,在使用參數(shù)查詢時,參數(shù)類型除了String、原始數(shù)據(jù)類型(int, double等)和它們的對象類型(Integer, Double等),也可以是實體對象。,126,(13)批量更新(Batch Update),Order表(修改前),127,(14) 批量刪除(Batch Remove),128,(15) 邏輯非運算符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) 將一個字符串string轉(zhuǎn)換成小寫形式。 UPPER(string) 將一個字符串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ù)有一個可選的起始位置start。,135,(21) 字符串函數(shù),136,(23) 數(shù)學函數(shù),ABS (arithmetic expression) 返回算術(shù)表達式的絕對值。 SQRT
41、 (arithmetic expression) 求算術(shù)表達式的方根,返回一個Double。 MOD (arithmetic expression 1, arithmetic expression 2) 求參數(shù)1與參數(shù)2的模,返回一個整數(shù)。 SIZE (collection-valued path-expression) 計算一個集合中元素的數(shù)量,并返回一個整數(shù)。 如果集合為空,返回0。,137,(23) 數(shù)學函數(shù),138,(24) Member of,Member of操作符用于判斷實體是否是集合中的一員。,139,(25) 子查詢,子查詢可以用于WHERE和HAVING條件語句中。,140
42、,(26) EXISTS,EXISTS需要和子查詢配合使用,用來判斷子查詢是否存在記錄。,141,(26) EXISTS,EXISTS需要和子查詢配合使用,用來判斷子查詢是否存在記錄。,142,(27) All, ANY, SOME,當子查詢返回多條記錄時,你可以使用表達式ALL、ANY和SOME對結(jié)果做進一步限定。,143,(28) 結(jié)果集分頁,有些時候執(zhí)行一個查詢會返回成千上萬條記錄,事實上我們只需要顯示其中一部分數(shù)據(jù),這時我們需要對結(jié)果集進行分頁。 QueryAPI有兩個接口方法可以解決這個問題: setMaxResults方法設(shè)置獲取多少條記錄 setFirstResult方法設(shè)置從結(jié)
43、果集中的那個索引開始獲?。ㄋ饕龔?開始),144,(28) 結(jié)果集分頁,JSP 客戶端調(diào)用代碼片斷,設(shè)置每頁記錄數(shù)為2,如果數(shù)據(jù)庫中存在7條記錄,第一頁顯示的記錄索引應(yīng)為(0,1),第二頁為(2,3),第三頁為(3,4).等。 在分頁中,為了顯示數(shù)據(jù)有序,建議在查詢中進行排序。,145,3.10 調(diào)用存儲過程,調(diào)用無返回值的存儲過程 調(diào)用返回單值的存儲過程 調(diào)用返回表全部列的存儲過程 調(diào)用返回部分列的存儲過程,146,1、調(diào)用無返回值的存儲過程,存儲過程,147,2、調(diào)用返回單值的存儲過程,有一個INTEGER類型的輸入?yún)?shù),148,2、調(diào)用返回單值的存儲過程,如果程序或線程總是對同樣的輸入?yún)?/p>
44、數(shù)產(chǎn)生同樣的結(jié)果,則被認為它是“確定的”,否則就是“非確定”的。如果既沒有給定DETERMINISTIC也沒有給定NOT DETERMINISTIC,默認的就是NOT DETERMINISTIC。 SQL SECURITY特征可以用來指定子程序該用創(chuàng)建子程序者的許可來執(zhí)行,還是使用調(diào)用者的許可來執(zhí)行。默認值是DEFINER。 COMMENT子句是一個MySQL的擴展,它可以被用來描述存儲程序。,149,3、調(diào)用返回表全部列的存儲過程,讓EJB3 Persistence運行環(huán)境將列值直接填充入實體對象(本例填充進Person對象),返回結(jié)果為實體類型的List。,150,4、調(diào)用返回部分列的存儲
45、過程,151,3.11復合主鍵(Composite Primary Key),當需要使用多個屬性變量(多列)聯(lián)合起來作為主鍵,需要使用復合主鍵。復合主鍵要求我們編寫一個復合主鍵類( Composite Primary Key Class )。 復合主鍵類需要符合以下一些要求: 復合主鍵類必須是public和具備一個沒有參數(shù)的構(gòu)造函數(shù); 復合主鍵類的每個屬性變量必須有g(shù)etter/setter。如果沒有,每個屬性變量則必須是public或者protected; 復合主鍵類必須實現(xiàn)java.io.serializable; 復合主鍵類必須實現(xiàn)equals()和hashcode()方法; 復合主鍵類
46、中的主鍵屬性變量的名字必須和對應(yīng)的Entity中主鍵屬性變量的名字相同。,152,示例:一條航線是由出發(fā)地和到達地決定的,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ī)范,可以跨平臺及語言。 EJB屬于java平臺的規(guī)范,盡管理論上可以跨平臺,但實現(xiàn)起來比較復雜,所以其應(yīng)用范圍局限在java平臺。 看上去兩者好像是互相競爭的關(guān)系,其實不是。 它們兩者的偏重點不一樣,Web服務(wù)偏重的是這個系統(tǒng)對外提供什么功能,而EJB偏重的是如何用一個個組件組裝這些功能。 就好比一個硬盤,它對外提供的是存儲服務(wù),這是web服務(wù)的關(guān)注點。對于怎樣組裝這個硬盤,怎樣構(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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲行業(yè)廚房夏季防暑降溫措施細則他
- 職場人士高效讀書計劃
- 資產(chǎn)評估數(shù)據(jù)管理質(zhì)量保證措施
- 消防工程施工日志空白范文
- 河北衡中同卷2025年物理高二第二學期期末預測試題含解析
- 信息技術(shù)應(yīng)用能力提升工程2.0軟件開發(fā)人員研修計劃
- 汽車行業(yè)質(zhì)量管理體系與措施
- 教科版二年級上冊英語教學計劃
- 路面裂縫分割算法研究
- 金融機構(gòu)合規(guī)委員會組織機構(gòu)及職責
- 預開票管理制度
- 中鐵四局分包勞務(wù)合同樣本
- T-NAASS 114-2024 安格斯牛生產(chǎn)性能測定技術(shù)規(guī)程
- 補牙操作流程課件
- 商丘市寧陵縣2025年五年級數(shù)學第二學期期末達標檢測試題含答案
- 2025年電信協(xié)優(yōu)(含LTE、5G)資格認證考試題庫附含答案
- 2025年江蘇省徐州中考練習卷(1)英語試題(含答案)
- 公司加農(nóng)戶種植協(xié)議書范本
- 2025年離婚協(xié)議書模板一個小孩
- 教育機構(gòu)突發(fā)事件處理流程
- 輕鋼結(jié)構(gòu)屋面施工方案
評論
0/150
提交評論