Spring Boot企業(yè)級開發(fā)入門與實踐 課件 第3、4章 Spring Boot視圖技術、SpringBoot數據訪問_第1頁
Spring Boot企業(yè)級開發(fā)入門與實踐 課件 第3、4章 Spring Boot視圖技術、SpringBoot數據訪問_第2頁
Spring Boot企業(yè)級開發(fā)入門與實踐 課件 第3、4章 Spring Boot視圖技術、SpringBoot數據訪問_第3頁
Spring Boot企業(yè)級開發(fā)入門與實踐 課件 第3、4章 Spring Boot視圖技術、SpringBoot數據訪問_第4頁
Spring Boot企業(yè)級開發(fā)入門與實踐 課件 第3、4章 Spring Boot視圖技術、SpringBoot數據訪問_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章SpringBoot視圖技術本章內容:1.掌握Thymeleaf模板引擎2.掌握SpringBoot處理JSON數據3.掌握SpringBoot處理國際化問題4.掌握SpringBoot文件的上傳和下載5.掌握SpringBoot的異常處理engineeringSoftware3.1創(chuàng)建靜態(tài)Web頁面

SpringBoot項目在不使用任何模板引擎的前提下,想要直接訪問html頁面,是如何做呢?我們只需要把靜態(tài)文件(html,js,css)放在resource的static文件夾里面就可以正常訪問了。下面通過實例演示SpringBoot如何訪問靜態(tài)Web頁面。engineeringSoftwareSpringBoot默認不支持JSP,因為JSP相對于一些模板引擎,性能都比較低,官方推薦使用thymeleaf,如果想在項目中使用JSP,需要進行相關初始化工作。下面通過實例演示SpringBoot如何訪問JSP頁面。3.2SpringBoot對JSP的支持

engineeringSoftwareThymeleaf支持SpringExpressionLanguage語言作為方言,也就是SpEL,在學習JSP時我們對EL表達式都有一定的認識了,SpEL是可以用于Spring中的一種EL表達式。Thymeleaf的主要作用是把model中的數據渲染到html中,因此其語法主要是如何解析model中的數據。在HTML頁面中引入thymeleaf命名空間,即,此時在HTML模板文件中動態(tài)的屬性使用th:命名空間修飾。<htmllang="en"xmlns:th="">這樣才可以在其他標簽里面使用th:*這樣的語法,這是下面語法的前提。3.3Thymeleaf的基本語法

engineeringSoftwareThymeleaf通過${}來獲取model中的變量,注意這不是EL表達式,而是OGNL表達式,但是語法非常像。示例:我們在頁面獲取user數據:<h1>歡迎您:<spanth:text="${}">請登錄</span></h1>3.3.1變量表達式

engineeringSoftware感覺跟el表達式幾乎是一樣的。不過區(qū)別在于,我們的表達式寫在一個名為:th:text的標簽屬性中,這個叫做指令。Thymeleaf崇尚自然模板,意思就是模板是純正的html代碼,脫離模板引擎,在純靜態(tài)環(huán)境也可以直接運行?,F(xiàn)在如果我們直接在html中編寫${}這樣的表達式,顯然在靜態(tài)環(huán)境下就會出錯,這不符合Thymeleaf的理念。Thymeleaf中所有的表達式都需要寫在指令中,指令是HTML5中的自定義屬性,在Thymeleaf中所有指令都是以th:開頭。因為表達式${}是寫在自定義屬性中,因此在靜態(tài)環(huán)境下,表達式的內容會被當做是普通字符串,瀏覽器會自動忽略這些指令,這樣就不會報錯了!2.2全局配置

engineeringSoftware當數據量比較多的時候,頻繁的寫user.就會非常麻煩。因此,Thymeleaf提供了自定義變量來解決:<h2th:object="${user}"><p>姓名:<spanth:text="*{name}">Jack</span></p><p>年齡:<spanth:text="*{age}">21</span></p></h2>首先在h2上用th:object="${user}"獲取user的值,并且保存。然后,在h2內部的任意元素上,可以通過*{屬性名}的方式,來獲取user中的屬性,這樣就省去了大量的user.前綴了。th:object聲明變量一般情況下會好*{}一起配合使用,達到偷懶的效果。3.3.2自定義變量

engineeringSoftwareThymeleaf通過${}來獲取容器上下文環(huán)境中的變量,而表達式是ognl表達式。OGNL表達式本身支持方法的調用,例如:<h2th:object="${user}"><p>姓:<spanth:text="*{name.split('')[0]}">張</span></p><p>名:<spanth:text="*{name.split('')[1]}">三</span></p></h2>這里我們調用了name(是一個字符串)的split方法。3.3.3方法

