軟件架構(gòu)設計實踐- 基于SSM框架 課件 第8、9章 Spring MVC高級功能、Mybatis框架基礎_第1頁
軟件架構(gòu)設計實踐- 基于SSM框架 課件 第8、9章 Spring MVC高級功能、Mybatis框架基礎_第2頁
軟件架構(gòu)設計實踐- 基于SSM框架 課件 第8、9章 Spring MVC高級功能、Mybatis框架基礎_第3頁
軟件架構(gòu)設計實踐- 基于SSM框架 課件 第8、9章 Spring MVC高級功能、Mybatis框架基礎_第4頁
軟件架構(gòu)設計實踐- 基于SSM框架 課件 第8、9章 Spring MVC高級功能、Mybatis框架基礎_第5頁
已閱讀5頁,還剩98頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

基于SSM框架的軟件架構(gòu)設計實戰(zhàn)Software

Architecture

Design

Practice

Based

on

SSM

Framework第8章Spring

MVC高級功能12345攔截器異常處理文件上傳下載靜態(tài)資源訪問JSON數(shù)據(jù)交換和RESTful應用攔截器攔截器攔截器的概念攔截器(Interceptor)可以攔截對處理器的調(diào)用,并允許在處理器執(zhí)行前和(或)執(zhí)行后進行一些操作攔截器可以為所有處理器提供統(tǒng)一的可插拔功能,可以讓處理器專注于業(yè)務邏輯從作用看,攔截器與Servlet的過濾器有相似之處,它們的區(qū)別主要體現(xiàn)在過濾器會攔截<url-pattern>中配置的所有請求資源,攔截器只攔截對處理器的調(diào)用攔截器Spring

MVC中的攔截器需要實現(xiàn)HandlerInterceptor接口,它允許在三個時機插入處理代碼,對應三個攔截器方法:處理器執(zhí)行前(preHandle)處理器執(zhí)行完畢(postHandle)視圖渲染完成(afterCompletion)攔截器攔截器方法的執(zhí)行順序攔截器攔截器要點:preHandle中定義執(zhí)行處理器代碼之前要執(zhí)行的操作,postHandle中定義執(zhí)行處理器代碼之后要執(zhí)行的操作,afterCompletion中定義視圖渲染完畢之后要執(zhí)行的操作preHandle返回值是布爾類型,返回true表示放行,如果后面還有攔截器,則執(zhí)行下一個攔截器的preHandle,如果沒有其它攔截器,則執(zhí)行處理器代碼;返回false表示攔截,不再執(zhí)行后面的代碼三個方法中的Object類型參數(shù),表示被攔截的處理器postHandle中的ModelAndView類型參數(shù),代表處理器返回的ModelAndView攔截器配置攔截器要想攔截器起作用,還需要在配置文件中進行配置,也就是要告訴Spring

MVC要攔截哪些處理器。攔截器攔截器配置要點:<mvc:mapping>一定要有,并且要在<mvc:exclude-mapping>之前<mvc:mapping>和<mvc:exclude-mapping>都可以有多個**代表多層路徑,*代表單層路徑要想使用mvc命名空間,需要先聲明攔截器攔截器鏈SpringMVC允許同時在一個處理器上配置多個攔截器,作用在一個處理器上的多個攔截器就形成了攔截器鏈。在配置攔截器鏈時,只需在<mvc:interceptors></mvc:interceptors>標簽中使用多個<mvc:interceptor></mvc:interceptor>標簽進行配置即可。攔截器多個攔截器的執(zhí)行順序異常處理異常處理Spring

