基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù)-課堂.ppt_第1頁
基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù)-課堂.ppt_第2頁
基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù)-課堂.ppt_第3頁
基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù)-課堂.ppt_第4頁
基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù)-課堂.ppt_第5頁
已閱讀5頁,還剩192頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),濟(jì)南大學(xué)信息學(xué)院 劉鹍 ,第2講 基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),第2章 基于Java EE開發(fā)環(huán)境的構(gòu)建 第3章 Struts2應(yīng)用 第4章 Hibernate應(yīng)用 第5章 Spring應(yīng)用 第6章 Struts2、Hibernate和Spring整合應(yīng)用,第2講 基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),Servlet Servlet是Java語言的CGI實(shí)現(xiàn),與傳統(tǒng)的CGI和許多其他類似CGI的技術(shù)相比,Java Servlet具有更高的效率,更容易使用,功能更強(qiáng)大,具有更好的可移植性。 高效: 傳統(tǒng)的CGI程序以進(jìn)程方式運(yùn)行,而Servlet以線程方式運(yùn)行。

2、方便: Servlet提供了大量的實(shí)用工具例程,例如自動(dòng)地解析和解碼HTML表 單數(shù)據(jù)、讀取和設(shè)置HTTP頭、處理Cookie、跟蹤會(huì)話狀態(tài)等。 功能強(qiáng)大:可以完成很多傳統(tǒng)的CGI程序很難做到的事情。 可移植性好:Servlet API具有完善的標(biāo)準(zhǔn)。,Web服務(wù)器,doGet()方法,doPost()方法,HTTP GET請(qǐng)求,HTTP POST請(qǐng)求,響應(yīng),響應(yīng),客戶機(jī),第2講 基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),JSP JSP(Java Server Pages)是由Sun Microsystems公司倡導(dǎo)、許多公司參與一起建立的一種動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)有點(diǎn)類似ASP技術(shù),它是在

3、傳統(tǒng)的網(wǎng)頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標(biāo)記(tag),從而形成JSP文件(*.jsp)。 用JSP開發(fā)的Web應(yīng)用是跨平臺(tái)的,既能在Linux下運(yùn)行,也能在其他操作系統(tǒng)上運(yùn)行。 JSP采用的是動(dòng)態(tài)代碼與靜態(tài)HTML頁面相結(jié)合的方式,JSP的語法內(nèi)容放入在以“%”開始,以“%”結(jié)束的特殊標(biāo)記之內(nèi)。 JSP頁面文件通常以.jsp為擴(kuò)展名。雖然從代碼編寫來看,JSP頁面更象普通Web頁面而不象Servlet,但實(shí)際上,JSP最終會(huì)被轉(zhuǎn)換成正規(guī)的Servlet,靜態(tài)HTML直接輸出到和Servlet service方法關(guān)聯(lián)的輸出流。,第2講

4、 基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),Struts 2框架 Struts是開源軟件。使用Struts的目的是為了幫助我們減少在運(yùn)用MVC設(shè)計(jì)模型來開發(fā)Web應(yīng)用的時(shí)間。 Struts框架具有組件的模塊化、靈活性和重用性的優(yōu)點(diǎn),同時(shí)也簡(jiǎn)化了基于MVC的Web應(yīng)用程序的開發(fā)。 從應(yīng)用的角度來說,Struts有三大塊,分別是Struts核心類、Struts配置文件及Struts標(biāo)簽庫。,Hibernate框架 傳統(tǒng)的Java應(yīng)用都是采用JDBC來訪問數(shù)據(jù)庫,它是一種基于SQL的操作方式,但對(duì)目前的Java EE信息化系統(tǒng)而言,通常采用面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計(jì)的過程。系統(tǒng)從需求分析到系統(tǒng)設(shè)計(jì)都是按

5、面向?qū)ο蠓绞竭M(jìn)行,但是到詳細(xì)的數(shù)據(jù)訪問設(shè)計(jì)階段,又回到了傳統(tǒng)的JDBC訪問數(shù)據(jù)庫的老路上來。 Hibernate的問世解決了這個(gè)問題,Hibernate是一個(gè)面向Java環(huán)境的對(duì)象/關(guān)系映射工具,它用來把對(duì)象模型表示的對(duì)象映射到基于SQL的關(guān)系數(shù)據(jù)模型中去,這樣就不用再為怎樣用面向?qū)ο蟮姆椒ㄟM(jìn)行數(shù)據(jù)的持久化而大傷腦筋了。,第2講 基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),第2講 基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),Spring框架 Spring框架是Rod Johnson開發(fā)的,2003年發(fā)布了Spring框架的第一個(gè)版本。Spring是一個(gè)從實(shí)際開發(fā)中抽取出來的框架,因此它完成了大量開發(fā)中的通