engineeringSoftwareThymeleaf中提供了一些內置對象,并且在這些對象中提供了一些方法,方便我們來調用。獲取這些對象,需要使用

#對象名

來引用。3.3.3方法

engineeringSoftware(1)一些環(huán)境相關對象#ctx、#requset、#response、#session、#servletContext(2)Thymeleaf提供的全局對象:#dates、#calendars、#numbers、#strings、#bools、#arrays、#lists、#sets、#maps有的時候,我們需要在指令中填寫基本類型如:字符串、數值、布爾等,并不希望被Thymeleaf解析為變量,這個時候稱為字面值。(1)字符串字面值:使用一對單引號引用的內容就是字符串字面值。<p>你正在觀看<spanth:text="'thymeleaf'">template</span>的字符串常量值.</p>th:text

中的thymeleaf并不會被認為是變量,而是一個字符串。3.3.4字面值

engineeringSoftware(2)數字字面值數字不需要任何特殊語法,寫的什么就是什么,而且可以直接進行算術運算。<p>今年是<spanth:text="2022"></span>.</p><p>兩年后將會是<spanth:text="2022+2"></span>.</p>

(3)布爾字面值布爾類型的字面值是true或false:<divth:if="true">你填的是true</div>3.3.4字面值

engineeringSoftware我們經常會用到普通字符串與表達式拼接的情況:<spanth:text="'歡迎您:'+${}"></span>字符串字面值需要用單引號,拼接起來非常麻煩,Thymeleaf對此進行了簡化,使用一對|即可:<spanth:text="|歡迎您:${}|"></span>與上面是完全等效的,這樣就省去了字符串字面值的書寫。

3.3.5拼接

engineeringSoftware(1)算術運算支持的算術運算符:

+-*/%<spanth:text="${user.age}"></span><spanth:text="${user.age}%2==0"></span>(2)比較運算支持的比較運算:>、<、>=、<=、==、!=。注意==and!=不僅可以比較數值,還類似于equals的功能,對對象進行比較。<spanth:text="'你的年齡是否小于30:'+(${user.age}<30)"></span>3.3.6運算

engineeringSoftware(3)三元運算三元運算符的三個部分:conditon?then:else?condition:條件?then:條件成立的結果?else:不成立的結果其中的每一個部分都可以是Thymeleaf中的任意表達式。<spanth:text="'你的性別:'+(${user.sex}?'男':'女')"></span>3.3.6運算

engineeringSoftware(4)默認值有的時候,我們取一個值可能為空,這個時候需要做非空判斷,可以使用表達式“?:默認值”簡寫。<spanth:text="'你的年齡是'+(${user.age}?:20)"></span>當前面的表達式值為null時,就會使用后面的默認值。注意:

?:

之間沒有空格。3.3.6運算

engineeringSoftware假如有用戶的java.util.List集合:users在Context中。<trth:each="user:${users}"><tdth:text="${}"></td><tdth:text="${user.age}"></td><tdth:text="${user.sex}"></td></tr>3.3.7循環(huán)

engineeringSoftwarejava.util.List類型不是可以在Thymeleaf中使?迭代的唯?值類型,下面這些類型的對象都可以通過th:each進?迭代的:(1)任何實現(xiàn)java.util.Iterable接?的對象,其值將被迭代器返回,?不需要在內存中緩存所有值。(2)任何實現(xiàn)java.util.Enumeration接?的對象。(3)任何實現(xiàn)java.util.Map接?的對象,迭代映射時,iter變量將是java.util.Map.Entry類。(4)任何數組。(5)任何其將被視為包含對象本身的單值列表。3.3.7循環(huán)

engineeringSoftware迭代過程中,經常會使用到它的一些迭代狀態(tài),如:當前迭代的索引,迭代變量中的元素的總數,當前迭代的是奇數還是偶數,當前是否是第一個元素,當前是否是最后一個元素等等。狀態(tài)變量在每個th:each屬性中定義,并包含以下數據:(1)index屬性:當前迭代索引,從0開始(2)count屬性:當前的迭代計數,從1開始(3)size屬性:迭代變量中元素的總量(4)current屬性:每次迭代的iter變量,即當前遍歷到的元素(5)even/odd布爾屬性:當前的迭代是偶數還是奇數。(6)first布爾屬性:當前的迭代是否是第?個迭代(7)last布爾屬性:當前的迭代是否是最后?個迭代。3.3.7循環(huán)

engineeringSoftware很多時候只有在滿足某個條件時,才將?個模板片段顯示在結果中,否則不進行顯示。比如只有當用戶年齡小于18歲時,才為他為未成年人,否則不顯示。th:if屬性用于滿足這個需求。<spanth:if="${age}<18">未成年</span>3.3.8邏輯判斷