MVC異常處理概述提供了一個統(tǒng)一的異常處理手段,這樣一方面可以使程序員專注于業(yè)務邏輯,另一方面也可以提供一個相對友好的出錯界面。SpringMVC提供了一系列的異常處理機制,它們基于一個統(tǒng)一的接口HandlerExceptionResolver,這一接口有多個實現(xiàn)類,它們以不同的方式處理不同的異常。異常處理自定義全局異常處理器:使用方法自定義異常處理類裝配異常處理類異常處理異常處理類異常處理說明異常處理類里重寫resolveException()方法。Exception類入?yún)⑹切枰幚淼漠惓!bject類入?yún)⑹怯|發(fā)異常的處理器,其具體類型是HandlerMethod。方法返回ModelAndView,這個ModelAndView類的對象會代替產(chǎn)生異常的處理器返回的ModelAndView類對象返回給前端控制器,可以在這里指定產(chǎn)生異常時需要渲染給客戶端的視圖。文件上傳下載文件上傳下載文件上傳SpringMVC提供了MultipartResolver接口,專門用于處理文件上傳。當收到請求時,前端控制器的checkMultipart()方法會調(diào)用MultipartResolver的isMultipart()方法判斷請求中是否包含文件。如果請求數(shù)據(jù)中包含文件,則調(diào)用MultipartResolver的resolveMultipart()方法對請求的數(shù)據(jù)進行解析,同時將HttpServletRequest類對象封裝為MultipartHttpServletRequest類對象,并將文件數(shù)據(jù)封裝到MultipartFile類的對象中,傳遞給處理器。文件上傳下載MultipartResolver接口有兩個實現(xiàn)類:StandardServletMultipartResolver:基于Servlet實現(xiàn)文件上傳,不需要額外的依賴項,但對容器支持的Servlet版本有要求,需要在web.xml中配置文件上傳相關信息,是Spring

6推薦使用的。CommonsMultipartResolver:基于ApacheCommonsFileUpload組件,需要額外的依賴項,需要在Spring配置文件中配置相關信息。文件上傳下載使用步驟:在Spring配置文件中裝配多部件解析器在web.xml的前端控制器中配置multipart文件上傳下載裝配多部件解析器StandardServletMultipartResolver配置multipart文件上傳下載上傳頁面文件上傳下載處理器代碼文件上傳下載說明處理器的第一個入?yún)㈩愋褪荕ultipartFile,參數(shù)名file要與表單中的file表單域的name屬性相同。處理器第二個入?yún)⒌念愋褪荋ttpServletRequest,這里是為了在處理器中獲取保存文件的物理路徑。getOriginalFilename()方法作用是獲取上傳文件的原始文件名。transferTo()方法用于將MultipartFile中的文件數(shù)據(jù)轉(zhuǎn)移到File對象中UUID類的randomUUID()方法作用是生產(chǎn)一個通用唯一識別碼(UniversallyUniqueIdentifier),防止文件重名。文件上傳下載文件下載一般來說,在瀏覽器中直接請求文件地址就可以下載了,但這樣做有很多缺點,如:沒辦法獲取下載狀態(tài),比如一共多少,傳輸了多少,傳輸是否出錯等沒辦法控制下載過程一個更好的方法是,通過服務器的文件系統(tǒng),先從磁盤上把文件讀取進緩沖區(qū),然后再通過程序發(fā)送給客戶端,這樣就可以控制整個下載過程了。文件下載使用ResponseEntity<>實現(xiàn)文件下載ResponseEntity<>類可以讓處理器返回一個經(jīng)序列化的實體對象,除此之外,ResponseEntity還支持設置響應頭和狀態(tài)碼,使用ResponseEntity類,可以實現(xiàn)文件下載。文件下載處理器代碼文件上傳下載說明返回類型ReponseEntity<>的泛型為byte[],這樣文件的字節(jié)流會被直接寫入響應體內(nèi)。HttpHeaders的setContentType()方法的參數(shù)是枚舉類型MediaType.APPLICATION_OCTET_STREAM,它能將響應頭中的ContentType設置為application/octet-stream。setContentDispositionFormData()方法的作用是將響應頭中的ContentDisposition設置為“attachment;filename=xxx:”。靜態(tài)資源訪問靜態(tài)資源訪問問題的提出在配置前端控制器的Servlt映射時,將對網(wǎng)站的所有請求都交給前端控制器處理。前端控制器會攔截對網(wǎng)站的所有請求,然后調(diào)用處理器映射器對請求路徑進行解析,并最終映射為對處理器方法的調(diào)用。這一過程中,對靜態(tài)資源,如圖片、HTML頁面、CSS文件、JS文件等的請求也會進行映射,這顯然是找不到對應的處理器方法的,因此會返回404錯誤。靜態(tài)資源訪問靜態(tài)資源訪問方法一:配置默認Servlet原理:在web.xml中配置名為default的Servlet映射,當請求以該映射路徑開頭的路徑時,會交由Web容器的默認Servlet(即名為default的Servlet)處理,而不是由SpringMVC的前端控制器處理。靜態(tài)資源訪問靜態(tài)資源訪問方法二:注冊DefaultServletHttpRequestHandler原理:在Spring配置文件中裝配一個DefaultServletHttpRequestHandler,它是SpringMVC預定義的一個處理器,它的作用就是將所有請求轉(zhuǎn)發(fā)到Web容器的默認Servlet去處理。由于它具有最低的映射優(yōu)先級,因此不會影響前端控制器DispatcherServlet。靜態(tài)資源訪問靜態(tài)資源訪問方法三:配置資源映射原理:在Spring配置文件中配置資源映射,可將特定路徑下的文件視為靜態(tài)文件,對其的請求不再交給處理器映射器處理。location屬性指明靜態(tài)文件的實際路徑,mapping屬性指明靜態(tài)文件的映射路徑,其含義是將以“/img”開頭的路徑的請求視為對靜態(tài)文件的請求,并將其映射到“/static/assets/img/”路徑下,而不再交給處理器映射器進行處理。JSON數(shù)據(jù)交換

