軟件架構(gòu)設(shè)計(jì)實(shí)踐-基于SSM框架 課件 姚登舉 第7-11章 SpringMVC基礎(chǔ)-數(shù)字化社區(qū)管理系統(tǒng)_第1頁
軟件架構(gòu)設(shè)計(jì)實(shí)踐-基于SSM框架 課件 姚登舉 第7-11章 SpringMVC基礎(chǔ)-數(shù)字化社區(qū)管理系統(tǒng)_第2頁
軟件架構(gòu)設(shè)計(jì)實(shí)踐-基于SSM框架 課件 姚登舉 第7-11章 SpringMVC基礎(chǔ)-數(shù)字化社區(qū)管理系統(tǒng)_第3頁
軟件架構(gòu)設(shè)計(jì)實(shí)踐-基于SSM框架 課件 姚登舉 第7-11章 SpringMVC基礎(chǔ)-數(shù)字化社區(qū)管理系統(tǒng)_第4頁
軟件架構(gòu)設(shè)計(jì)實(shí)踐-基于SSM框架 課件 姚登舉 第7-11章 SpringMVC基礎(chǔ)-數(shù)字化社區(qū)管理系統(tǒng)_第5頁
已閱讀5頁,還剩304頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

Architecture

Design

Practice

Based

on

SSM

Framework第7章SpringMVC基礎(chǔ)12345MVC的概念Spring

MVC概述請(qǐng)求的響應(yīng)請(qǐng)求參數(shù)的綁定視圖與視圖的選擇MVC的概念MVC的概念圖形用戶界面(GUI)的三個(gè)關(guān)注點(diǎn):數(shù)據(jù)的呈現(xiàn)、UI邏輯、業(yè)務(wù)邏輯自治視圖(AutonomousView):將三個(gè)關(guān)注點(diǎn)糅合在一起,它的問題:重用性低穩(wěn)定性差可測(cè)試性差MVC的概念關(guān)注點(diǎn)分離(SeparationofConcerns,SoC):將各個(gè)關(guān)注點(diǎn)分離開,并通過合理的接口將它們之間的依賴降到最低MVC模式:即模型(model)-視圖(view)-控制器(controller)模式就是實(shí)現(xiàn)關(guān)注點(diǎn)分離的一種軟件設(shè)計(jì)模式MVC的概念MVC的組成部分model:對(duì)應(yīng)用狀態(tài)和業(yè)務(wù)功能的封裝,它接受controller的請(qǐng)求并完成相應(yīng)的業(yè)務(wù)處理,并在應(yīng)用狀態(tài)改變時(shí)向view發(fā)出通知view:呈現(xiàn)界面,捕捉輸入controller:接受view捕捉的用戶輸入,如果有業(yè)務(wù)邏輯調(diào)用,則調(diào)用model的相應(yīng)功能,根據(jù)需要選擇向用戶呈現(xiàn)的viewMVC的概念MVC的概念要點(diǎn)controller的主要職責(zé)是封裝UI邏輯和選擇要呈現(xiàn)的view。model和view之間有直接聯(lián)系。view可以調(diào)用model查詢其狀態(tài)信息;model的狀態(tài)發(fā)生變化時(shí),直接通知view。MVC僅僅是一個(gè)基本的指導(dǎo)方針,是一個(gè)寬泛的概念。MVC的概念存在的問題增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性三個(gè)部分的職責(zé)不平衡view和model沒有解耦實(shí)際應(yīng)用中,model和controller的職責(zé)不容易劃分清楚Spring

MVC概述Spring

MVC概述結(jié)構(gòu)前端控制器DispatcherServlet處理器映射器HandlerMapping處理器適配器HandlerAdapter處理器Handler視圖解析器ViewResolverSpring

MVC概述Spring

MVC概述創(chuàng)建Spring

MVC應(yīng)用的步驟創(chuàng)建Java