engineeringSoftwareth:if屬性不僅只以布爾值作為判斷條件,它將按照如下規(guī)則判定指定的表達式結果為true:(1)如果表達式結果為布爾值,則為true或者false(2)如果表達式的值為null,th:if將判定此表達式為false(3)如果值是數字為0時,判斷為false;不為零時,判定為true(4)如果value是String,值為“false”、“off”、“no”時,判定為false,否則判斷為true,字符串為空時,也判斷為true(5)如果值不是布爾值、數字、字符或字符串的其它對象,只要不為null,則判斷為trueth:unless是th:if的反向屬性,它們判斷的規(guī)則一致,只是if當結果為true時進行顯示,unless當結果為false進行顯示。3.3.8邏輯判斷

engineeringSoftwareth:switch/th:case與Java中的switch語句等效,有條件地顯示匹配的內容。只要其中一個th:case的值為true,則同一個switch語句中的其他th:case屬性都將被視為false。當有多個case的值為true時,則只取第一個。

switch語句的default選項指定為th:case=“*”,即當沒有case的值為true時,將顯示default的內容,如果有多個default,則只取第一個。3.3.9分支控制switch

engineeringSoftware

系統(tǒng)中的很多頁面有很多公共內容,例如菜單、頁腳等,這些公共內容可以提取放在一個稱為“模板片斷”的公共頁面里面,其它頁面可以引用這個。

模板片斷可以是html標簽,也可以使用th:fragment屬性定義片斷。

接下來就可以在Web頁面中使用th:insert、th:replace、th:include屬性來包含頁腳片段,其中這三個有些區(qū)別。

1.th:insert:當前標簽里面插入模板中的標簽

2.th:replace:替換當前標簽為模板中的標簽

3.th:include:在標簽里面插入模板的標簽內容3.3.10Thymeleaf模板片斷

engineeringSoftware

創(chuàng)建項目,選擇相應依賴3.4實現(xiàn)基于Thymeleaf的Web應用

engineeringSoftware項目創(chuàng)建成功之后,在pom.xml文件中就添加了Thymeleaf依賴,代碼如下。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>什么是國際化?例如我們的,進入是一個默認英文的網站,右上角有個中字,點一下就會幫我們切換成中文網站,這就是國際化。在SpringBoot的Web應用中實現(xiàn)頁面信息國際化非常簡單,下面通過實例講解國際化的實現(xiàn)過程。3.5SpringBoot中的頁面國際化實現(xiàn)

engineeringSoftwareSpringBoot確實為我們做了很多事情,但有時候我們想要自己定義一些Handler,Interceptor,ViewResolver,該怎么做呢。SpringBoot2.0后,該類被標記為@Deprecated。因此我們只能靠實現(xiàn)WebMvcConfigurer接口來實現(xiàn)。WebMvcConfigurer是一個接口,提供很多自定義的攔截器,例如跨域設置、類型轉化器等等。可以說此接口為開發(fā)者提前想到了很多攔截層面的需求,方便開發(fā)者自由選擇使用。SpringBoot推薦使用實現(xiàn)WebMvcConfigurer接口的實現(xiàn)類來實現(xiàn)代碼配置,代碼如下。@ConfigurationpublicclassMyConfigurerimplementsWebMvcConfigurer{}3.6SpringBoot集成SpringMVC

engineeringSoftwareSpringBoot確實為我們做了很多事情,但有時候我們想要自己定義一些Handler,Interceptor,ViewResolver,該怎么做呢。SpringBoot2.0后,該類被標記為@Deprecated。因此我們只能靠實現(xiàn)WebMvcConfigurer接口來實現(xiàn)。WebMvcConfigurer是一個接口,提供很多自定義的攔截器,例如跨域設置、類型轉化器等等??梢哉f此接口為開發(fā)者提前想到了很多攔截層面的需求,方便開發(fā)者自由選擇使用。SpringBoot推薦使用實現(xiàn)WebMvcConfigurer接口的實現(xiàn)類來實現(xiàn)代碼配置,代碼如下。@ConfigurationpublicclassMyConfigurerimplementsWebMvcConfigurer{}3.6.1配置自定義攔截器Interceptor

engineeringSoftware以前寫SpringMVC的時候,如果需要訪問一個頁面,必須要寫Controller類,然后再寫一個方法跳轉到頁面,感覺好麻煩,如上面“/index”,其實可以重寫WebMvcConfigurer中的addViewControllers方法即可達到效果了。

addViewControllers方法可以實現(xiàn)將一個無業(yè)務邏輯的請求直接映射為視圖,不需要編寫控制器來實現(xiàn),從而簡化了頁面跳轉。