和RESTful應用JSON數(shù)據(jù)交換和RESTful應用概述最理想的Web應用程序:前后端分離,即前端和后端只存在數(shù)據(jù)耦合,這樣的后端程序也稱為Web

API。數(shù)據(jù)交換涉及到的最重要問題就是數(shù)據(jù)的格式,需要有一種規(guī)范的格式,確保多數(shù)后臺和前臺技術都能解析。目前最流行的數(shù)據(jù)交換格式就是JSON。JSON數(shù)據(jù)交換和RESTful應用JSON(JavaScriptObjectNotation,JS對象標記)是一種輕量級的數(shù)據(jù)交換格式,它獨立于編程語言,以純文本來存儲和表示數(shù)據(jù),易于閱讀和編寫,也易于程序解析和生成,相比于XML,它占用更少存儲空間,解析速度更快。JSON數(shù)據(jù)交換和RESTful應用JSON有兩種數(shù)據(jù)結(jié)構(gòu):對象結(jié)構(gòu):以“{”開始,以“}”結(jié)束,中間是key:value形式的數(shù)據(jù)。期中,key必須為字符串,value可以是任意類型。多個key-value之間使用逗號(,)分割數(shù)組結(jié)構(gòu):以“[”開始,以“]”結(jié)束,中間是值的列表,用逗號分割,元素可以是多種類型。需要注意的是,如果用JSON存儲單個數(shù)據(jù),要使用數(shù)組結(jié)構(gòu),不能使用對象結(jié)構(gòu),因為對象結(jié)構(gòu)要有keyJSON數(shù)據(jù)交換和RESTful應用序列化/反序列化工具:Jackson庫JSON數(shù)據(jù)交換和RESTful應用處理器返回JSON方法一:使用ResponseEntity<>類處理器返回ResponseBody<>類的對象時,不再進行視圖渲染,而是直接將ResponseBody<>類對象中封裝的數(shù)據(jù)寫入響應體中。如果我們在返回ResponseBody<>類對象時,直接將實體對象封裝進去,SpringMVC就會調(diào)用相應的序列化方法,將實體對象序列化為JSON,并寫入響應體內(nèi),這樣就實現(xiàn)了處理器返回JSON。JSON數(shù)據(jù)交換和RESTful應用處理器代碼JSON數(shù)據(jù)交換和RESTful應用處理器返回JSON方法二:使用@ResponseBody注解@ResponseBody注解使用在處理器方法上,使用@ResponseBody標記的處理器方法可以直接返回一個實體對象,SpringMVC會使用合適的序列化方法將其序列化后直接寫入響應體。要使用@ResponseBody注解,需要在Spring配置文件中配置SpringMVC的注解驅(qū)動。JSON數(shù)據(jù)交換和RESTful應用處理器代碼JSON數(shù)據(jù)交換和RESTful應用還可以在控制器類上使用@RestController注解,可以方便地使一個控制器類中的所有處理器返回JSON。JSON數(shù)據(jù)交換和RESTful應用處理器解析JSON方法一:使用RequestEntity<>類RequestEntity<>封裝了整個請求,可以通過它的getBody()方法獲取請求體數(shù)據(jù),這個過程中SpringMVC會調(diào)用反序列化工具對請求體中的數(shù)據(jù)進行反序列化。JSON數(shù)據(jù)交換和RESTful應用處理器解析JSON方法二:使用@RequestBody注解@RequestBody注解用于標記處理器入?yún)?,它的作用是從請求體中讀取數(shù)據(jù),并通過適當?shù)腍ttpMessageConverter進行轉(zhuǎn)換后注入到其標記的實體對象內(nèi)。JSON數(shù)據(jù)交換和RESTful應用REST(REpresentationalStateTransfer,表現(xiàn)層狀態(tài)轉(zhuǎn)移)的概念是一種Web應用設計風格,它描述的是在網(wǎng)絡中客戶端和服務器的一種交互形式。它的核心思想是使用URI定位資源,使用HTTP動詞描述操作。如果一個架構(gòu)符合REST原則,就稱它為RESTful架構(gòu),相應的應用就稱為RESTful應用。JSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用LeonardRichardson分析了百余種不同的Web服務,并根據(jù)它們與REST的兼容程度將它們分為四個等級,稱為Richardson成熟度模型,它可以用于識別一個Web服務的成熟度級別,也為構(gòu)建RESTfulWeb服務提供了切實可行的參考依據(jù)。JSON數(shù)據(jù)交換和RESTful應用Richardson成熟度模型Level0:POX(PlainOldXML)。除了使用XML作為數(shù)據(jù)交換,其余跟傳統(tǒng)Web應用沒有區(qū)別。Level1:資源。使用URL表示資源的位置,沒有使用正確的HTTP動詞。Level2:動詞。正確使用了HTTP動詞和HTTP狀態(tài)碼。Level3:超媒體。超媒體作為應用程序的狀態(tài)引擎(HATEOAS,HypermediaAsTheEngineOfApplicationState)。包含了一些可發(fā)現(xiàn)性的自包含文檔,是REST的最理想形態(tài)。JSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用第一步:在URL中使用資源地址,使用HTTP動詞表示對資源的操作Bad:/getProducts/deleteOrder?orderId=1/getItemsByOrder?orderId=1Good:GET/products:willreturnthelistofallproductsPOST/products:willaddaproducttothecollectionGET/products/4:willretrieveproduct#4GET/orders/4/items:willretrievethelistofallitemsoforder#4GET/orders/4/items/1:willretrieveitem#1oforder#4PUT/products/4:willupdateproduct#4PATCH/products/4:willpartiallyupdateproduct#4JSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用第二步:正確使用HTTP狀態(tài)碼方法一:使用@ResponseStatus注解JSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用第二步:正確使用HTTP狀態(tài)碼方法二:使用ResponseEntity<>類JSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用第三步:使服務具有自描述能力Bad:JSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用第三步:使服務具有自描述能力Good:JSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用第三步:使服務具有自描述能力使用Spring

HATEOASJSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用第三步:使服務具有自描述能力使用Spring

HATEOAS實體類繼承RepresentationModel<>類:JSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用第三步:使服務具有自描述能力使用Spring

HATEOAS向一個資源(一個實體對象)添加鏈接:JSON數(shù)據(jù)交換和RESTful應用構(gòu)造RESTful應用第三步:使服務具有自描述能力使用Spring

HATEOAS處理器代碼:Q&A

Time軟件架構(gòu)設計實戰(zhàn)——基于SSM框架Software

Architecture

Design

Practice

Based

on

SSM

Framework第9章MyBatis框架基礎123MyBatis概述MyBatis重要API簡介MyBatis的配置文件4第一個MyBatis應用程序MyBatis概述在面向?qū)ο蟪绦蛟O計當中我們所面對的是一個一個的對象,而在關系型數(shù)據(jù)庫中,所面對的是實體以及實體之間的關系,在程序設計中我們經(jīng)常面臨的問題是面向?qū)ο蟪绦蛟O計中的對象與關系型數(shù)據(jù)庫中實體之間的轉(zhuǎn)換,需要程序員編寫大量的、重復的、與業(yè)務邏輯無關的代碼,這種機械性的工作能不能被簡化呢?11.1傳統(tǒng)JDBC的劣勢隨著軟件開發(fā)技術的不斷升級,軟件開發(fā)工具的不斷進步,采用JDBC數(shù)據(jù)庫連接方式的弊端也越來越明顯,主要表現(xiàn)為以下四個方面:(1)SQL語句在代碼中硬編碼,造成代碼不易維護。(2)數(shù)據(jù)表之間存在各種關系,包括一對一、一對多、多對多、級聯(lián)等。如果采用JDBC編程的方式維護數(shù)據(jù)表之間的關系,過程較為復雜并且容易出錯。(3)數(shù)據(jù)庫連接創(chuàng)建、釋放頻繁,會造成系統(tǒng)資源浪費,從而影響系統(tǒng)性能。(4)雖然在JDBC中提供了預處理接口PreparedStatement,但是用PreparedStatement向占位符傳參數(shù)存在硬編碼,因為SQL語句的where條件不一定,可能有時多也可能有時少,修改SQL語句需要修改代碼,造成系統(tǒng)不易維護。1.2ORM簡介MVC設計模式實現(xiàn)了表現(xiàn)層(即View)和數(shù)據(jù)處理層(即Model)的解耦合,而持久化層的設計則是要實現(xiàn)數(shù)據(jù)處理層內(nèi)部的業(yè)務邏輯和數(shù)據(jù)邏輯的解耦合。而ORM采用映射元數(shù)據(jù)來描述對象關系的映射,使得ORM能在任何一個應用的業(yè)務邏輯層和數(shù)據(jù)庫層之間充當橋梁,可以讓我們通過類和類對象就能操作它所對應的表格中的數(shù)據(jù)。ORM映射1.2ORM簡介在ORM的映射當中,面向?qū)ο蟪绦蛟O計中的類映射成關系型數(shù)據(jù)庫中的表(可能一個表,可能多個表,也可能一個表的部分字段),一般采用XML文件的形式進行描述;而具體的一個個對象則映射為數(shù)據(jù)庫表中的一條條記錄,對象的屬性映射為數(shù)據(jù)庫表中的字段。1.2ORM簡介(1)HibernateHibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了較為輕量級的對象封裝,它將對象與數(shù)據(jù)庫表建立映射關系,是個全自動的ORM框架,Hibernate可以自動生成SQL語句、并自動執(zhí)行,使得Java程序員可以隨心所欲的使用面向?qū)ο缶幊趟季S來操作數(shù)據(jù)庫,通過操作對象的方式來操作數(shù)據(jù)庫極大的提高開發(fā)的效率。1.2ORM簡介(2)MyBatisMyBatis是一種“半自動化”的ORM框架,和Hibernate不同,MyBatis需要手動提供POJO(PlainOldJavaObjects)、SQL語句并匹配映射關系,正因為此,它可以更加靈活地生成映射關系。MyBatis充分允許開發(fā)人員利用數(shù)據(jù)庫的各項功能,例如存儲過程、視圖、復雜查詢等,具有高度靈活性、可優(yōu)化、易維護等優(yōu)點。與Hibernate相比,使用MyBatis的編碼量較大,但這并不影響它在一些復雜的和需要優(yōu)化性能的項目中使用。1.3MyBatis簡介MyBatis本是apache的一個開源項目iBatis,2010年這個項目由apachesoftwarefoundation遷移到了googlecode,并且改名為MyBatis。在MyBatis中也采用了工廠模式進行對象創(chuàng)建與管理,每個MyBatis應用程序主要都使用了SqlSessionFactory實例,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。1.3MyBatis簡介MyBatis的主要優(yōu)點包括以下四個方面:(1)通過參數(shù)映射方式,實現(xiàn)了SQL和Java代碼的分離,解除SQL語句與程序代碼的耦合,可以將參數(shù)靈活的配置在SQL語句的配置文件XML中,避免在Java類中配置參數(shù)。(2)通過輸出映射機制,將結(jié)果集的檢索自動映射成相應的Java對象,避免對結(jié)果集手工檢索。(3)Mybatis也采用非侵入式設計,使用簡單,沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個SQL映射文件,易學易用。通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現(xiàn)。(4)Mybatis不會對應用程序或者數(shù)據(jù)庫的現(xiàn)有設計強加任何影響,SQL寫在XML里,便于統(tǒng)一管理和優(yōu)化。通過SQL語句可以滿足操作數(shù)據(jù)庫的所有需求。Mybatis可以通過XML配置文件對數(shù)據(jù)庫連接進行管理。課程思政MyBatis的前身是iBatis,iBatis是ClintonBegin于2001年發(fā)起的一個開放源代碼項目,目的是發(fā)展密碼軟件的解決方案。從MyBatis的發(fā)展歷程可以看出,其發(fā)展過程并不是一帆風順的,也經(jīng)歷了很多磨難和變遷,所以大家一定要清晰的認識到科研的道路一定要經(jīng)得起沉浮、耐得住寂寞、不怕失敗、刻苦專研,總能守得日出見云開。在軟件項目開發(fā)中使用MyBatis能夠給程序員帶來諸多的便利性,減少大量的重復代碼編寫,提高軟件開發(fā)的效率。作為軟件從業(yè)人員一定要有高尚的情懷、無私的奉獻精神,共同推動軟件產(chǎn)業(yè)的發(fā)展,為我國的社會主義現(xiàn)代化建設貢獻力量。1.4MyBatis的功能架構(gòu)MyBatis是一款優(yōu)秀的持久層框架,它支持自定義SQL、存儲過程以及高級映射。MyBatis免除了幾乎所有的JDBC代碼以及設置參數(shù)和獲取結(jié)果集的工作。MyBatis可以通過簡單的XML或注解來配置和映射原始類型、接口和POJO為數(shù)據(jù)庫中的記錄。1.4MyBatis的功能架構(gòu)1.4MyBatis的功能架構(gòu)接口層:主要就是和數(shù)據(jù)庫交互,提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數(shù)據(jù)庫,接口層一接收到調(diào)用請求就會調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。數(shù)據(jù)處理層:是MyBatis的核心,負責具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等,它主要的目的是根據(jù)調(diào)用的請求完成一次數(shù)據(jù)庫操作。主要完成兩個功能:①通過傳入?yún)?shù)構(gòu)建動態(tài)SQL語句;②SQL語句的執(zhí)行以及封裝查詢結(jié)果集。基礎支撐層:基礎支撐層是整個MyBatis框架的地基,負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件,為上層的數(shù)據(jù)處理層提供最基礎的支撐。1.5MyBatis的工作流程在理解了Mybatis的功能架構(gòu)之后,接下來我們探討一下Mybatis的工作流程,這也是后面我們使用Mybatis框架的基礎。1.5MyBatis的工作流程1.5MyBatis的工作流程Mybatis框架也是采用工程模式進行對象的創(chuàng)建與管理的,其核心對象為SqlSessionFactory,每一步流程的詳細說明如下文所述:(1)讀取MyBatis的配置文件。mybatis-config.xml為MyBatis的全局配置文件,用于配置數(shù)據(jù)庫連接信息。(2)加載映射文件。映射文件即SQL映射文件,該文件中配置了操作數(shù)據(jù)庫的SQL語句,需要在MyBatis配置文件mybatis-config.xml中加載。mybatis-config.xml文件可以加載多個映射文件,每個文件對應數(shù)據(jù)庫中的一張表。1.5MyBatis的工作流程(3)構(gòu)造會話工廠。通過MyBatis的環(huán)境配置信息構(gòu)建會話工廠SqlSessionFactory。(4)創(chuàng)建會話對象。由會話工廠創(chuàng)建SqlSession對象,該對象中包含了執(zhí)行SQL語句的所有方法。(5)Executor執(zhí)行器。MyBatis底層定義了一個Executor接口來操作數(shù)據(jù)庫,它將根據(jù)SqlSession傳遞的參數(shù)動態(tài)地生成需要執(zhí)行的SQL語句,同時負責查詢緩存的維護。(6)MappedStatement對象。在Executor接口的執(zhí)行方法中有一個MappedStatement類型的參數(shù),該參數(shù)是對映射信息的封裝,用于存儲要映射的SQL語句的id、參數(shù)等信息。1.5MyBatis的工作流程(7)輸入?yún)?shù)映射。輸入?yún)?shù)類型可以是Map、List等集合類型,也可以是基本數(shù)據(jù)類型和POJO類型。輸入?yún)?shù)映射過程類似于JDBC對preparedStatement對象設置參數(shù)的過程。(8)輸出結(jié)果映射。輸出結(jié)果類型可以是Map、List等集合類型,也可以是基本數(shù)據(jù)類型和POJO類型。輸出結(jié)果映射過程類似于JDBC對結(jié)果集的解析過程。1.6MyBatis下載與使用由于Mybatis是由第三方機構(gòu)負責升級維護的開源框架,沒有在IDE工具中集成,所以需要開發(fā)者手動下載jar包。1.6MyBatis下載與使用名稱說明asm-7.1.jar操作Java字節(jié)碼的類庫cglib-3.3.0.jar用來動態(tài)繼承Java類或?qū)崿F(xiàn)接口commons-logging-1.2.jar用于通用日志處理javassist-3.27.0-GA.jar分析、編碼和創(chuàng)建Java類庫log4j-api-2.13.3.jarlog4j到log4j2的橋接包ognl-3.3.4.jar支持ognl表達式的解析reload4j-1.2.24.jar一個更強大的日志管理器,目的是為了解決log4j中的漏洞slf4j-api-2.0.6.jar提供日志接口并提供獲取具體日志對象的方法lib文件夾存放了MyBatis運行依賴的jar包,一共包括8個jar文件,每個jar的具體作用見表9-2的說明。mybatis-3.5.13.jar是MyBatis的核心類庫,mybatis-3.5.13.pdf是MyBatis的參考文檔,介紹了MyBatis的簡單使用說明和案例,在項目開發(fā)中,導入mybatis-3.5.13.jar包和其依賴的另外8個jar即可。MyBatis重要API簡介本節(jié)將對MyBatis的重要API接口進行重點講解。1.ResourcesResources是MyBatis的加載資源的工具類,位于org.apache.ibatis.io.Resources包中,其核心方法是getResourceAsStream(StringfileName),用于通過類加載器返回指定資源的字節(jié)輸入流,返回值類型為InputStream。2MyBatis重要API簡介本節(jié)將對MyBatis的重要API接口進行重點講解。2.SqlSessionFactorySqlSessionFactory對象是由SqlSessionFactoryBuilder對象創(chuàng)建的,SqlSessionFactoryBuilder對象通過調(diào)用build()方法創(chuàng)建SqlSessionFactory對象2MyBatis重要API簡介本節(jié)將對MyBatis的重要API接口進行重點講解。3.SqlSessionSqlSession對象是MyBatis應用中的核心對象,類似于JDBC編程中的Connection對象,其首要作用是執(zhí)行持久化操作,具有強大功能,在軟件開發(fā)中最為常見、使用頻率也最高。2MyBatis的配置文件配置文件對MyBatis的整個運行體系產(chǎn)生影響,它包含了很多控制MyBatis功能的重要信息,是MyBatis實現(xiàn)功能的重要保證。在開發(fā)過程中,當需要更改MyBatis的配置信息時,只需要更改配置文件中的相關元素及屬性即可,具有良好的可擴展性。3MyBatis的配置文件33.1properties元素<properties>用于配置屬性的元素,MyBatis支持<properties>元素的兩種配置方式:properties文件和<property>子元素。1.properties文件properties元素可以通過resource屬性指定外部properties文件,代碼如下:<propertiesresource="mybatisDemo/resources/perties"/>2.property子元素配置<properties>元素通過其子元素<property>完成屬性傳遞,例如:通過properties子元素property配置username和password變量,代碼如下:<properties><propertyname="username"value="root"/><propertyname="password"value="root"/></properties>3.2settings元素settings元素用于配置MyBatis的運行時行為,它能深刻的影響MyBatis的底層運行,一般不需要大量配置,大部分情況下使用其默認值即可。3.3typeAliases元素由于類的完全限定名比較長,為了簡化開發(fā)、降低代碼的繁瑣度,MyBatis支持使用別名。別名就是為類設置一個簡短的名稱,方便開發(fā)人員代碼編寫。別名的設置一般通過配置文件中的<typeAliases>元素進行,具體代碼如下:<typeAliases><typeAliasalias="Student"type="com.exmple.model.Student"/></typeAliases>如果需要對同一個包下的多個類定義別名,則可以定義為:<typeAliases><packagename="com.exmple.model"/></typeAliases>3.4typeHandlers元素在程序運行過程中,當MyBatis為SQL語句設置參數(shù)或者從結(jié)果集中取值值,都需要進行數(shù)據(jù)類型的轉(zhuǎn)換,而這些工作都由typeHandler來完成。typeHandler,即類型轉(zhuǎn)換器,它的核心功能是根據(jù)程序運行需要將Java語言中的各種基本數(shù)據(jù)類型轉(zhuǎn)換成數(shù)據(jù)庫語言支持的JDBC類型,或者由JDBC類型轉(zhuǎn)換為Java的數(shù)據(jù)類型。在MyBatis內(nèi)部定義了一系列的typeHandler,滿足軟件開發(fā)的基本需要,例如:BoolTypeHandler能夠完成Boolean類型的雙向轉(zhuǎn)換、LongTypeHandler能夠完成Long類型的雙向轉(zhuǎn)換、ByteTypeHandler能夠完成Byte類型的雙向轉(zhuǎn)換,這些typeHandler無需顯示聲明,MyBatis會自動探測數(shù)據(jù)類型并完成轉(zhuǎn)換。3.5objectFactory元素MyBatis通過ObjectFactory(對象工廠)創(chuàng)建結(jié)果集對象,在默認情況下,MyBatis通過其定義的DefaultObjectFactory類完成相關的工作。但是,在實際開發(fā)中,當需要干預結(jié)果集對象的創(chuàng)建過程時,就需要自定義ObjectFactory。MyBatis支持自定義ObjectFactory,自定義ObjectFactory分為兩個環(huán)節(jié):首先要編寫ObjectFactory類,其次要完成配置。自定義的ObjectFactory類通常要實現(xiàn)ObjectFactory接口或繼承DefaultObjectFactory類,編寫完ObjectFactory類之后,要將該ObjectFactory類配置到MyBatis的配置文件中。MyBatis通過<ObjectFactory>元素配置<ObjectFactory>,具體示例代碼如下。<objectFactorytype="com.exmple.factory.MyObjectFactory"/>3.6environments元素MyBatis支持多種環(huán)境,使用不同的環(huán)境可以操作不同的數(shù)據(jù)庫,并且MyBatis可以將相同的SQL映射應用到多種數(shù)據(jù)庫。通過修改運行環(huán)境,MyBatis能夠匹配數(shù)據(jù)庫的常見需求,例如:開發(fā)環(huán)境、測試環(huán)境、運行環(huán)境之間的隨意切換,讓多個數(shù)據(jù)庫使用相同的SQL映射。environment是environments的子元素,用來配置MyBatis的一套運行環(huán)境,需指定運行環(huán)境ID、事務管理、數(shù)據(jù)源配置等相關信息。3.6environments元素1.transactionManager元素MyBatis支持兩種事務管理器類型,即JDBC類型和MANAGED類型。如果使用JDBC類型的事務管理器,則應用程序服務器負責事務管理操作,例如事務提交、事務回滾等。如果使用MANAGED類型的事務管理器,則應用程序服務器僅負責管理連接生命周期,事務的管理由MyBatis負責。3.6environments元素2.dataSource元素用于配置數(shù)據(jù)庫的連接屬性,例如要連接的數(shù)據(jù)庫的驅(qū)動程序名稱、URL地址、用戶名和密碼等。dataSource中的type屬性用于指定數(shù)據(jù)源類型,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論