Web應(yīng)用程序?qū)氡匾膉ar包,或在項(xiàng)目管理工具中配置依賴項(xiàng)創(chuàng)建控制器類創(chuàng)建作為視圖的jsp文件創(chuàng)建Spring配置文件在web.xml中配置前端控制器請(qǐng)求的響應(yīng)請(qǐng)求的響應(yīng)讓一個(gè)函數(shù)響應(yīng)HTTP請(qǐng)求,我們做了這些事在類上應(yīng)用@Controller注解,將類標(biāo)注為控制器Bean在方法上應(yīng)用@RequestMapping注解,將方法標(biāo)注為處理器方法返回一個(gè)ModelAndView類的實(shí)例,是對(duì)Model和View的抽象,它封裝了數(shù)據(jù),并選擇了一個(gè)視圖在視圖文件里,取出ModelAndView中的數(shù)據(jù)并顯示在頁面上請(qǐng)求的響應(yīng)Spring

MVC響應(yīng)請(qǐng)求的過程Web應(yīng)用程序啟動(dòng),控制器類的Bean被實(shí)例化(@Controller)前端控制器(Servlet)攔截客戶端請(qǐng)求對(duì)請(qǐng)求路徑進(jìn)行解析如果是對(duì)處理器的請(qǐng)求,則執(zhí)行相應(yīng)處理器方法(@RequestMapping)根據(jù)處理器返回值,找到相應(yīng)視圖請(qǐng)求的響應(yīng)@RequestMapping注解作用1.用在方法上,將一個(gè)方法標(biāo)注為處理器如上處理器的請(qǐng)求路徑就是:網(wǎng)站根路徑/student-list請(qǐng)求的響應(yīng)@RequestMapping注解作用2.用在類上,為類中的處理器提供一個(gè)統(tǒng)一的請(qǐng)求父路徑如上處理器的請(qǐng)求路徑就是:網(wǎng)站根路徑/student/list成員名類型含義valueString、String[]請(qǐng)求路徑pathString、String[]value的別名nameString處理器名methodRequestMethod、RequestMethod[]指定這個(gè)處理器可以響應(yīng)的請(qǐng)求方式paramsString、String[]指定這個(gè)處理器只能響應(yīng)包含特定參數(shù)(以及值)的請(qǐng)求headersString、String[]指定這個(gè)處理器只能響應(yīng)請(qǐng)求頭中包含特定域的請(qǐng)求consumesString、String[]指定這個(gè)處理器只能響應(yīng)特定內(nèi)容類型的請(qǐng)求producesString、String[]指定這個(gè)處理器返回的響應(yīng)體的類型請(qǐng)求的響應(yīng)請(qǐng)求的響應(yīng)method成員類型:RequestMethod,或RequestMethod數(shù)組作用:指定處理器可以響應(yīng)的請(qǐng)求方式注意事項(xiàng):SpringMVC支持8種HTTP請(qǐng)求方法如果提供RequestMethod數(shù)組,則會(huì)響應(yīng)數(shù)組中指定的請(qǐng)求方式如果請(qǐng)求的方法不被響應(yīng),則會(huì)返回405(Method

Not

Allowed)錯(cuò)誤如果不指定該成員,默認(rèn)響應(yīng)所有類型的請(qǐng)求請(qǐng)求的響應(yīng)常見的HTTP狀態(tài)碼1xx:信息,服務(wù)器收到請(qǐng)求,需要請(qǐng)求者繼續(xù)執(zhí)行操作2xx:成功,操作被成功接收并處理3xx:重定向,需要進(jìn)一步的操作以完成請(qǐng)求4xx:客戶端錯(cuò)誤,請(qǐng)求包含語法錯(cuò)誤或無法完成請(qǐng)求5xx:服務(wù)器錯(cuò)誤,服務(wù)器在處理請(qǐng)求的過程中發(fā)生了錯(cuò)誤狀態(tài)碼名稱含義200OK請(qǐng)求成功(一般性的成功)201Created請(qǐng)求成功并創(chuàng)建了資源,用于POST請(qǐng)求204No

Content請(qǐng)求成功但未返回內(nèi)容,一般用于DELETE請(qǐng)求400Bad

Request請(qǐng)求的語法錯(cuò)誤,服務(wù)器無法理解401Unauthorized要求用戶身份認(rèn)證403Forbidden服務(wù)器理解此請(qǐng)求,但拒絕執(zhí)行此請(qǐng)求404Not