修改上面的MyConfigurer配置類,在其實現(xiàn)類中,重寫addViewControllers方法,3.6.2跳轉指定頁面

engineeringSoftware后臺的開發(fā)過程中不可避免的就是一系列對JSON數據的返回,需要我們進行的就是提供各種各樣的數據。一般情況下數據類型最常用的就是JSON以及XML,在這里我們就講講在SpringBoot里面我們怎樣進行JSON數據的返回以及數據一些特殊情況的處理。JSON是目前主流的前后端數據傳輸方式,SpringMVC中使用消息轉化器HttpMessageConverter對JSON的轉換提供了很好的支持,在SpringBoot中對相關配置做了進一步簡化。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

3.7SpringBoot處理JSON數據

engineeringSoftwareSpringBoot處理JSON數據時,需要用到兩個重要的JSON格式轉換注解,分別是@RequestBody和@ResponseBody。@ResponseBody注解的作用是將controller的方法返回的對象通過適當的轉換器轉換為指定的格式之后,寫入到response對象的body區(qū),通常用來返回JSON數據或者是XML數據。@RequestBody是作用在形參列表上,用于將前臺發(fā)送過來固定格式的數據(xml格式或者JSON等)封裝為對應的JavaBean對象,封裝時使用到的一個對象是系統(tǒng)默認配置的HttpMessageConverter(消息轉換器)進行解析,然后封裝到形參上。3.7SpringBoot處理JSON數據

engineeringSoftwareRESTful架構風格是目前最流行的一種架構風格,它機構清晰、符合標準、易于理解、擴展方便,所以在Web開發(fā)中經常被使用。REST,全稱是RepresentationalStateTransfer,譯作“表現(xiàn)層狀態(tài)轉化”。RESTful架構是對MVC架構改進后所形成的一種架構,通過使用事先定義好的接口與不同的服務聯(lián)系起來。在RESTful架構中,瀏覽器使用POST,DELETE,PUT和GET四種請求方式分別對指定的URL資源進行增刪改查操作。因此,RESTful是通過URI實現(xiàn)對資源的管理及訪問,具有擴展性強、結構清晰的特點。

3.8SpringBoot實現(xiàn)RESTful風格Web應用

engineeringSoftwareRESTful架構將服務器分成前端服務器和后端服務器兩部分,前端服務器為用戶提供無模型的視圖;后端服務器為前端服務器提供接口。瀏覽器向前端服務器請求視圖,通過視圖中包含的AJAX函數發(fā)起接口請求獲取模型。

Restful是一種對URL進行規(guī)范的編碼風格,通常一個網址對應一個資源,訪問形式類似/xx/{id}/{id}。

舉個例子,當我們在某購物網站上買手機時會有很多品牌選擇,而每種品牌下又有很多型號,那么/mobile/iphone/6代表了Iphone6,/mobile/iphone/7和/mobile/iphone/8分別代表了Iphone7和Iphone8。3.8SpringBoot實現(xiàn)RESTful風格Web應用

engineeringSoftware在做Web開發(fā)的過程中,method常用的值是get和post??墒聦嵣希琺ethod值還可以是put和delete等等其他值。

既然method值如此豐富,那么就可以考慮使用同一個url,但是約定不同的method來實施不同的業(yè)務,這就是Restful的基本考慮。

CRUD是最常見的操作,在使用Restful風格之前,通常的增加做法是這樣的:/addCategory?name=xxx可是使用了Restful風格之后,增加就變成了:/categories3.8SpringBoot實現(xiàn)RESTful風格Web應用

engineeringSoftware

3.8SpringBoot實現(xiàn)RESTful風格Web應用

engineeringSoftware功能傳統(tǒng)風格Restful風格

urlmethodurlmethod增加/addCategory?name=xxxPOST/categoriesPOST刪除/deleteCategory?id=123GET/categories/123DELETE修改/updateCategory?id=123&name=yyyPOST/categories/123PUT獲取/getCategory?id=123GET/categories/123GET查詢/listCategoryGET/categoriesGET為了實現(xiàn)RESTfulAPI接口,SpringBoot提供了很多注解,對請求參數和返回數據格式做了封裝,方便用戶快速開發(fā)。@RestController一般用于Controller類上,指定所有接口返回的數據都是text/json格式。@ResponseBody用于方法上,指定接口返回text/json格式,用了@RestController就沒有必要用ResponseBody。@GetMapping用于方法上,是一個組合注解,與@RequestMapping(method=RequestMethod.GET)作用一致。@PostMapping用于方法上,是一個組合注解,與@RequestMapping(method=RequestMethod.POST)作用一致。