6、用步驟,從而大大提高了企業(yè)應(yīng)用的開發(fā)效率。 Spring為企業(yè)應(yīng)用的開發(fā)提供了一個(gè)輕量級(jí)的解決方案。其中依賴注入、基于AOP的聲明式事務(wù)管理、多種持久層的整合與優(yōu)秀的Web MVC框架等最為人們關(guān)注。Spring可以貫穿程序的各個(gè)層之間,但它并不是想取代那些已有的框架,而是以高度的開放性和它們緊密的整合。這也是Spring被廣泛應(yīng)用的原因之一。,第2講 基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),JSP+Servlet+JavaBean實(shí)現(xiàn)MVC,JSP,JSP,JSP,Servlet,JavaBean,EJB,Web服務(wù),視圖,控制器,模型,JDBC,DataBase,第2講 基于開源框架的企業(yè)級(jí)

7、信息系統(tǒng)開發(fā)技術(shù),Struts2、Spring和Hibernate框架,第2講 基于開源框架的企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),Struts2、Spring和Hibernate框架,IService,jsp,command,IDomain,IDao,資源層,發(fā)出請(qǐng)求,viewbean,databean,databean,service實(shí)現(xiàn)類,domain實(shí)現(xiàn)類,組織數(shù)據(jù),在頁面顯示,dao實(shí)現(xiàn)類,Spring框架,Struts框架,Hibernate框架,第2章 Java EE開發(fā)環(huán)境的構(gòu)建,JSP和Servlet例子,JSP和Servlet例子,JSP JSP(Java Server Pages)是由

8、Sun Microsystems公司倡導(dǎo)、許多公司參與一起建立的一種動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)有點(diǎn)類似ASP技術(shù),它是在傳統(tǒng)的網(wǎng)頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標(biāo)記(tag),從而形成JSP文件(*.jsp)。 用JSP開發(fā)的Web應(yīng)用是跨平臺(tái)的,既能在Linux下運(yùn)行,也能在其他操作系統(tǒng)上運(yùn)行。 簡(jiǎn)單的說JSP就是: HTML文件中嵌入Java程序段和JSP標(biāo)記 擴(kuò)展名是*.jsp,JSP和Servlet例子,看個(gè)JSP的例子計(jì)算圓面積: 新建Web Project,項(xiàng)目名稱:test 輸入半徑的頁面input.jsp(WebRo

9、ot文件夾下):, 請(qǐng)輸入半徑r: ,JSP和Servlet例子,看個(gè)例子計(jì)算圓面積: 計(jì)算圓面積的頁面result.jsp:, ,JSP和Servlet例子,看個(gè)例子計(jì)算圓面積: 發(fā)布 啟動(dòng)Tomcat服務(wù)器,在IE瀏覽器中輸入“http:/localhost:8080/test/input.jsp”,系統(tǒng)會(huì)顯示input.jsp頁面,如圖2.1所示。當(dāng)在文本框中輸入10后,單擊【計(jì)算】按鈕會(huì)跳轉(zhuǎn)到另外一個(gè)頁面,也就是result.jsp頁面,并且輸出結(jié)果314.0,如圖2.2所示。,圖2.1 input.jsp頁面圖2.2 result.jsp頁面,JSP和Servlet例子,Servle

10、t Servlet是一種服務(wù)器端的Java應(yīng)用程序,具有獨(dú)立于平臺(tái)和協(xié)議的特性,可以生成動(dòng)態(tài)的Web頁面。 它擔(dān)當(dāng)客戶請(qǐng)求(Web瀏覽器或其他HTTP客戶程序)與服務(wù)器響應(yīng)(HTTP服務(wù)器上的數(shù)據(jù)庫或應(yīng)用程序)的中間層。 Servlet是位于Web 服務(wù)器內(nèi)部的服務(wù)器端的Java應(yīng)用程序,與傳統(tǒng)的從命令行啟動(dòng)的Java應(yīng)用程序不同,Servlet由Web服務(wù)器進(jìn)行加載,該Web服務(wù)器必須包含支持Servlet的Java虛擬機(jī)。 簡(jiǎn)單的理解: Servlet是Java類 Servlet可以接收客戶請(qǐng)求request Servlet可以給客戶響應(yīng)response Servlet在服務(wù)器端加載 Se

11、rvlet運(yùn)行在Servlet容器中,JSP和Servlet例子,看個(gè)Servlet的例子:計(jì)算圓面積 新建Web Project:項(xiàng)目名稱:servlet 新建Servlet類(繼承HttpServlet類):Servlet.java,package .ujn.servletdemo; /省略import public class Servlet extends HttpServlet Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletExc

12、eption, IOException resp.setCharacterEncoding(GBK); PrintWriter pw=resp.getWriter(); double radius = Double.valueOf(req.getParameter(radius); pw.println(圓的面積是:+radius*radius*3.14); Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException re

13、sp.setCharacterEncoding(GBK); PrintWriter pw=resp.getWriter(); double radius = Double.valueOf(req.getParameter(radius); pw.println(圓的面積是get:+radius*radius*3.14); ,JSP和Servlet例子,看個(gè)Servlet的例子:計(jì)算圓面積 編輯web.xml,增加該Servlet的配置:, servletdemo .ujn.servletdemo.Servlet servletdemo /servlet ,JSP和Servlet例子

14、,看個(gè)Servlet的例子:計(jì)算圓面積 新建JSP頁面:inputservlet.jsp 發(fā)布 測(cè)試POST方式,在瀏覽器中輸入:http:/localhost:8080/servlet/inputservlet.jsp 測(cè)試GET方式,在瀏覽器中輸入:http:/localhost:8080/servlet/servlet?radius=18, 請(qǐng)輸入半徑r: ,JSP和Servlet例子,JSP數(shù)據(jù)定義: JSP程序塊: JSP表達(dá)式 JSP指令 page指令:設(shè)定整個(gè)JSP文件的屬性和相關(guān)功能 include指令:導(dǎo)入包含靜態(tài)的文件(JSP、HTML) taglib指令:標(biāo)簽引用(Str

15、uts2中會(huì)用到),21,JSP和Servlet例子,JSP動(dòng)作 賦值: 向一個(gè)對(duì)象提出請(qǐng)求 尋找或者實(shí)例化一個(gè)JavaBean 設(shè)置JavaBean的屬性 輸出某個(gè)JavaBean的屬性 把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁面 根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標(biāo)記 JSP注釋 輸出注釋: 隱藏注釋: 該注釋不發(fā)送給用戶,JSP和Servlet例子,JSP內(nèi)置對(duì)象,JSP和Servlet例子,Servlet主要接口和類 Servlet接口(實(shí)現(xiàn)init、service、destroy方法) GenericServlet類(覆寫service方法) HttpServlet類(覆寫doPo

16、st或doGet方法) HttpServletRequest和HttpServletResponse接口 Servlet生命周期 當(dāng)Servlet被裝載到容器后,生命周期開始。 首先調(diào)用init()方法進(jìn)行初始化。 初始化后,調(diào)用service()方法,根據(jù)請(qǐng)求的不同調(diào)用不同的doXxx()方法處理客戶請(qǐng)求,并將處理結(jié)果封裝到HttpServletResponse中返回給客戶端。 當(dāng)Servlet實(shí)例從容器中移除時(shí)調(diào)用其destroy()方法,這就是Servlet運(yùn)行的整個(gè)過程。,思考:MVC模式,怎樣應(yīng)用MVC模式?, MVC 用戶登錄 登錄名: 密碼: , login 登錄成功! 登錄失敗

17、! 數(shù)據(jù)庫操作失敗,請(qǐng)聯(lián)系管理員。 ,login.jsp,loginok.jsp,思考:MVC模式,JSP+Servlet+JavaBean實(shí)現(xiàn)MVC模式 抽取表示層(JSP) 抽取“領(lǐng)域?qū)ο蟆?實(shí)現(xiàn)“控制層”Servlet 抽取業(yè)務(wù)邏輯層接口 實(shí)現(xiàn)業(yè)務(wù)邏輯層 實(shí)現(xiàn)其他業(yè)務(wù)邏輯層(數(shù)據(jù)庫連接),思考:MVC模式,login.jsp,成功頁面,失敗頁面, String username = request.getParameter(username); String pwd = request.getParameter(pwd); Dlb dl = new Dlb(); dl.setXh(use

18、rname); dl.setKl(pwd); ICheckLoginDomain dlDomain = new CheckLoginDomainImpl(); if(dlDomain.checkLogin(dl) response.sendRedirect(./secondloginok.jsp); else response.sendRedirect(./secondloginfalse.jsp); ,web.xml,LoginServlet,ICheckLoginDomain接口, public boolean checkLogin(Dlb dl) try DBConn conn = ne

19、w DBConn(); String sql = select * from dlb where ; ResultSet rs = conn.executeQuery(sql); if(rs.next() return true; else return false; catch (SQLException e) return false; , private String id; private String xh; private String kl; ,Dlb.java,CheckLoginDomainImpl.java, Class.forName DriverManager.getC

20、onnection createStatement executeQuery ,DBConn.java,思考:MVC模式,MVC模式?jīng)]有給出代碼結(jié)構(gòu)性的具體要求 MVC的控制器是做一個(gè)Servlet,還是多個(gè)Servlet? 跳轉(zhuǎn)頁面的名稱是寫在代碼中還是配置文件中?,企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),濟(jì)南大學(xué)信息學(xué)院 劉鹍 ,JSP+Servlet+JavaBean,JSP+Servlet+JavaBean實(shí)現(xiàn)MVC,請(qǐng)求,FORM,POST GET,request,JSP,Servlet,JavaBean,DB,request,object,object,list,getParameter 實(shí)例化對(duì)