Found請(qǐng)求的資源無法找到405Method

Not

Allowed請(qǐng)求方法被禁止406Not

Acceptable服務(wù)器無法根據(jù)客戶端請(qǐng)求的內(nèi)容特性完成請(qǐng)求415Unsupported

Media

Type服務(wù)器無法處理請(qǐng)求附帶的媒體格式500Internal

Server

Error服務(wù)器內(nèi)部錯(cuò)誤請(qǐng)求的響應(yīng)方法名含義GET向特定的資源發(fā)出請(qǐng)求,數(shù)據(jù)包含在請(qǐng)求路徑中。POST向指定資源提交數(shù)據(jù),數(shù)據(jù)包含在請(qǐng)求體中,POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。HEAD向服務(wù)器請(qǐng)求與GET請(qǐng)求相一致的響應(yīng),只不過響應(yīng)體將不會(huì)被返回。PUT向指定資源位置上傳新數(shù)據(jù)DELETE請(qǐng)求刪除指定位置上的資源PATCH局部更新指定位置上的資源OPTIONS返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法TRACE回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷請(qǐng)求的響應(yīng)請(qǐng)求的響應(yīng)由于GET、POST、DELETE、PUT、PATCH這幾類請(qǐng)求很常用,Spring

MVC提供了如下幾個(gè)注解代替@RequestMapping@GetMapping@PostMapping@DeleteMapping@PutMapping@PatchMapping請(qǐng)求的響應(yīng)params成員類型:String或String[]作用:指明只響應(yīng)包含特定的參數(shù)和參數(shù)值的請(qǐng)求常見格式:params="id",表示請(qǐng)求中必須包含名為id的參數(shù)params="id=1",表示請(qǐng)求中必須包含名為id的參數(shù),且值必須為1params={"id=1","otherParam"},表示請(qǐng)求中必須包含名為id,otherParam兩個(gè)參數(shù),且id必須為1請(qǐng)求的響應(yīng)params成員注意:如果請(qǐng)求中不包含必要的參數(shù)或參數(shù)值,則會(huì)返回400(Bad

Request)錯(cuò)誤請(qǐng)求的響應(yīng)headers成員類型:String或String[]作用:指明只響應(yīng)請(qǐng)求頭中包含特定內(nèi)容的請(qǐng)求注意事項(xiàng):如果沒有提供必要的請(qǐng)求頭,會(huì)返回404(Not

Found)錯(cuò)誤請(qǐng)求的響應(yīng)consumes成員類型:String或String[]作用:指明只響應(yīng)具有特定內(nèi)容類型(Content-Type)的請(qǐng)求注意事項(xiàng):通過GET方式提交的請(qǐng)求沒有請(qǐng)求體,因此請(qǐng)求頭中也沒有Content-Type這個(gè)成員的作用實(shí)際上是聲明服務(wù)器對(duì)何種格式的請(qǐng)求體數(shù)據(jù)具備處理能力如果請(qǐng)求中沒有提供指定的內(nèi)容類型,會(huì)返回415(Unsupported

Media

Type)錯(cuò)誤請(qǐng)求的響應(yīng)produces成員類型:String或String[]作用:指明只有當(dāng)請(qǐng)求頭中的Accept字段包含特定內(nèi)容時(shí)才響應(yīng)注意事項(xiàng):這個(gè)成員的作用實(shí)際上是聲明服務(wù)器可以提供何種格式的響應(yīng)體數(shù)據(jù)如果請(qǐng)求中的Accept字段值與produces成員不符,則會(huì)返回406(Not

Acceptable)錯(cuò)誤請(qǐng)求參數(shù)的綁定請(qǐng)求參數(shù)的綁定請(qǐng)求參數(shù)的綁定解決的問題是:客戶端隨請(qǐng)求發(fā)送的數(shù)據(jù)(請(qǐng)求參數(shù))在服務(wù)器端如何獲取請(qǐng)求參數(shù)的綁定字面值的綁定Spring