3.8SpringBoot實現(xiàn)RESTful風格Web應用

engineeringSoftware@PutMapping用于方法上,是一個組合注解,與@RequestMapping(method=RequestMethod.PUT)作用一致。@DeleteMapping用于方法上,是一個組合注解,與@RequestMappmg(method=RequestMethod.DELETE)作用一致。@RequestParam用于方法上,映射請求參數到java方法的參數,當前端傳遞的參數和后臺自己定義的參數不一致時,可以使用name屬性來標記。@PathVariable用于方法上,映射URL片段到java方法的參數。3.8SpringBoot實現(xiàn)RESTful風格Web應用

engineeringSoftwareSpringBoot我們大多數的時候是當做服務提供者來使用的,但是在一些場景中還是要用到一些文件上傳下載這種"非常規(guī)"操作的。那么怎么在SpringBoot中實現(xiàn)文件的上傳下載功能呢?想象一些我們在SpringMVC中是怎么做的。我們需要在SpringMVC的配置文件中增加文件上傳的Bean的配置,如下:<beanid="multipartResolver"class="mons.CommonsMultipartResolver"/>然后在后臺對應的處理方法中就可以直接獲取到文件的輸入流了。而對于SpringBoot來說,我們不需要配置文件上傳的解析類了,因為SpringBoot已經幫我們注冊好了。3.9.1文件上傳

engineeringSoftwareJava中的文件上傳一共涉及兩個組件,一個是CommonsMultipartResolver,另一個是StandardServletMultipartResolver,其中CommonsMultipartResolver使用commons-fileupload來處理multipart請求,而StandardServletMultipartResolver則是基于Servlet3.0來處理multipart請求的,因此若使用StandardServletMultipartResolver,則不需要添加額外的Jar包。而在SpringBoot提供的文件上傳自動化配置類MultipartAutoConfiguration中,默認也是采用StandardServletMultipartResolver。因此,在SpringBoot中上傳文件甚至可以做到零配置。下面來看具體上傳過程。3.9.1文件上傳

engineeringSoftware在我們的SpringBoot項目中,可能會存在讓用戶下載文檔的需求,比如讓用戶下載readme文檔來更好地了解該項目的概況或使用方法。所以,就需要為用戶提供可以下載文件的API,將用戶希望獲取的文件作為下載資源返回給前端。下面來看具體完成文件下載過程。3.9.2文件下載

engineeringSoftware在Java中,程序出現(xiàn)錯誤會拋出“不正常信息”(Throwable)。Throwable又被分為“錯誤”(Error)和“異?!保‥xception)。有別于人為失誤造成的“故障”(Bug),異常在程序中代表的是出現(xiàn)了當前代碼無法處理的狀況。例如:在一個對象不存在(值為Null)的情況下,調用該對象的某個方法引發(fā)了空指針;用戶輸入了一段URL,但并沒有找到對應的資源;一段計算過程中,0被當作除數等等情況。完善的錯誤處理,使程序不會意外崩潰甚至能友好地提示用戶進行正確操作,這是讓程序變得愈發(fā)健壯的重要處理步驟。在Java開發(fā)中,異常特別是檢查型異常(CheckedException),通常需要進行try/catch處理。而在基于SpringBoot的開發(fā)過程中,異常處理有了更多處理方式。3.10SpringBoot的異常統(tǒng)一處理

engineeringSoftware使用Web應用時,在請求處理過程中發(fā)生錯誤是非常常見的情況。SpringBoot為我們提供一個默認的映射:/error,當處理中拋出異常之后,會轉到該請求中處理,并且該請求有一個全局的錯誤頁面來展示異常內容。比如現(xiàn)在啟動項目之后,在瀏覽器中隨便輸入一個訪問地址,由于地址不存在,SpringBoot會跳轉到錯誤頁面。雖然SpringBoot為我們提供了默認的錯誤頁面映射,但是在實際應用中,上圖所示的錯誤頁面對用戶來說并不友好,我們需要自己來實現(xiàn)異常提示,接下來將演示自己實現(xiàn)錯誤的提示頁面。3.10.1自定義error頁面

engineeringSoftware在SpringBoot中定制錯誤頁面一共有三種方法,分別如下。1)將錯誤頁面命名為“錯誤狀態(tài)碼.html”放在模板引擎templates/error文件夾下,當發(fā)生此狀態(tài)碼的錯誤就會來到對應的頁面。例如404.html,500.html。同時我們也可以使用模糊匹配的方式來定義錯誤頁面的名稱,可以將錯誤頁面命名為4xx.html和5xx.html,來匹配對應類型的所有錯誤。精確匹配的查找方式要優(yōu)先于模糊匹配的方式。2)如果templates/error目錄下沒有自定義的錯誤頁面,那么需要在static/error目錄下定義4xx.html或5xx.html頁面。3)直接在templates目錄下創(chuàng)建error.html,這樣當訪問錯誤或異常時,就自動找到該頁面作為錯誤頁面。3.10.1自定義error頁面