21、象 調(diào)用JavaBean,JDBC 數(shù)據(jù)庫 增刪改查 ,返回結(jié)果 setParameter setAttribute,顯示數(shù)據(jù),session,session,第3章 Struts2應(yīng)用,3.1 Struts 2概述 3.2 Struts 2基本應(yīng)用及工作流程,3.1 Struts 2概述,Struts 2與Struts 1 Webwork + Struts 1 = Struts 2,3.1 Struts 2概述,3.1.1 MVC簡(jiǎn)介 MVC有以下優(yōu)點(diǎn): 多個(gè)視圖可以對(duì)應(yīng)一個(gè)模型。 模型返回的數(shù)據(jù)與顯示邏輯分離。 應(yīng)用被分隔為三層,降低了各層之間的耦合,提供了應(yīng)用的可擴(kuò)展性。 控制層的概念也

22、很有效,由于它把不同的模型和不同的視圖組合在一起,完成不同的請(qǐng)求,因此控制層可以說是包含了用戶請(qǐng)求權(quán)限的概念。 MVC更符合軟件工程化管理的精神。不同的層各司其職,每一層的組件具有相同的特征,有利于通過工程化和工具化產(chǎn)生管理程序代碼。,回顧:JSP+Servlet實(shí)現(xiàn)MVC模式,login.jsp,成功頁面,失敗頁面, String username = request.getParameter(username); String pwd = request.getParameter(pwd); Dlb dl = new Dlb(); dl.setXh(username); dl.setKl(

23、pwd); ICheckLoginDomain dlDomain = new CheckLoginDomainImpl(); if(dlDomain.checkLogin(dl) response.sendRedirect(./secondloginok.jsp); else response.sendRedirect(./secondloginfalse.jsp); ,web.xml,LoginServlet,ICheckLoginDomain接口, public boolean checkLogin(Dlb dl) try DBConn conn = new DBConn(); Strin

24、g sql = select * from dlb where ; ResultSet rs = conn.executeQuery(sql); if(rs.next() return true; else return false; catch (SQLException e) return false; , private String id; private String xh; private String kl; ,Dlb.java,CheckLoginDomainImpl.java, Class.forName DriverManager.getConnection createS

25、tatement executeQuery ,DBConn.java,3.1.2 Struts 2體系結(jié)構(gòu),Struts2的MVC原理,3.1.2 Struts 2體系結(jié)構(gòu),3.1.2 Struts 2體系結(jié)構(gòu),Struts 2框架的應(yīng)用著重在控制上。 簡(jiǎn)單的流程是:頁面控制器頁面。 最重要的是控制器的取數(shù)據(jù)與處理后傳數(shù)據(jù)的問題。 Struts 2的體系結(jié)構(gòu)還可以參考圖3.1,更直觀地展現(xiàn)出其流程。,圖3.1 Struts 2體系結(jié)構(gòu),第3章 Struts2應(yīng)用,3.1 Struts 2概述 3.2 Struts 2基本應(yīng)用及工作流程,3.2.1 簡(jiǎn)單Struts 2實(shí)例開發(fā),Struts2開

26、發(fā)步驟: 添加Struts2開發(fā)能力 添加類庫 添加配置文件 添加過濾器 開發(fā)JSP頁面 開發(fā)Action類 配置Actioin類 設(shè)置校驗(yàn)器 開發(fā)攔截器 國(guó)際化應(yīng)用,3.2.1 簡(jiǎn)單Struts 2實(shí)例開發(fā),hello.jsp ,web.xml filter,StrutsAction.java public String execute() return “success”; ,ok.jsp,3.2.1 簡(jiǎn)單Struts 2實(shí)例開發(fā),小結(jié):Struts2的開發(fā)步驟 新建Web項(xiàng)目 導(dǎo)入類庫(5個(gè)jar) 修改web.xml(配置過濾器) 新建struts.xml 新建JSP 新建Action

27、類 修改struts.xml (package、action、result),3.2.2 Struts 2工作流程及各種文件詳解,1. Struts 2的工作流程 Web瀏覽器請(qǐng)求一個(gè)資源。 過濾器Dispatcher查找請(qǐng)求,確定適當(dāng)?shù)腁ction。 攔截器自動(dòng)對(duì)請(qǐng)求應(yīng)用通用功能,如驗(yàn)證和文件上傳等操作。 Action的execute方法通常用來存儲(chǔ)和(或)重新獲得信息(通過數(shù)據(jù)庫)。 結(jié)果被返回到瀏覽器??赡苁荋TML、圖片、PDF或其他。,3.2.2 Struts 2工作流程及各種文件詳解,web.xml filter Filter-mapping struts.xml package:

28、 action: result: ActionSupport Struts2中Action與容器是完全解耦(不繼承類、不實(shí)現(xiàn)接口) 繼承ActionSupport,降低工作難度,充分利用Struts2提供的功能。, struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* ,/welcome.jsp,Struts 2數(shù)據(jù)驗(yàn)證有兩種實(shí)現(xiàn)方式: Action類中validate方法 繼承ActionSupport 覆寫validate方法(或者新建命名規(guī)則為validata*的方法) 增加“input”的result JSP

29、頁面中用標(biāo)簽 驗(yàn)證框架(xml) 位置:與Action類同一路徑下 命名: -validation.xml -validation.xml 校驗(yàn)器:conversion validator 、date validator 、double validator 、email validator 、expression validator 、fieldexpression validator 、int validator 、regex validator 、required validator 、requiredstring validator 、stringlength validator 、ur

30、l validator 、visitor validator,3.2.3 Struts 2數(shù)據(jù)驗(yàn)證及驗(yàn)證框架的應(yīng)用,補(bǔ)充:在Action中訪問Web對(duì)象,在Action中訪問Web對(duì)象 通過ActionContext訪問 直接訪問Web對(duì)象,public static ActionContext getContext():獲得ActionContext 對(duì)象。 public Map getParameters():從請(qǐng)求對(duì)象(HttpServletRequest)中獲取請(qǐng)求參數(shù)。 public Map getApplication():獲取ServletContext中保存的Attribute

31、。 public Map getSession():獲取HttpSession中保存的Attribute。,Struts2框架提供org.apache.struts2.ServletActionContext輔助類來獲得web對(duì)象。 HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = request.getSession(); ServletC

32、ontext application = ServletActionContext.getServletContext();,擴(kuò)充:多方法Action的配置,多方法Action的配置及調(diào)用方法有如下幾種: 1為Action配置method屬性 2動(dòng)態(tài)方法調(diào)用 動(dòng)態(tài)方法調(diào)用是指采用如下格式調(diào)用Action中對(duì)應(yīng)的方法: 用這種方式需要先開啟一個(gè)開關(guān)(struts.xml) 3. 使用通配符映射方式 在struts.xml文件中配置action元素時(shí),它的name、class、method屬性都可支持通配符,這種通配符的方式是另一種形式的動(dòng)態(tài)方法調(diào)用。,控制名!方法名.action, ,回顧:St

33、ruts 2應(yīng)用,Struts 2開發(fā)流程: 2個(gè)XML+Action類+JSP頁面+JavaBean 校驗(yàn)器: validate方法或者XML校驗(yàn)器 注意:命名+位置,企業(yè)級(jí)信息系統(tǒng)開發(fā)技術(shù),濟(jì)南大學(xué)信息學(xué)院 劉鹍 ,補(bǔ)充:Struts 2配置,Struts2中配置: struts.xml中constant參數(shù)配置: 動(dòng)態(tài)加載struts.xml:,第4章 Hibernate應(yīng)用,4.1 Hibernate概述,1. ORM簡(jiǎn)介 對(duì)象/關(guān)系映射ORM(Object-Relation Mapping) 對(duì)象與對(duì)象之間的關(guān)系對(duì)應(yīng)到數(shù)據(jù)庫表與表之間的關(guān)系的一種模式。 簡(jiǎn)單地說,ORM是通過使用描述

34、對(duì)象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將Java程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫中。 對(duì)象和關(guān)系數(shù)據(jù)是業(yè)務(wù)實(shí)現(xiàn)的兩種表現(xiàn)形式,業(yè)務(wù)實(shí)體在內(nèi)存中表現(xiàn)為對(duì)象,在數(shù)據(jù)庫中表現(xiàn)為關(guān)系數(shù)據(jù)。內(nèi)存中的對(duì)象之間存在著關(guān)聯(lián)和繼承關(guān)系。而在數(shù)據(jù)庫中,關(guān)系數(shù)據(jù)無法直接表達(dá)多對(duì)多關(guān)聯(lián)和繼承關(guān)系。因此,ORM系統(tǒng)一般以中間件的形式存在,主要實(shí)現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫數(shù)據(jù)的映射。,4.1 Hibernate概述,2. Hibernate體系結(jié)構(gòu) Hibernate作為模型層/數(shù)據(jù)訪問層。 配置文件(hibernate.cfg.xml或perties) 映射文件(*.hbm.xml) POJO類,圖4.

35、1 Hibernate體系結(jié)構(gòu),把Java對(duì)象或持久化對(duì)象(Persistent Object,PO)映射到數(shù)據(jù)庫中的數(shù)據(jù)表,然后通過操作PO,對(duì)數(shù)據(jù)庫中的表進(jìn)行各種操作,其中PO就是POJO(普通Java對(duì)象)加映射文件。,4.2 Hibernate應(yīng)用基礎(chǔ),4.2 Hibernate應(yīng)用基礎(chǔ),Hibernate工作流程,4.2 Hibernate應(yīng)用基礎(chǔ),Hibernate開發(fā)步驟: (1)創(chuàng)建Hibernate的配置文件。 (2)創(chuàng)建持久化類。 (3)創(chuàng)建對(duì)象-關(guān)系映射文件。 (4)創(chuàng)建SessionFactory。 (5)通過Hibernate API編寫訪問數(shù)據(jù)庫的代碼。 MyEcl

36、ipse中Hibernate開發(fā)步驟: (1)新建表,創(chuàng)建數(shù)據(jù)庫連接。 (2)添加Hibernate開發(fā)能力。 (3)反向工程,生成POJO類和映射文件。 (4)創(chuàng)建HibernateSessionFactory。 (5)調(diào)用Hibernate API開發(fā),4.2.2 Hibernate各種文件的作用,1. POJO類和其映射配置文件 2. hibernate.cfg.xml文件 3. HibernateSessionFactory,4.2.2 Hibernate各種文件的作用,1. POJO類和其映射配置文件 POJO類如下:,package org.model; public class

37、Kcb implements java.io.Serializable private String kch; / 對(duì)應(yīng)表中KCH字段 private String kcm; / 對(duì)應(yīng)表中KCM字段 private Short kxxq; / 對(duì)應(yīng)表中KXXQ字段 private Integer xs; / 對(duì)應(yīng)表中XS字段 private Integer xf; / 對(duì)應(yīng)表中XF字段 public Kcb() / 省略上述屬性的getter和setter方法 ,4.2.2 Hibernate各種文件的作用,POJO類中的屬性和表中的字段通過*.hbm.xml映射文件來一一對(duì)應(yīng)。本例就是Kcb

38、.hbm.xml,代碼如下:, ,4.2.2 Hibernate各種文件的作用,native:由數(shù)據(jù)庫對(duì)id賦值。當(dāng)設(shè)置時(shí),數(shù)據(jù)庫負(fù)責(zé)主鍵id的賦值,最常見的是int型的自增型主鍵。 hilo:通過hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要額外的數(shù)據(jù)庫表保存主鍵生成歷史狀態(tài)。 seqhilo:與hi/lo類似,通過hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,只是主鍵歷史狀態(tài)保存在sequence中,適用于支持sequence的數(shù)據(jù)庫,如Oracle。 increment:主鍵按數(shù)值順序遞增。此方式的實(shí)現(xiàn)機(jī)制為在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?作為主鍵。 i

39、dentity:采用數(shù)據(jù)庫提供的主鍵生成機(jī)制,如SQL Server、MySQL中的自增主鍵生成機(jī)制。 sequence:采用數(shù)據(jù)庫提供的sequence機(jī)制生成主鍵,如Oracle sequence。 uuid.hex:由Hibernate基于128位唯一值產(chǎn)生算法,根據(jù)當(dāng)前設(shè)備IP、時(shí)間、JVM啟動(dòng)時(shí)間、內(nèi)部自增量等4個(gè)參數(shù)生成十六進(jìn)制數(shù)值(編碼后長(zhǎng)度為32位的字符串表示)作為主鍵。即使是在多實(shí)例并發(fā)運(yùn)行的情況下,這種算法在最大程度上保證了產(chǎn)生id的唯一性。當(dāng)然,重復(fù)的概率在理論上依然存在,只是概率比較小。 uuid.string:與uuid.hex類似,只是對(duì)生成的主鍵進(jìn)行編碼(長(zhǎng)度16

40、位)。 foreign:使用外部表的字段作為主鍵。 select:Hibernate 3新引入的主鍵生成機(jī)制,主要針對(duì)遺留系統(tǒng)的改造工程。,4.2.2 Hibernate各種文件的作用,2. hibernate.cfg.xml文件 該文件是Hibernate重要的配置文件,配置該文件主要是配置SessionFractory類。, jdbc:mysql:/localhost:3306/javaee org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver liukun liukun com.mysql.jdbc.Driver ,4.2.2

41、Hibernate各種文件的作用,2. hibernate.cfg.xml文件,4.2.2 Hibernate各種文件的作用,3. HibernateSessionFactory HibernateSessionFactory類是自定義的SessionFactory,名字可以根據(jù)自己的喜好來決定。這里用的是HibernateSessionFactory,在Hibernate中,Session負(fù)責(zé)完成對(duì)象持久化操作。該文件負(fù)責(zé)創(chuàng)建和關(guān)閉Session對(duì)象。Session對(duì)象的創(chuàng)建大致需要以下3個(gè)步驟: 初始化Hibernate配置管理類Configuration。 通過Configuration

42、類實(shí)例創(chuàng)建Session的工廠類SessionFactory。 通過SessionFactory得到Session實(shí)例(事務(wù))。, / 定義一個(gè)靜態(tài)字符串變量存放Hibernate的配置文件名 private static String CONFIG_FILE_LOCATION=/hibernate.cfg.xml; / 創(chuàng)建一個(gè)線程局部變量對(duì)象 private static final ThreadLocal threadLocal=new ThreadLocal(); private static Configuration configuration=new Configuration(

43、); / 創(chuàng)建一個(gè)靜態(tài)的Configuration對(duì)象 private static org.hibernate.SessionFactory sessionFactory; / 定義一個(gè)靜態(tài)的SessionFactory對(duì)象 private static String configFile=CONFIG_FILE_LOCATION; configuration.configure(configFile); sessionFactory=configuration.buildSessionFactory(); Session session=(sessionFactory != null) ?

44、 sessionFactory.openSession(): null; Transaction ts=session.beginTransaction();,回顧,Hibernate開發(fā)步驟: (1)創(chuàng)建Hibernate的配置文件。 (2)創(chuàng)建持久化類。 (3)創(chuàng)建對(duì)象-關(guān)系映射文件。 (4)通過Hibernate API編寫訪問數(shù)據(jù)庫的代碼(創(chuàng)建SessionFactory類)。 Hibernate各種文件 POJO類和映射配置文件 Hibernate.cfg.xml文件 HibernateSessionFactory Hibernate核心接口 Configuration、Sessio

45、nFactory、Session、Transaction、Query HQL查詢,4.3 Hibernate關(guān)系映射,4.3 Hibernate關(guān)系映射,一對(duì)一關(guān)聯(lián) 共享主鍵方式 唯一外鍵方式 多對(duì)一單向關(guān)聯(lián) 一對(duì)多雙向關(guān)聯(lián) 多對(duì)多關(guān)聯(lián)(單向、多向),4.4 Hibernate高級(jí)功能,4.4 Hibernate高級(jí)功能,批量處理(插入、更新、刪除) 實(shí)體對(duì)象生命周期 事務(wù)管理 基于JDBC的事務(wù)管理 基于JTA的事務(wù)管理概念 鎖,4.4 Hibernate高級(jí)功能,4.4.1 Hibernate批量處理 1. 批量插入 (1)通過Hibernate的緩存進(jìn)行批量插入 使用這種方法時(shí),首先要在

46、Hibernate的配置文件hibernate.cfg.xml中設(shè)置批量尺寸屬性hibernate.jdbc.batch_size,且最好關(guān)閉Hibernate的二級(jí)緩存以提高效率。 例如:, 50 / 設(shè)置批量尺寸 false / 關(guān)閉二級(jí)緩存 ,4.4.1 Hibernate批量處理,下面以4.2.1節(jié)的例子中的課程進(jìn)行批量插入為例,說明批量插入操作的具體過程,這里假設(shè)批量插入500個(gè)課程到數(shù)據(jù)中:,Session session=HibernateSessionFactory.getSession(); Transaction ts=session.beginTransaction();

47、 for(int i=0;i500;i+) Kcb kcb=new Kcb(); / 這里設(shè)置課程號(hào)為i,在實(shí)際應(yīng)用中應(yīng)該是被插入的課程對(duì)象 / 已經(jīng)放在集合或數(shù)組中,這里只要取出 kcb.setKch(i+); session.save(kcb); if(i%50=0) / 以50個(gè)課程為一個(gè)批次向數(shù)據(jù)庫提交,此值應(yīng)與配置的批量尺寸一致 session.flush(); / 將該批量數(shù)據(jù)立即插入數(shù)據(jù)庫中 session.clear(); / 清空緩存區(qū),釋放內(nèi)存供下批數(shù)據(jù)使用 mit(); HibernateSessionFactory.closeSession();,4.4.1 Hiber

48、nate批量處理,(2)繞過Hibernate直接調(diào)用JDBC進(jìn)行插入 由于Hibernate只是對(duì)JDBC進(jìn)行了輕量級(jí)的封裝,因此完全可以繞過Hibernate直接調(diào)用JDBC進(jìn)行批量插入。因此上例可以改成如下代碼:,Session session=HibernateSessionFactory.getSession(); Transaction ts=session.beginTransaction(); Connection conn=session.connection(); try PreparedStatement stmt=conn.prepareStatement(insert

49、 into KCB(KCH) values(?); for (int i=0; i 500; i+) stmt.setString(1, i+); stmt.addBatch(); / 添加到批處理命令中 stmt.executeBatch(); / 執(zhí)行批處理任務(wù) catch (SQLException e) e.printStackTrace(); mit(); HibernateSessionFactory.closeSession();,4.4.1 Hibernate批量處理,2. 批量更新 (1)由Hibernate直接進(jìn)行批量更新 為了使Hibernate的HQL直接支持updat

50、e/delete的批量更新語法,首先要在Hibernate的配置文件hibernate.cfg.xml中設(shè)置HQL/SQL查詢翻譯器屬性hibernate.query.factory_class。, org.hibernate.hql.ast.ASTQueryTranslatorFactory ,4.4.1 Hibernate批量處理,下面使用HQL批量更新把課程表中的XS修改為30。由于這里是用Hibernate操作,故HQL要用類對(duì)象及其屬性。,Session session=HibernateSessionFactory.getSession(); Transaction ts=sess

51、ion.beginTransaction(); /在HQL查詢中使用update進(jìn)行批量更新 Query query=session.createQuery(update Kcb set xs=30); query.executeUpdate(); mit(); HibernateSessionFactory.closeSession();,4.4.1 Hibernate批量處理,(2)繞過Hibernate調(diào)用JDBC進(jìn)行批量更新 由于這里是直接操作數(shù)據(jù)庫,故要操作對(duì)應(yīng)表,而不是類。,Session session=HibernateSessionFactory.getSession();

52、Transaction ts=session.beginTransaction(); Connection conn=session.connection(); try Statement stmt=conn.createStatement(); /調(diào)用JDBC的update進(jìn)行批量更新 stmt.executeUpdate(update KCB set XS=30); catch (SQLException e) e.printStackTrace(); mit(); HibernateSessionFactory.closeSession();,4.4.1 Hibernate批量處理,3.

53、 批量刪除 (1)由Hibernate直接進(jìn)行批量刪除 與批量更新一樣,為了使Hibernate的HQL直接支持update/delete的批量刪除語法,首先要在Hibernate的配置文件hibernate.cfg.xml中設(shè)置HQL/SQL查詢翻譯器屬性hibernate.query.factory_class。, org.hibernate.hql.ast.ASTQueryTranslatorFactory ,4.4.1 Hibernate批量處理,下面將使用HQL批量刪除課程表中課程號(hào)大于200的課程。,Session session=HibernateSessionFactory.g

54、etSession(); Transaction ts=session.beginTransaction(); /在HQL查詢中使用delete進(jìn)行批量刪除 Query query=session.createQuery(delete Kcb where kch200); query.executeUpdate(); mit(); HibernateSessionFactory.closeSession();,4.4.1 Hibernate批量處理,(2)繞過Hibernate調(diào)用JDBC進(jìn)行批量刪除 同樣刪除課程表中課程號(hào)大于200的課程。,Session session=Hibernate

55、SessionFactory.getSession(); Transaction ts=session.beginTransaction(); Connection conn=session.connection(); try Statement stmt= conn.createStatement(); /調(diào)用JDBC的delete進(jìn)行批量刪除 stmt.executeUpdate(delete from KCB where KCH200); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(

56、); mit(); HibernateSessionFactory.closeSession();,4.4.2 實(shí)體對(duì)象生命周期,實(shí)體對(duì)象的生命周期有以下3種狀態(tài)。 1transient(瞬時(shí)態(tài)) 瞬時(shí)態(tài),即實(shí)體對(duì)象在內(nèi)存中的存在,與數(shù)據(jù)庫中的記錄無關(guān)。如下面的代碼:,Student stu=new Student(); stu.setSnumber(081101); stu.setSname(李方方); stu.setSage(21);,4.4.2 實(shí)體對(duì)象生命周期,實(shí)體對(duì)象的生命周期有以下3種狀態(tài)。 2persisent(持久態(tài)) 在這種狀態(tài)下,實(shí)體對(duì)象的引用被納入Hibernate實(shí)體容

57、器中加以管理。處于持久狀態(tài)的對(duì)象,其變更將由Hibernate固化到數(shù)據(jù)庫中。例如下面的代碼:,Student stu=new Student(); Student stu1=new Student(); stu.setSnumber(081101); stu.setSname(李方方); stu.setSage(21); stu1.setSnumber(081102); stu1.setSname(程明); stu1.setSage(22);/ 到此為止,stu和stu1均處于瞬時(shí)態(tài) Transaction tx=session.beginTransaction(); / 通過save()方

58、法,stu對(duì)象轉(zhuǎn)換為持久態(tài),由Hibernate納入實(shí)體管理容器,而stu1仍然處于瞬時(shí)態(tài) session.save(stu); / 事務(wù)提交之后,數(shù)據(jù)庫表中插入一條學(xué)生的記錄,對(duì)于stu1則無任何操作 mit(); Transaction tx2=session.beginTransaction(); stu.setSname(李方); stu1.setSname(程明明); mit();,雖然這個(gè)事務(wù)中沒有顯示調(diào)用session.save()方法保存stu對(duì)象,但是由于stu為持久態(tài),將自動(dòng)被固化到數(shù)據(jù)庫, 因此數(shù)據(jù)庫的學(xué)號(hào)為“081101” 學(xué)生記錄的姓名已被更改為“李方”,此時(shí)stu1仍然是一個(gè)普通Java對(duì)象,對(duì)數(shù)據(jù)庫未產(chǎn)生任何影響。,處于瞬時(shí)態(tài)的對(duì)象,可以通過Session的save()方法轉(zhuǎn)換成持久狀態(tài)。同樣,如果一個(gè)實(shí)體對(duì)象由Hibernate加載,那么,它也處于持久狀態(tài)。例如下面的代碼: / 由Hibernate返回的持久對(duì)象 Student stu=(Student)session.load(Student.class,new Integer(1);,4.4.2 實(shí)體對(duì)象生命周期,3Detached(脫管狀態(tài)) 處于持久態(tài)的對(duì)象,其對(duì)應(yīng)的Session實(shí)例關(guān)閉之后,此對(duì)象就處于脫管狀態(tài)。Session實(shí)例可以看做是持久對(duì)象的宿主,一旦此

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論