MVC會(huì)默認(rèn)將客戶端提交的同名參數(shù)賦值給處理器的入?yún)?,并進(jìn)行類型解析請(qǐng)求參數(shù)的綁定@RequestParam注解用于處理器的入?yún)⒆饔茫褐该骺蛻舳颂峤坏膮?shù)和處理器入?yún)⒌慕壎P(guān)系成員:name,指明客戶端提交的參數(shù)名成員:require,指明參數(shù)是否為必須,默認(rèn)為true如果上述兩個(gè)成員的條件不滿足,會(huì)返回一個(gè)400(Bad

Request)錯(cuò)誤請(qǐng)求參數(shù)的綁定此處“name”即為客戶端提交的參數(shù)名,客戶端頁面可能是:請(qǐng)求參數(shù)的綁定對(duì)象類型參數(shù)的綁定有時(shí)會(huì)把多個(gè)請(qǐng)求參數(shù)封裝在一個(gè)實(shí)體對(duì)象中,便于處理器處理。此時(shí),SpringMVC會(huì)自動(dòng)去找對(duì)象中各個(gè)屬性,然后綁定同名請(qǐng)求參數(shù)。請(qǐng)求參數(shù)的綁定對(duì)應(yīng)的客戶端頁面可能是:如將stuName和age封裝為Student類的屬性后,處理器代碼為:請(qǐng)求參數(shù)的綁定客戶端提交數(shù)組通常出現(xiàn)在頁面中使用復(fù)選框的時(shí)候。此時(shí)如果提交數(shù)據(jù),勾選的復(fù)選框?qū)?yīng)的參數(shù)會(huì)作為數(shù)組元素提交到處理器。請(qǐng)求參數(shù)的綁定處理器代碼注意事項(xiàng):綁定數(shù)組元素時(shí)也會(huì)進(jìn)行類型解析,如果轉(zhuǎn)換不成功會(huì)報(bào)錯(cuò)請(qǐng)求參數(shù)的綁定路徑變量把請(qǐng)求參數(shù)作為請(qǐng)求路徑的一部分,這一部分可以被Spring

MVC解析出來并綁定到處理器入?yún)⑸辖壎ǚ椒ˊRequestMapping注解的請(qǐng)求路徑成員中,放在{}內(nèi)的部分就會(huì)被當(dāng)做一個(gè)路徑變量在處理器入?yún)⑸鲜褂聾PathVariable注解,則會(huì)將二者進(jìn)行綁定請(qǐng)求參數(shù)的綁定處理器代碼請(qǐng)求參數(shù)的綁定使用路徑變量注意事項(xiàng)路徑變量的名字如果與@PathVariable標(biāo)注的處理器入?yún)⒉煌?,需要使用@PathVariable的value成員指明,如@PathVariable("id")

String