engineeringSoftware我們不難發(fā)現(xiàn)使用自定義error頁面并沒有真正處理異常,在本節(jié)我們可以@ExceptionHandler注解處理異常。該注解主要用于在Controller層面進行相同類型的異常處理。在對應Controller類中定義異常處理方法,并為其使用@ExcptionHandler注解。Spring將檢測到該注解,把該方法注冊為對應異常類及其子類的異常處理程序。3.10.2@ExceptionHandler注解

engineeringSoftwareSpringMVC框架提供了另一種方式來為多個控制器類提供共同的方法:利用@ControllerAdvice注解來定義一個控制器增強類??刂破髟鰪婎惒⒉皇强刂破黝惖母割悺T诔绦蜻\行時,SpringMVC框架會把控制器增強類的方法代碼塊動態(tài)注入到其他控制器類中,通過這種方式來增強控制器類的功能。3.10.3@ControllerAdvice注解

engineeringSoftware第4章

SpringBoot數據訪問本章內容:1.掌握SpringBoot整合JDBC2.掌握SpringBoot整合MyBatis3.掌握SpringBoot整合JPA4.掌握數據緩存CacheengineeringSoftware4.1SpringBoot整合JDBC

在開發(fā)中,通常會涉及對數據庫的數據進行操作,SpringBoot在簡化項目開發(fā)以及實現(xiàn)自動化配置的基礎上,對關系型數據庫和非關系型數據庫的訪問操作都提供了非常好的整合支持。用SpringBoot框架開發(fā)時,我們常用的ORM框架有JDBC、MyBatis、Hibernate、JPA等,接下來我們學習SpringBoot整合JDBC的實現(xiàn)。engineeringSoftware無論是SQL還是NoSQL,SpringBoot默認采用整合SpringData的方式進行統(tǒng)一處理,添加大量自動配置,屏蔽了很多設置,引入各種xxxTemplate、xxxRepository來簡化我們對數據訪問層的操作。對我們來說,只需要進行簡單的設置即可。我們需要用什么數據訪問,就引入相關的start進行開發(fā)。4.1.1SpringData簡介

engineeringSoftwareSpring框架針對數據庫開發(fā)中的應用提供了JDBCTemplate類,該類是Spring對JDBC支持的核心,它提供了所有對數據庫操作功能的支持。Spring框架提供的JDBC支持主要由四個包組成,分別是core(核心包)、object(對象包)、dataSource(數據源包)和support(支持包),org.springframework.jdbc.core.JdbcTemplate類就包含在核心包中。作為SpringJDBC的核心,JdbcTemplate類中包含了所有數據庫操作的基本方法。4.1.2整合JDBCTemplate

engineeringSoftwareJdbcTemplate主要提供以下五類方法:execute方法:可以用于執(zhí)行任何SQL語句,一般用于執(zhí)行DDL語句;update方法及batchUpdate方法:update方法用于執(zhí)行新增、修改、刪除等語句;batchUpdate方法用于執(zhí)行批處理相關語句;query方法及queryForXXX方法:用于執(zhí)行查詢相關語句;call方法:用于執(zhí)行存儲過程、函數相關語句。4.1.2整合JDBCTemplate

engineeringSoftware在SpringBoot應用中,如果使用JdbcTemplate操作數據庫,那么只需要在pom.xml文件中添加spring-boot-starter-jdbc模塊,即可通過@Autowired注解依賴注人JdbcTemplate對象,然后調用JdbcTemplate提供的方法操作數據庫。下面通過實例講解如何在SpringBoot應用中使用JdbcTemplate操作數據庫4.1.2整合JDBCTemplate

engineeringSoftware使用數據庫連接池主要考慮到程序與數據庫建立連接的性能。創(chuàng)建一個新的數據庫是一個很耗時的過程,在使用完之后,可能還需要不斷的釋放建立的連接,對資源的損耗大。而采用數據庫連接池之后,首先就創(chuàng)建了固定數量的數據庫連接,需要用的時候使用即可。當然,這樣做的一個缺點是,可能某些時候完全沒有數據庫請求,但是也保持了數據庫的最小連接數,浪費了資源。不過這種浪費資源相對于完全不采用數據庫連接池還是很有優(yōu)勢的。4.1.3數據庫連接池Druid

engineeringSoftwareDruid是阿里巴巴開源平臺上一個數據庫連接池實現(xiàn),結合了C3P0、DBCP等數據連接池的優(yōu)點,同時加入了日志監(jiān)控。Druid可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,天生就是針對監(jiān)控而生的數據連接池。Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環(huán)境大規(guī)模部署的嚴苛考驗。SpringBoot2.0以上默認使用Hikari數據源,可以說Hikari與Driud都是當前JavaWeb上最優(yōu)秀的數據源,我們來重點介紹SpringBoot如何集成Druid數據源。4.1.3數據庫連接池Druid

engineeringSoftware我們都知道在使用SpringBoot的過程中,常用的持久化解決方案主要有兩種,一種是Mybatis框架,另一個就是SpringDataJPA。而SpringDataJPA和MyBatis最大的區(qū)別就是SpringDataJPA是Spring親生的,這個從名字的命名方式上也能看出來,為什么這么說呢?如果大家用過Mybatis的話應該會發(fā)現(xiàn),Mybatis依賴的artifactId是mybatis-spring-boot-starter,而SpringDataJPA依賴的artifactId卻是spring-boot-starter-data-jpa,從這個名字關鍵字(mybatis、jpa)的順序上,我們就能看出來誰才是親生的。雖然不是親生的,但是Mybatis憑借自己輕巧靈活的身姿(易上手、動態(tài)SQL等),贏得了廣大開發(fā)者的喜愛。4.2SpringBoot整合MyBatis

engineeringSoftwareMyBatis是一款優(yōu)秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。MyBatis避免了幾乎所有的JDBC代碼和手動設置參數以及獲取結果集。MyBatis可以使用簡單的XML或注解來配置和映射原生信息,將接口和Java的POJOs(PlainOldJavaObjects,普通的Java對象)映射成數據庫中的記錄。下面通過例題講解SpringBoot整合MyBatis。4.2SpringBoot整合MyBatis

engineeringSoftware對數據庫進行操作就需要編寫SQL語句,這里將沿用Spring整合MyBatis的方式,將SQL語句放在XML配置文件中。#mapper配置文件 mybatis.mapper-locations=classpath:mapper/*.xml #實體類的別名 mybatis.type-aliases-package=.boot.springboot04_03.po #開啟駝峰命名 mybatis.configuration.map-underscore-to-camel-case=true4.2.1使用配置文件的方式整合MyBatis

engineeringSoftware通過上一小節(jié)的實例可以看到,相對于Mybatis初期使用,即需要各種配置文件、實體類、Dao層映射關聯(lián)等,SpringBoot以配置文件的方式整合MyBatis已經簡化了很多。但是通過使用注解,可以進一步進行簡化,不需要任何XML配置文件。下面我們介紹這種模式,實現(xiàn)簡單配置,輕松上手。@Select@Insert@Update@Delete4.2.2使用注解的方式整合MyBatis

engineeringSoftware

為了解決對象屬性和字段駝峰不一致的問題,我們可以使用映射注解@Results來指定映射關系。Mybatis主要提供這些映射注解:@Results用于填寫結果集的多個字段的映射關系@Result用于填寫結果集的單個字段的映射關系@ResultMap根據ID關聯(lián)XML里面<resultMap>4.2.2使用注解的方式整合MyBatis

engineeringSoftware

JPA是JavaPersistenceAPI的簡稱,中文名Java持久層API,是Sun官方提出的Java持久化規(guī)范。其設計目標主要是為了簡化現(xiàn)有的持久化開發(fā)工作和整合ORM技術。

JPA使用XML文件或注解(JDK5.0或更高版本)來描述對象-關聯(lián)表的映射關系,能夠將運行期的實體對象持久化到數據庫,它為Java開發(fā)人員提供了一種ORM工具來管理Java應用中的關系數據。簡單地說,JPA就是為POJO(PlainOrdinaryJavaObject)提供持久化的標準規(guī)范,即將Java的普通對象通過對象關系映射(Object-RelationalMapping,ORM)持久化到數據庫中。4.3SpringBoot整合JPA

engineeringSoftwareSpringDataJPA是Spring基于SpringData框架、在JPA規(guī)范的基礎上開發(fā)的一個框架,使用SpringDataJPA可以極大地簡化JPA的寫法,可以在幾乎不用寫實現(xiàn)的情況下實現(xiàn)對數據庫的訪問和操作,除了CRUD外,還包括分頁和排序等一些常用的功能。

SpringDataJPA還提供了對分頁查詢、自定義SQL、查詢指定N條記錄、聯(lián)表查詢等功能的支持