cid入?yún)⒈仨氂聾PathVariable注解標(biāo)注,否則這個(gè)參數(shù)會(huì)被當(dāng)做請(qǐng)求路徑問號(hào)后面的請(qǐng)求參數(shù)聲明了路徑變量必須提供,否則會(huì)得到一個(gè)404(Not

Found)錯(cuò)誤數(shù)據(jù)校驗(yàn)數(shù)據(jù)校驗(yàn)確定綁定的參數(shù)的數(shù)據(jù)類型和值的合法性。在JSR-303中,提供了一組用于實(shí)體數(shù)據(jù)校驗(yàn)的注解,通過在實(shí)體類的屬性上使用這些注解,來對(duì)要注入的屬性值進(jìn)行限制。數(shù)據(jù)校驗(yàn)JSR-303數(shù)據(jù)校驗(yàn)注解@Null:檢查對(duì)象是否為null@NotNull:檢查對(duì)象是否不為null@AssertTrue:檢查Boolean值是否為true@AssertFalse:檢查Boolean值是否為false@Min(value):檢查數(shù)值是否大于等于給定值@Max(value):檢查數(shù)值是否小于等于給定值@DecimalMin(value):檢查BigDecimal是否大于等于給定值@DecimalMax(value):檢查BigDecimal是否小于等于給定值@Size(max,min):檢查集合的大小是否在給定范圍內(nèi)@Digits(integer,fraction):檢查字符串是否符合指定的數(shù)值格式@Past:檢查日期時(shí)間類型值是否在當(dāng)前時(shí)間之前@Future:檢查日期時(shí)間類型值是否在當(dāng)前時(shí)間之后數(shù)據(jù)校驗(yàn)HibernateValidator附加注解@Length(min,max):檢查字符串長(zhǎng)度是否在給定范圍內(nèi)@NotBlank:檢查字符串是否為null,以及是否為空白@NotEmpty:檢查字符串是否為null,以及是否為empty@URL:檢查字符串是否為URL格式@Range(min,max):檢查數(shù)值是否介于給定的范圍內(nèi)@UniqueElements:檢查集合中的元素是否沒有重復(fù)@Email:檢查字符串是否為email格式數(shù)據(jù)校驗(yàn)實(shí)體類代碼數(shù)據(jù)校驗(yàn)處理器代碼數(shù)據(jù)校驗(yàn)說明在需要校驗(yàn)的實(shí)體對(duì)象前使用注解@Valid,表示對(duì)該對(duì)象中的屬性進(jìn)行校驗(yàn)。BindingResult類封裝校驗(yàn)結(jié)果信息。如果校驗(yàn)未通過會(huì)拋出BindException異常。視圖與視圖的選擇視圖與視圖的選擇SpringMVC支持的主要視圖類型和對(duì)應(yīng)的視圖實(shí)現(xiàn)類視圖實(shí)現(xiàn)類視圖類型InternalResourceView封裝服務(wù)器內(nèi)部資源,該資源通過URL定位AbstractExcelViewExcel文檔視圖的抽象類,可基于它實(shí)現(xiàn)自己的Excel文檔視圖。AbstractPdfViewPdf文檔視圖的抽象類,可基于它實(shí)現(xiàn)自己的Pdf文檔視圖。FreeMarkerView使用FreeMarker模板引擎的視圖VelocityView使用Velocity模板引擎的視圖視圖解析器類別視圖解析器實(shí)現(xiàn)類作用Bean名解析器BeanNameViewResolver將邏輯視圖名解析為Bean的名字,用于解析文檔視圖或其它自定義視圖URL解析器InternalResourceViewResolver將邏輯視圖名解析為一個(gè)URL模板文件解析器FreeMarkerViewResolver解析為基于FreeMarker模板引擎的模板文件模板文件解析器VelocityViewResolver解析為基于Velocity模板引擎的模板文件概述解析每種視圖需要不同的視圖解析器,每個(gè)視圖解析器都對(duì)應(yīng)一個(gè)視圖解析器類常用的視圖解析器類:視圖與視圖的選擇Spring

MVC靠處理器的返回值選擇視圖,常見的返回值類型有:StringvoidModelAndView視圖與視圖的選擇返回String:去找與返回值對(duì)應(yīng)的視圖文件注意事項(xiàng):此時(shí)如果想使用Model保存數(shù)據(jù),需要將Model的實(shí)例作為入?yún)⒛J(rèn)的請(qǐng)求視圖方式是跳轉(zhuǎn)(forward),如果要想重定向,可以使用關(guān)鍵字。如:return

"redirect:/xxx/xxx.jsp"要寫出視圖文件的完整路徑,否則需要在配置文件中配置視圖解析器視圖與視圖的選擇此時(shí)就可以寫成:return

”student-list"配置視圖解析器視圖與視圖的選擇返回void:去找默認(rèn)視圖文件規(guī)則:默認(rèn)文件名是:視圖處理器的prefix+請(qǐng)求路徑名+視圖處理器的suffix如果請(qǐng)求路徑有多層,對(duì)應(yīng)的視圖文件路徑也應(yīng)該有多層視圖與視圖的選擇返回ModelAndView注意事項(xiàng):通過setViewName()設(shè)置視圖文件,默認(rèn)也是轉(zhuǎn)發(fā),如果要重定向,需要使用關(guān)鍵字如果沒有配置視圖解析器,setViewName()中也要寫視圖文件完整路徑Q&A