JPA不是一種新的ORM框架,它的出現(xiàn)只是用于規(guī)范現(xiàn)有的ORM技術,它不能取代現(xiàn)有的Hibernate、TopLink等框架。相反,在采用JPA開發(fā)時,我們將仍將使用到這些ORM框架,只是此時開發(fā)出來的應用不再依賴于某個持久化提供商。應用可以在不修改代碼的情況下在任何JPA環(huán)境下運行,真正做到低耦合,可擴展的程序設計。4.3.1SpringDataJPA簡介

engineeringSoftwareSpringDataJPA通過提供基于JPA的Repository極大地簡化了JPA的寫法,在幾乎不寫實現(xiàn)的情況下,實現(xiàn)數據庫的訪問和操作。SpringDataJPA中提供了如下幾個常用的接口。1.CrudRepository接口該接口的定義如下,總共提供了11個方法,基本上可以滿足簡單的CRUD操作以及批量操作2.PagingAndSortingRepository接口PagingAndSortingRepository接口繼承了CrudRepository接口。只要繼承了這個接口,SpringdataJPA就已經為你提供了分頁和排序的功能了。4.3.1SpringDataJPA簡介

engineeringSoftware3.JpaRepository接口如果業(yè)務需要即提供CRUD操作,又需要提供分頁以及排序功能,那么就可以直接繼承這個接口。該接口繼承了PagingAndSortingRepository接口。4.Repository接口這個接口是最基礎的接口,只是一個標志性的接口,沒有定義任何的方法,那這個接口有什么用了?既然SpringdataJPA提供了這個接口,自然是有它的用處,例如,我們有一部分方法是不想對外提供的,比如我們只想提供增加和修改方法,不提供刪除方法,那么前面的幾個接口都是做不到的,這個時候,我們就可以繼承這個接口,然后將CrudRepository接口里面相應的方法拷貝到Repository接口就可以了4.3.1SpringDataJPA簡介

engineeringSoftware使用SpringDataJPA建立數據庫訪問層十分方便,只需要定義一個繼承JpaRepository接口的接口即可。因此,自定義的數據訪問接口完全繼承了JpaRepository的接口方法。但更重要的是,在自定義的數據訪問接口中可以根據查詢關鍵字定義查詢方法,這些查詢方法需要符合它的命名規(guī)則,一般是根據持久化實體類的屬性名來確定的。在查詢時,通常需要同時根據多個屬性進行查詢,且查詢的條件也格式各樣(大于某個值、在某個范圍等等),SpringDataJPA為此提供了一些表達條件查詢的關鍵字。4.3.2簡單條件查詢

engineeringSoftware

4.3.2簡單條件查詢

engineeringSoftware下面針對上述代碼用到的注解進行簡要說明。@Entity@Entity標注用于實體類聲明語句之前,指出該Java類為實體類,將映射到指定的數據庫表。默認情況下,數據表的名稱就是首字母小寫的類名,如聲明一個實體類Customer,它將映射到數據庫中的customer表上。當然,還可以使用name屬性指定映射的表名。4.3.2簡單條件查詢engineeringSoftware@Table①當實體類與其映射的數據庫表名不同名時需要使用@Table標注說明,該標注與@Entity標注并列使用,置于實體類聲明語句之前,可寫于單獨語句行,也可與聲明語句同行。②@Table標注的常用選項是name,用于指明數據庫的表名@Id①@Id標注用于聲明一個實體類的屬性映射為數據庫的主鍵列。該屬性通常置于屬性聲明語句之前,可與聲明語句同行,也可寫在單獨行上。②@Id標注也可置于屬性的getter方法之前。4.3.2簡單條件查詢engineeringSoftware@GeneratedValue①@GeneratedValue用于標注主鍵的生成策略,默認情況下,JPA自動選擇一個最適合底層數據庫的主鍵生成策略。②在javax.persistence.GenerationType中定義了以下幾種可供選擇的策略:1)IDENTITY:采用數據庫ID自增長的方式來自增主鍵字段;2)AUTO:JPA自動選擇合適的策略,是默認選項;3)SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator注解指定序列名,MySql不支持這種方式4)TABLE:通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易于數據庫移植。4.3.2簡單條件查詢engineeringSoftware@Column①當實體的屬性與其映射的數據庫表的列不同名時需要使用@Column標注說明,該屬性通常置于實體的屬性聲明語句之前,還可與@Id標注一起使用。②@Column標注的常用屬性是name,用于設置映射數據庫表的列名。此外,該標注還包含其它多個屬性,如:unique、nullable、length等。③@Column標注也可置于屬性的getter方法之前。@Transient@Transient標注表示這個屬性并非是數據庫表的映射字

溫馨提示

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

評論

0/150

提交評論