Time基于SSM框架的軟件架構(gòu)設(shè)計(jì)實(shí)戰(zhàn)Software

Architecture

Design

Practice

Based

on

SSM

Framework第8章Spring

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

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

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

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

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

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

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

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

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

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

HATEOAS處理器代碼:Q&A

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

Architecture

Design

Practice

Based

on

SSM

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

Architecture

Design

Practice

Based

on

SSM

Framework第10章單表的CRUD操作123數(shù)據(jù)查詢操作使用insert元素添加數(shù)據(jù)使用delete元素刪除數(shù)據(jù)4使用update元素修改數(shù)據(jù)5使用getMapper和工具類簡(jiǎn)化代碼編寫數(shù)據(jù)查詢操作查詢數(shù)據(jù)庫中的數(shù)據(jù)并交由面向?qū)ο蟮某绦蛟O(shè)計(jì)語言進(jìn)行處理是數(shù)據(jù)庫操作中最為常見的操作。在第9章的“第一個(gè)MyBatis應(yīng)用程序”中存在Student對(duì)象的兩個(gè)屬性沒有封裝成功的問題,在本章中將進(jìn)行詳細(xì)講解。11.1結(jié)果映射resultMap所謂結(jié)果映射就是讓數(shù)據(jù)表的字段名稱與Java實(shí)體類的屬性名稱進(jìn)行一一關(guān)聯(lián)匹配的機(jī)制,以便于MyBatis查完數(shù)據(jù)庫后能夠?qū)㈥P(guān)系數(shù)據(jù)庫的查詢結(jié)果正確地封裝為Java對(duì)象。1.1結(jié)果映射resultMapresultMap元素是對(duì)象關(guān)系映射文件<mapper>的子元素,主要完成對(duì)象屬性與數(shù)據(jù)表字段之間的關(guān)系對(duì)應(yīng),方便數(shù)據(jù)查詢使用。1.1結(jié)果映射resultMap1.1結(jié)果映射resultMap1.1結(jié)果映射resultMap針對(duì)第9章的“第一個(gè)MyBatis應(yīng)用程序”中Student的屬性stuId和stuName沒有封裝成功的問題,修改StudentMapper.xml文件,在其中加入如下代碼:<!--定義結(jié)果集映射,Student類屬性與數(shù)據(jù)表t_student字段--><resultMapid="studentResultMap"type="com.example.ssm.pojo.Student"><idproperty="stuId"column="stu_id"/><resultproperty="stuName"column="stu_name"/><resultproperty="age"column="age"/><resultproperty="sex"column="sex"/><resultproperty="email"column="email"/></resultMap>1.2使用selectList方法查詢使用selectOne查詢方法,能夠從數(shù)據(jù)庫中獲取一條數(shù)據(jù)并封裝成為一個(gè)POJO對(duì)象。但是實(shí)際項(xiàng)目開發(fā)中,很多時(shí)候通過查詢語句返回的是一個(gè)結(jié)果集(二維表),MyBatis框架提供了selectList查詢方法,其完整描述形式有三種:<E>List<E>selectList(Stringstatement)<E>List<E>selectList(Stringstatement,Objectparameter)<E>List<E>selectList(Stringstatement,Objectparameter,RowBoundsrowBounds)1.2使用selectList方法查詢其中,參數(shù)statement是在配置文件中定義的<select.../>元素的id,parameter是查詢所需的參數(shù),通常是對(duì)象或者M(jìn)ap,rowBounds對(duì)象用于分頁,它的兩個(gè)屬性:offset指查詢的當(dāng)前頁數(shù);limit指當(dāng)前頁顯示多少條數(shù)據(jù)。返回執(zhí)行SQL語句查詢結(jié)果的泛型對(duì)象的集合。1.2使用selectList方法查詢下面以只包含一個(gè)參數(shù)的selectList方法為例,結(jié)合新的需求“查詢用戶名中含字母‘a(chǎn)’的學(xué)員信息”,進(jìn)一步完善“第一個(gè)MyBatis應(yīng)用程序”。在StudentMapper.xml文件中添加如下代碼。1.3多參數(shù)查詢?cè)凇暗谝粋€(gè)MyBatis應(yīng)用程序”中,使用selectOne方法,傳入了一個(gè)整數(shù)型參數(shù)100,在使用selectList方法中,沒有傳入?yún)?shù),那么在多條件查詢中,需要傳入多個(gè)參數(shù),該如何處理呢?這就需要使用到查詢方法中的第二參數(shù)Objectparameter,在這里的Object可以使用Map類型,添加多個(gè)鍵-值對(duì),完成多參數(shù)的傳遞。1.3多參數(shù)查詢這里添加新的需求“查詢年齡大于19歲的男學(xué)員”,來完成多參數(shù)查詢的實(shí)例講解。在StudentMapper.xml文件中添加如下代碼。1.4動(dòng)態(tài)查詢查詢條件的多變性在很多系統(tǒng)中都有所體現(xiàn),例如購(gòu)物網(wǎng)站中的商品篩選,篩選條件有很多,每個(gè)人選的條件也都不一樣,那么最后拼接生成的SQL查詢語句也不相同,在傳統(tǒng)的JDBC或其它類似的開發(fā)框架中,開發(fā)人員通常需要手動(dòng)拼接SQL語句,在拼接時(shí)要確保添加了必要的空格、關(guān)鍵字等,還要注意去掉列表最后一個(gè)列名的逗號(hào)等諸多需要考慮的細(xì)節(jié)問題。1.4動(dòng)態(tài)查詢MyBatis提供了強(qiáng)大的動(dòng)態(tài)SQL功能,能夠根據(jù)傳遞的參數(shù)不同,靈活的生成SQL語句,完成不同條件組合的查詢?nèi)蝿?wù)。動(dòng)態(tài)SQL大大減少了編寫代碼的工作量,更體現(xiàn)了MyBatis的靈活性、高度可配置性和可維護(hù)性。1.4動(dòng)態(tài)查詢1.if元素MyBatis框架中提供的if元素類似于Java程序設(shè)計(jì)中的if語句,是MyBatis動(dòng)態(tài)SQL中最常用的判斷語句。使用if元素可以節(jié)省許多拼接SQL的工作,而把主要精力集中在Java代碼的編寫和XML配置文件的維護(hù)上。1.4動(dòng)態(tài)查詢2.where元素在if元素的例子當(dāng)中,讀者不難發(fā)現(xiàn),在where的后面需要手動(dòng)加入“1=1”的子句,原因就是為了避免當(dāng)if查詢條件都不成立時(shí),出現(xiàn)SQL語句錯(cuò)誤的問題。其實(shí)在MyBatis中提供了where元素,就是為了避免在多條件判斷的時(shí)候,出現(xiàn)關(guān)鍵字的冗余、缺失等情況。where元素主要用來簡(jiǎn)化SQL語句中的條件判斷,可以自動(dòng)處理AND/OR條件,語法如下所示。1.4動(dòng)態(tài)查詢3.choose元素與if元素的功能類似,choose元素同樣用于條件判斷,但不同的是choose元素適用于多個(gè)判斷條件的場(chǎng)景,類似于Java程序設(shè)計(jì)中的switch語言。在choose元素中包含when和otherwise兩個(gè)子元素,一個(gè)choose元素中至少包含一個(gè)when子元素,0個(gè)或1個(gè)otherwise子元素,與Java語言中的switch-case-default語句相同,都進(jìn)行“多選一”的條件判斷。當(dāng)應(yīng)用程序中業(yè)務(wù)關(guān)系比較復(fù)雜的時(shí)候,MyBatis可通過choose元素來動(dòng)態(tài)控制SQL語言的生成。1.4動(dòng)態(tài)查詢動(dòng)態(tài)語句choose-when-otherwise語法如下所示。1.4動(dòng)態(tài)查詢4.trim元素trim元素用于刪除拼接SQL語句中多余的關(guān)鍵字,它可以直接實(shí)現(xiàn)where元素的功能,在前面的SQL查詢語句中“where1=1”就是為了避免與后面的語句中“and”直接拼接。通過trim元素能夠在

溫馨提示

  • 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)論