Spring Boot企業(yè)級(jí)開(kāi)發(fā)教程(第2版) 課件 第5章 Spring Boot數(shù)據(jù)訪問(wèn)_第1頁(yè)
Spring Boot企業(yè)級(jí)開(kāi)發(fā)教程(第2版) 課件 第5章 Spring Boot數(shù)據(jù)訪問(wèn)_第2頁(yè)
Spring Boot企業(yè)級(jí)開(kāi)發(fā)教程(第2版) 課件 第5章 Spring Boot數(shù)據(jù)訪問(wèn)_第3頁(yè)
Spring Boot企業(yè)級(jí)開(kāi)發(fā)教程(第2版) 課件 第5章 Spring Boot數(shù)據(jù)訪問(wèn)_第4頁(yè)
Spring Boot企業(yè)級(jí)開(kāi)發(fā)教程(第2版) 課件 第5章 Spring Boot數(shù)據(jù)訪問(wèn)_第5頁(yè)
已閱讀5頁(yè),還剩124頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章SpringBoot數(shù)據(jù)訪問(wèn)《SpringBoot企業(yè)級(jí)開(kāi)發(fā)教程(第2版)》學(xué)習(xí)目標(biāo)/Target熟悉SpringData概述,能夠說(shuō)出SpringData的項(xiàng)目結(jié)構(gòu)和SpringData的常用核心子接口了解SpringDataJPA概述,能夠說(shuō)出使用SpringDataJPA進(jìn)行數(shù)據(jù)訪問(wèn)的邏輯掌握SpringDataJPA快速入門,能夠根據(jù)方法命名規(guī)則定義的方法、JPQL,以及原生SQL的方式操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)掌握SpringBoot整合SpringDataJPA,能夠整合SpringBoot和SpringDataJPA,并使用SpringDataJPA進(jìn)行基本的增刪改查了解MyBatis-Plus概述,能夠說(shuō)出MyBatis-Plus的特性學(xué)習(xí)目標(biāo)/Target掌握MyBatis-Plus快速入門,能夠使用通用Mapper、通用Service,以及條件構(gòu)造器操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)掌握SpringBoot整合MyBatis-Plus,能夠整合SpringBoot和MyBatis-Plus,并使用MyBatis-Plus進(jìn)行基本的增刪改查熟悉Redis快速入門,能夠說(shuō)出Redis的概念和優(yōu)點(diǎn)、安裝和啟動(dòng)Redis的方法、以及說(shuō)出Redis支持的數(shù)據(jù)類型掌握SpringDataRedis快速入門,能夠說(shuō)出SpringDataRedis的特性,以及應(yīng)用SpringDataRedis的常見(jiàn)操作掌握SpringBoot整合Redis,能夠整合SpringBoot和Redis,并使用SpringDataRedis向Redis中存儲(chǔ)和讀取數(shù)據(jù)章節(jié)概述/Summary一般情況下,應(yīng)用程序中的數(shù)據(jù)都會(huì)使用數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)和管理,然后在應(yīng)用程序中對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行訪問(wèn)操作。SpringBoot在簡(jiǎn)化項(xiàng)目開(kāi)發(fā)以及實(shí)現(xiàn)自動(dòng)化配置的基礎(chǔ)上,對(duì)常見(jiàn)的數(shù)據(jù)層解決方案提供了非常好的支持,用戶只需要進(jìn)行簡(jiǎn)單的配置,就可以使用數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)訪問(wèn)。下面將對(duì)SpringBoot項(xiàng)目中訪問(wèn)數(shù)據(jù)庫(kù)的常用技術(shù)進(jìn)行講解。目錄/Contents5.15.2SpringData概述SpringBoot管理SpringMVC5.3文件上傳5.3文件上傳SpringData概述5.15.1

SpringData概述先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!熟悉SpringData概述,能夠說(shuō)出SpringData的項(xiàng)目結(jié)構(gòu)和SpringData的常用核心子接口5.1

SpringData概述SpringBoot默認(rèn)采用整合SpringData的方式統(tǒng)一處理數(shù)據(jù)訪問(wèn)層,SpringData是Spring提供的開(kāi)源框架,旨在統(tǒng)一和簡(jiǎn)化對(duì)各種類型數(shù)據(jù)庫(kù)的持久化存儲(chǔ)。SpringData為大量的關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)提供了數(shù)據(jù)訪問(wèn)的方案,并且提供了基于Spring的數(shù)據(jù)訪問(wèn)模型,同時(shí)保留了各存儲(chǔ)系統(tǒng)的特殊性。5.1

SpringData概述SpringData為開(kāi)發(fā)者提供了一套統(tǒng)一的API,開(kāi)發(fā)者也可以相同的一套API操作不同存儲(chǔ)系統(tǒng)中的數(shù)據(jù),保持代碼結(jié)構(gòu)的一致性,大大減少開(kāi)發(fā)工作量,提高開(kāi)發(fā)效率。5.1

SpringData概述SpringData提供了一套統(tǒng)一的Repository接口實(shí)現(xiàn)方式,包括基本的增刪改查操作、條件查詢、排序查詢、分頁(yè)查詢等。當(dāng)數(shù)據(jù)訪問(wèn)對(duì)象需要進(jìn)行增刪改查、排序查詢和分頁(yè)查詢等操作時(shí),開(kāi)發(fā)者僅需要按照一定的規(guī)范聲明接口即可,不需要實(shí)現(xiàn)具體的查詢方法。SpringData會(huì)根據(jù)底層數(shù)據(jù)存儲(chǔ)系統(tǒng),在運(yùn)行時(shí)自動(dòng)實(shí)現(xiàn)真正的查詢方法,執(zhí)行查詢操作,返回結(jié)果數(shù)據(jù)集。5.1

SpringData概述Repository接口:Repository是一個(gè)空接口,用于標(biāo)示。CrudRepository接口:提供了各種增刪改查方法。PagingAndSortingRepository接口:增加了分頁(yè)和排序功能的方法。QueryByExampleExecutor接口:是進(jìn)行條件封裝查詢的頂級(jí)父接口,允許通過(guò)Example實(shí)例執(zhí)行復(fù)雜條件查詢。JpaRepository接口:重寫了一些查找和刪除的方法。SpringBoot整合SpringDataJPA5.25.2

SpringBoot整合SpringDataJPASpringData作為Spring全家桶中重要的一員,在Spring項(xiàng)目全球使用市場(chǎng)份額排名中多次居前位,而在SpringData子項(xiàng)目的使用份額排名中,SpringDataJPA也一直名列前茅。SpringBoot為SpringDataJPA提供了啟動(dòng)器,使SpringDataJPA在SpringBoot項(xiàng)目中的使用更加便利。下面將對(duì)SpringDataJPA的相關(guān)知識(shí),以及SpringBoot整合SpringDataJPA進(jìn)行講解。5.2.1

SpringDataJPA概述先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!了解SpringDataJPA概述,能夠說(shuō)出使用SpringDataJPA進(jìn)行數(shù)據(jù)訪問(wèn)的邏輯5.2.1

SpringDataJPA概述對(duì)象關(guān)系映射(ObjectRelationalMapping,ORM)框架在運(yùn)行時(shí)可以參照映射文件的信息,把對(duì)象持久化到數(shù)據(jù)庫(kù)中,可以解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象,常見(jiàn)的ORM框架有Hibernate、OpenJPA等。ORM框架的出現(xiàn),使開(kāi)發(fā)者從數(shù)據(jù)庫(kù)編程中解脫出來(lái),把更多的精力放在業(yè)務(wù)模型與業(yè)務(wù)邏輯上,但各ORM框架之間的API差別很大,使用了某種ORM框架的系統(tǒng)會(huì)嚴(yán)重受限于該ORM的標(biāo)準(zhǔn),基于此,SUN公司提出JPA(JavaPersistenceAPI,Java持久化API)。5.2.1

SpringDataJPA概述JPA是Sun官方提出的Java持久化規(guī)范,用于描述對(duì)象和關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中。JPA規(guī)范本質(zhì)上是一套規(guī)范,它提供了一些編程的API接口,但具體實(shí)現(xiàn)則由服務(wù)廠商來(lái)提供基于JPA的數(shù)據(jù)訪問(wèn)。5.2.1

SpringDataJPA概述SpringDataJPA整體處理邏輯5.2.2SpringDataJPA快速入門先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握SpringDataJPA快速入門,能夠根據(jù)方法命名規(guī)則定義的方法、JPQL,以及原生SQL的方式操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)5.2.2SpringDataJPA快速入門SpringDataJPA提供了很多模板代碼,易于擴(kuò)展,可以大幅提高開(kāi)發(fā)效率,使開(kāi)發(fā)者用極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問(wèn)。使用SpringDataJPA可以通過(guò)Repository接口中的方法對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行增刪改查,也可以根據(jù)方法命名規(guī)則定義的方法、JPQL,以及原生SQL的方式進(jìn)行操作,下面對(duì)SpringDataJPA提供的這些基本功能進(jìn)行講解。5.2.2SpringDataJPA快速入門如果自定義接口繼承了JpaRepository接口,則可以直接使用JpaRepository接口提供的方法。1.父接口的方法5.2.2SpringDataJPA快速入門SpringData中按照框架的規(guī)范自定義了Repository接口,除了可以使用接口提供的默認(rèn)方法外,還可以按特定規(guī)則來(lái)定義查詢方法,只要這些查詢方法的方法名遵守特定的規(guī)則,不需要提供方法實(shí)現(xiàn)體,SpringData就會(huì)自動(dòng)為這些方法生成查詢語(yǔ)句。SpringData對(duì)這種特定的查詢方法的定義規(guī)范如下。以find、read、get、query、count開(kāi)頭。涉及查詢條件時(shí),條件的屬性使用條件關(guān)鍵字連接,并且條件屬性的首字母大寫。2.根據(jù)方法命名規(guī)則定義方法5.2.2SpringDataJPA快速入門根據(jù)方法命名規(guī)范查詢時(shí),有時(shí)候需要使用關(guān)鍵字對(duì)查詢條件的屬性進(jìn)行連接。2.根據(jù)方法命名規(guī)則定義方法關(guān)鍵字方法名示例對(duì)應(yīng)的JPQL片段AndfindByLastnameAndFirstname()…wherex.lastname=?1andx.firstname=?2OrfindByLastnameOrFirstname()…wherex.lastname=?1orx.firstname=?2Is,EqualsfindByFirstname,findByFirstnameIs,findByFirstnameEquals()…wherex.firstname=?1BetweenfindByStartDateBetween()…wherex.startDatebetween?1and?2根據(jù)方法命名規(guī)則定義方法所支持的關(guān)鍵字5.2.2SpringDataJPA快速入門根據(jù)方法命名規(guī)范查詢時(shí),有時(shí)候需要使用關(guān)鍵字對(duì)查詢條件的屬性進(jìn)行連接。2.根據(jù)方法命名規(guī)則定義方法關(guān)鍵字方法名示例對(duì)應(yīng)的JPQL片段AndfindByLastnameAndFirstname()…wherex.lastname=?1andx.firstname=?2OrfindByLastnameOrFirstname()…wherex.lastname=?1orx.firstname=?2Is,EqualsfindByFirstname,findByFirstnameIs,findByFirstnameEquals()…wherex.firstname=?1BetweenfindByStartDateBetween()…wherex.startDatebetween?1and?2根據(jù)方法命名規(guī)則定義方法所支持的關(guān)鍵字5.2.2SpringDataJPA快速入門2.根據(jù)方法命名規(guī)則定義方法關(guān)鍵字方法名示例對(duì)應(yīng)的JPQL片段LessThanfindByAgeLessThan()…wherex.age<?1LessThanEqualfindByAgeLessThanEqual()…wherex.age<=?1GreaterThanfindByAgeGreaterThan()…wherex.age>?1GreaterThanEqualfindByAgeGreaterThanEqual()…wherex.age>=?1AfterfindByStartDateAfter()…wherex.startDate>?1BeforefindByStartDateBefore()…wherex.startDate<?1IsNullfindByAgeIsNull()…wherex.ageisnullIsNotNullfindByAgeIsNotNull()…wherex.ageisnotnullNotNullfindByAgeNotNull()…wherex.agenotnull根據(jù)方法命名規(guī)則定義方法所支持的關(guān)鍵字5.2.2SpringDataJPA快速入門2.根據(jù)方法命名規(guī)則定義方法關(guān)鍵字方法名示例對(duì)應(yīng)的JPQL片段LikefindByFirstnameLike()…wherex.firstnamelike?1NotLikefindByFirstnameNotLike()…wherex.firstnamenotlike?1StartingWithfindByFirstnameStartingWith()…wherex.firstnamelike?1(綁定參數(shù)%)EndingWithfindByFirstnameEndingWith()…wherex.firstnamelike?1(綁定參數(shù)%)ContainingfindByFirstnameContaining()…wherex.firstnamelike?1(綁定參數(shù)%)OrderByfindByAgeOrderByLastnameDesc()…wherex.age=?1orderbyx.lastnamedesc根據(jù)方法命名規(guī)則定義方法所支持的關(guān)鍵字5.2.2SpringDataJPA快速入門2.根據(jù)方法命名規(guī)則定義方法關(guān)鍵字方法名示例對(duì)應(yīng)的JPQL片段NotfindByLastnameNot()…wherex.lastname<>?1InfindByAgeIn(Collection<Age>ages)…wherex.agein?1NotInfindByAgeNotIn(Collection<Age>ages) …wherex.agenot

in?1TruefindByActiveTrue()…wherex.active=trueFalsefindByActiveFalse()…wherex.active=falseIgnoreCasefindByFirstnameIgnoreCase()…whereUPPER(x.firstame)=UPPER(?1)根據(jù)方法命名規(guī)則定義方法所支持的關(guān)鍵字5.2.2SpringDataJPA快速入門3.JPQL使用SpringDataJPA提供的查詢方法已經(jīng)可以滿足大部分應(yīng)用場(chǎng)景的需求,但是有些業(yè)務(wù)需要更靈活的查詢條件,這時(shí)就可以使用@Query注解,結(jié)合JPQL的方式來(lái)完成查詢。JPQL是JPA中定義的一種查詢語(yǔ)言,此種語(yǔ)言旨在讓開(kāi)發(fā)者忽略數(shù)據(jù)庫(kù)表和表中的字段,而關(guān)注實(shí)體類及實(shí)體類中的屬性。JPQL語(yǔ)句的寫法和SQL語(yǔ)句的寫法十分類似,但是要把查詢的表名換成實(shí)體類名稱,把表中的字段名換成實(shí)體類的屬性名稱。5.2.2SpringDataJPA快速入門3.JPQLJPQL支持命名參數(shù)和位置參數(shù)兩種查詢參數(shù)。命名參數(shù):在方法的參數(shù)列表中,使用@Param注解標(biāo)注參數(shù)的名稱,在@Query注解的查詢語(yǔ)句中,使用“:參數(shù)名稱”匹配參數(shù)名稱。位置參數(shù):在@Query注解的查詢語(yǔ)句中,使用“?位置編號(hào)的數(shù)值”匹配參數(shù),查詢語(yǔ)句中參數(shù)標(biāo)注的編號(hào)需要和方法的參數(shù)列表中參數(shù)的順序依次對(duì)應(yīng)。//命名參數(shù)綁定@Query("fromBookbwhereb.author=:authorand=:name")List<Book>findByCondition1(@Param("author")Stringauthor,@Param("name")Stringname);//位置參數(shù)綁定@Query("fromBookbwhereb.author=?1and=?2")List<Book>findByCondition2(Stringauthor,Stringname);5.2.2SpringDataJPA快速入門3.JPQLJPQL中使用like模糊查詢、排序查詢、分頁(yè)查詢子句時(shí),其用法與SQL中的用法相同,區(qū)別在于JPQL處理的類的實(shí)例不同。//like模糊查詢@Query("fromBookbwherelike%:name%")List<Book>findByCondition3(@Param("name")Stringname);//排序查詢@Query("fromBookbwherelike%:name%orderbyiddesc")List<Book>findByCondition4(@Param("name")Stringname);//分頁(yè)查詢@Query("fromBookbwherelike%:name%")Page<Book>findByCondition5(Pageablepageable,@Param("name")Stringname);5.2.2SpringDataJPA快速入門3.JPQLJPQL中除了可以使用字符串和基本數(shù)據(jù)類型的數(shù)據(jù)作為參數(shù)外,還可以使用集合和Bean作為參數(shù),傳入Bean進(jìn)行查詢時(shí)可以在JPQL中使用SpEL表達(dá)式接收變量。//傳入集合參數(shù)查詢@Query("fromBookbwhereb.idin:ids")List<Book>findByCondition6(@Param("ids")Collection<String>ids);//傳入Bean進(jìn)行查詢(使用SPEL表達(dá)式)@Query("fromBookbwhereb.author=:#{#Book.author}and"+"=:#{#B}")BookfindByCondition7(@Param("Book")BookBook);5.2.2SpringDataJPA快速入門4.原生SQL如果出現(xiàn)非常復(fù)雜的業(yè)務(wù)情況,導(dǎo)致JPQL和其他查詢都無(wú)法實(shí)現(xiàn)對(duì)應(yīng)的查詢,需要自定義SQL進(jìn)行查詢時(shí),可以在@Query注解中定義該SQL。@Query注解中定義的是原生SQL時(shí),需要在注解使用nativeQuery=true指定執(zhí)行的查詢語(yǔ)句為原生SQL,否則會(huì)將其當(dāng)作JPQL執(zhí)行@Query(value="SELECT*FROMbookWHEREid=:id",nativeQuery=true)BookfindByCondition8(@Param("id")Integerid);5.2.2SpringDataJPA快速入門使用@Query注解可以執(zhí)行JPQL和原生SQL查詢,但是@Query注解無(wú)法進(jìn)行DML數(shù)據(jù)操縱語(yǔ)言,主要語(yǔ)句有INSERT、DELETE和UPDATE操作,如果需要更新數(shù)據(jù)庫(kù)中的數(shù)據(jù),需要在對(duì)應(yīng)的方法上標(biāo)注@Modifying注解,以通知SpringData當(dāng)前需要進(jìn)行的是DML操作。需要注意的是JPQL只支持DELETE和UPDATE操作,不支持INSERT操作。小提示5.2.3

整合SpringDataJPA先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握SpringBoot整合SpringDataJPA,能夠整合SpringBoot和SpringDataJPA,并使用SpringDataJPA進(jìn)行基本的增刪改查5.2.3

整合SpringDataJPA下面使用SpringBoot和SpringDataJPA進(jìn)行整合,進(jìn)一步演示SpringDataJPA在SpringBoot項(xiàng)目中的基本使用。1.創(chuàng)建項(xiàng)目在IDEA中創(chuàng)建SpringBoot項(xiàng)目chapter05,讀者可以根據(jù)自己當(dāng)前情況選擇使用SpringInitializr方式或者M(jìn)aven方式進(jìn)行創(chuàng)建,這里使用Maven方式創(chuàng)建項(xiàng)目。5.2.3

整合SpringDataJPA2.配置依賴在項(xiàng)目chapter05的pom.xml文件中配置SpringBoot整合SpringDataJPA的依賴,包括SpringBoot父工程的依賴、MySQL驅(qū)動(dòng)依賴和SpringDataJPA的啟動(dòng)器依賴,具體如文件5-1所示。文件5-1pom.xml源代碼5.2.3

整合SpringDataJPA3.設(shè)置配置信息使用SpringDataJPA需要操作數(shù)據(jù)庫(kù),所以需要在項(xiàng)目中設(shè)置一些和數(shù)據(jù)庫(kù)連接相關(guān)的配置信息。SpringBoot的自動(dòng)裝配提供了數(shù)據(jù)庫(kù)連接的一些默認(rèn)配置,例如數(shù)據(jù)源。SpringBoot2.x版本默認(rèn)使用HikariCP作為數(shù)據(jù)源,如果沒(méi)有顯示指定使用其他數(shù)據(jù)源,項(xiàng)目啟動(dòng)后會(huì)自動(dòng)使用HikariCP數(shù)據(jù)源獲取數(shù)據(jù)庫(kù)連接。引入SpringDataJPA的啟動(dòng)器后,SpringBoot會(huì)自動(dòng)裝配對(duì)于JPA的默認(rèn)配置,例如是否打印運(yùn)行時(shí)的SQL語(yǔ)句和參數(shù)信息、是否根據(jù)實(shí)體自動(dòng)建表等。本項(xiàng)目選擇采用默認(rèn)的數(shù)據(jù)源,JPA的配置信息只修改打印運(yùn)行時(shí)的SQL語(yǔ)句,其他都采用默認(rèn)的配置信息。5.2.3

整合SpringDataJPA3.設(shè)置配置信息在項(xiàng)目的resources目錄下創(chuàng)建application.yml文件,在該文件中指定數(shù)據(jù)庫(kù)連接信息和JPA的配置信息,具體如文件5-2所示。文件5-2application.yml源代碼5.2.3

整合SpringDataJPA4.創(chuàng)建實(shí)體類通過(guò)JPA可以簡(jiǎn)單高效地管理Java實(shí)體類和關(guān)系數(shù)據(jù)庫(kù)的映射,通常每個(gè)實(shí)體類與數(shù)據(jù)庫(kù)中的單個(gè)數(shù)據(jù)表相關(guān)聯(lián),每個(gè)實(shí)體的實(shí)例表示數(shù)據(jù)庫(kù)表格中的某一行記錄。在項(xiàng)目的java目錄下創(chuàng)建包c(diǎn)om.itheima.chapter05.entity,并在該包下創(chuàng)建實(shí)體類Book,具體如文件5-3所示。文件5-3Book.java源代碼5.2.3

整合SpringDataJPA5.自定義Repository接口通過(guò)JPA可以簡(jiǎn)單高效的管理Java實(shí)體類和關(guān)系數(shù)據(jù)庫(kù)的映射,通常每個(gè)實(shí)體類與數(shù)據(jù)庫(kù)中的單個(gè)數(shù)在java目錄下創(chuàng)建包c(diǎn)om.itheima.chapter05.dao,在該包下自定義接口BookRepository繼承JpaRepository接口,并在BookRepository接口中添加操作數(shù)據(jù)庫(kù)中圖書信息的方法,具體如文件5-4所示。文件5-4BookRepository.java源代碼5.2.3

整合SpringDataJPA6.創(chuàng)建數(shù)據(jù)庫(kù)至此,實(shí)體類和操作實(shí)體的接口都已經(jīng)定義好,因?yàn)闆](méi)有在JPA的配置信息中設(shè)置項(xiàng)目啟動(dòng)時(shí)根據(jù)實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)表,此時(shí)測(cè)試對(duì)圖書信息的操作需要先創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)庫(kù)和數(shù)據(jù)表,并插入對(duì)應(yīng)的測(cè)試數(shù)據(jù),相關(guān)SQL如文件5-5所示。文件5-5book.sql源代碼5.2.3

整合SpringDataJPA7.創(chuàng)建項(xiàng)目啟動(dòng)類和測(cè)試類在src\main\java目錄的com.itheima.chapter05包下創(chuàng)建項(xiàng)目啟動(dòng)類Chapter05Application,具體如文件5-6所示。文件5-6Chapter05Application.java源代碼5.2.3

整合SpringDataJPA7.創(chuàng)建項(xiàng)目啟動(dòng)類和測(cè)試類在src\test\java目錄下創(chuàng)建包c(diǎn)om.itheima.chapter05,并在該包下創(chuàng)建測(cè)試類Chapter05ApplicationTests。在Chapter05ApplicationTests測(cè)試類中定義操作圖書信息的測(cè)試方法,具體如文件5-7所示。文件5-7Chapter05ApplicationTests.java源代碼5.2.3

整合SpringDataJPA8.測(cè)試操作圖書信息運(yùn)行文件5-7中的saveBook()方法,測(cè)試新增圖書信息。5.2.3

整合SpringDataJPA8.測(cè)試操作圖書信息運(yùn)行文件5-7中的editBook()方法,測(cè)試修改圖書信息。5.2.3

整合SpringDataJPA8.測(cè)試操作圖書信息運(yùn)行文件5-7中的findBook()方法,測(cè)試查詢圖書信息。5.2.3

整合SpringDataJPA8.測(cè)試操作圖書信息運(yùn)行文件5-7中的delBook()方法,測(cè)試刪除圖書信息。SpringBoot整合MyBatis-Plus5.35.3SpringBoot整合MyBatis-PlusMyBatis是一個(gè)足夠靈活的DAO層解決方案,但其也存在一些不足。為了彌補(bǔ)這些不足,可以對(duì)MyBatis現(xiàn)有的功能進(jìn)行增強(qiáng),Mybatis-Plus就是這樣的MyBatis增強(qiáng)工具。下面將對(duì)Mybatis-Plus的相關(guān)基礎(chǔ)知識(shí)和SpringBoot整合Mybatis-Plus進(jìn)行講解。5.3.1

MyBatis-Plus概述先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!了解MyBatis-Plus概述,能夠說(shuō)出MyBatis-Plus的特性5.3.1

MyBatis-Plus概述MyBatis是半自動(dòng)化的ORM實(shí)現(xiàn),支持定制化SQL、存儲(chǔ)過(guò)程和高級(jí)映射,其封裝性低于Hibernate,但性能優(yōu)秀、小巧、簡(jiǎn)單易學(xué),在國(guó)內(nèi)備受開(kāi)發(fā)人員的喜愛(ài)。MyBatis本身也存在些許不足,例如,配置文件繁多,以及當(dāng)編寫一個(gè)業(yè)務(wù)邏輯時(shí)需要在Dao層寫一個(gè)方法,再創(chuàng)建一個(gè)與之對(duì)應(yīng)的映射文件或SQL語(yǔ)句。針對(duì)MyBatis的這些不足,MyBatis-Plus誕生了。MyBatis-Plus是MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,支持MyBatis所有原生的特性,旨在簡(jiǎn)化開(kāi)發(fā)、提高效率。5.3.1

MyBatis-Plus概述MyBatis-Plus除了彌補(bǔ)了MyBatis的些許不足外,還具有以下特性。無(wú)侵入:只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響。損耗小:?jiǎn)?dòng)即會(huì)自動(dòng)注入基本增刪改查方法,性能基本無(wú)損耗,直接面向?qū)ο蟛僮?。?qiáng)大的增刪改查操作:內(nèi)置通用Mapper、通用Service,僅僅通過(guò)少量配置即可實(shí)現(xiàn)單表大部分增刪改查操作,具有強(qiáng)大的條件構(gòu)造器,可滿足各類使用需求。支持Lambda形式調(diào)用:通過(guò)Lambda表達(dá)式,可方便地編寫各類查詢條件,無(wú)須再擔(dān)心字段寫錯(cuò)。支持主鍵自動(dòng)生成:支持分布式唯一ID生成器Sequence在內(nèi)的4種主鍵策略,可自由配置,完美解決了主鍵問(wèn)題。支持ActiveRecord模式:支持ActiveRecord形式調(diào)用,實(shí)體類只需繼承Model類即可進(jìn)行強(qiáng)大的增刪改查操作。5.3.1

MyBatis-Plus概述支持自定義全局通用操作:支持全局通用方法注入。內(nèi)置代碼生成器:采用代碼或者M(jìn)aven插件可快速生成Mapper、Model、Service、Controller層代碼,支持模板引擎。內(nèi)置分頁(yè)插件:基于MyBatis物理分頁(yè),開(kāi)發(fā)者無(wú)須關(guān)心具體操作,配置好插件之后,寫分頁(yè)等同于普通List查詢。分頁(yè)插件支持多種數(shù)據(jù)庫(kù):支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer等多種數(shù)據(jù)庫(kù)。內(nèi)置性能分析插件:可輸出SQL語(yǔ)句以及其執(zhí)行時(shí)間,建議開(kāi)發(fā)測(cè)試時(shí)啟用該功能,能快速揪出慢查詢。內(nèi)置全局?jǐn)r截插件:提供全表delete、update操作智能分析阻斷,也可自定義攔截規(guī)則,預(yù)防誤操作。5.3.1

MyBatis-Plus概述5.3.2

MyBatis-Plus快速入門先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握MyBatis-Plus快速入門,能夠使用通用Mapper、通用Service,以及條件構(gòu)造器操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)5.3.2

MyBatis-Plus快速入門通過(guò)學(xué)習(xí)MyBatis-Plus的特性可知,MyBatis-Plus內(nèi)置了通用Mapper和通用Service,啟動(dòng)時(shí)會(huì)自動(dòng)注入基本的增刪改查方法,并提供了強(qiáng)大的條件構(gòu)造器,下面對(duì)MyBatis-Plus的這些基本功能進(jìn)行講解。1.通用MapperMyBatis-Plus的通用Mapper是指其BaseMapper接口,Mybatis-Plus啟動(dòng)時(shí)自動(dòng)解析,將實(shí)體表關(guān)系映射轉(zhuǎn)換為Mybatis內(nèi)部對(duì)象注入到容器中。BaseMapper接口中封裝了基本的增刪改查方法。(1)新增方法intinsert(Tentity);5.3.2

MyBatis-Plus快速入門1.通用Mapper(2)更新方法//根據(jù)whereWrapper條件,更新記錄intupdate(@Param(Constants.ENTITY)TupdateEntity,@Param(Constants.WRAPPER)Wrapper<T>whereWrapper);//根據(jù)ID更新intupdateById(@Param(Constants.ENTITY)Tentity);5.3.2

MyBatis-Plus快速入門1.通用Mapper(3)刪除方法//根據(jù)entity條件,刪除記錄intdelete(@Param(Constants.WRAPPER)Wrapper<T>wrapper);//根據(jù)ID批量刪除intdeleteBatchIds(@Param(Constants.COLLECTION)Collection<?extendsSerializable>idList);//根據(jù)ID刪除intdeleteById(Serializableid);//根據(jù)columnMap條件,刪除記錄intdeleteByMap(@Param(Constants.COLUMN_MAP)Map<String,Object>columnMap);5.3.2

MyBatis-Plus快速入門1.通用Mapper(4)查詢方法//根據(jù)id查詢TselectById(Serializableid);//根據(jù)entity條件,查詢一條記錄TselectOne(@Param(Constants.WRAPPER)Wrapper<T>queryWrapper);//根據(jù)id批量查詢List<T>selectBatchIds(@Param(Constants.COLLECTION)Collection<?extendsSerializable>idList);//根據(jù)entity條件,查詢?nèi)坑涗汱ist<T>selectList(@Param(Constants.WRAPPER)Wrapper<T>queryWrapper);//根據(jù)columnMap條件進(jìn)行查詢List<T>selectByMap(@Param(Constants.COLUMN_MAP)Map<String,Object>columnMap);5.3.2

MyBatis-Plus快速入門1.通用Mapper(4)查詢方法//根據(jù)Wrapper條件,查詢?nèi)坑涗汱ist<Map<String,Object>>selectMaps(@Param(Constants.WRAPPER)Wrapper<T>queryWrapper);//根據(jù)Wrapper條件,查詢?nèi)坑涗?。注意:只返回第一個(gè)字段的值List<Object>selectObjs(@Param(Constants.WRAPPER)Wrapper<T>queryWrapper);//根據(jù)entity條件,查詢?nèi)坑涗洸⒎?yè)IPage<T>selectPage(IPage<T>page,@Param(Constants.WRAPPER)Wrapper<T>queryWrapper);//根據(jù)Wrapper條件,查詢?nèi)坑涗洸⒎?yè)IPage<Map<String,Object>>selectMapsPage(IPage<T>page,@Param(Constants.WRAPPER)Wrapper<T>queryWrapper);//根據(jù)Wrapper條件,查詢總記錄數(shù)IntegerselectCount(@Param(Constants.WRAPPER)Wrapper<T>queryWrapper);5.3.2

MyBatis-Plus快速入門2.通用Service除了通用Mapper,MyBatis-Plus還提供了通用Service,通用Service指的是其IService接口,該接口中也提供了基本的增刪改查方法。編寫Service層代碼時(shí),可以使用自定義的Service接口繼承IService接口,調(diào)用IService接口中的方法時(shí),不需要手動(dòng)實(shí)現(xiàn),即可實(shí)現(xiàn)基本的增刪改查功能。(1)插入方法//插入一條記錄booleansave(Tentity);//批量插入booleansaveBatch(Collection<T>entityList);//批量插入booleansaveBatch(Collection<T>entityList,intbatchSize);5.3.2

MyBatis-Plus快速入門2.通用Service(2)更新方法//根據(jù)UpdateWrapper條件,更新記錄需要設(shè)置sqlsetbooleanupdate(Wrapper<T>updateWrapper);//根據(jù)whereWrapper條件,更新記錄booleanupdate(TupdateEntity,Wrapper<T>whereWrapper);//根據(jù)ID選擇修改booleanupdateById(Tentity);//根據(jù)ID批量更新booleanupdateBatchById(Collection<T>entityList);//根據(jù)ID批量更新booleanupdateBatchById(Collection<T>entityList,intbatchSize);5.3.2

MyBatis-Plus快速入門2.通用Service(3)插入或更新方法//主鍵存在就更新記錄,否則插入一條記錄booleansaveOrUpdate(Tentity);//根據(jù)updateWrapper嘗試更新,否繼續(xù)執(zhí)行saveOrUpdate(T)方法booleansaveOrUpdate(Tentity,Wrapper<T>updateWrapper);//批量插入或更新booleansaveOrUpdateBatch(Collection<T>entityList);//批量插入或更新booleansaveOrUpdateBatch(Collection<T>entityList,intbatchSize);5.3.2

MyBatis-Plus快速入門2.通用Service(4)刪除方法//根據(jù)entity條件,刪除記錄booleanremove(Wrapper<T>queryWrapper);//根據(jù)id刪除booleanremoveById(Serializableid);//根據(jù)columnMap條件,刪除記錄booleanremoveByMap(Map<String,Object>columnMap);//根據(jù)id批量刪除booleanremoveByIds(Collection<?extendsSerializable>idList);5.3.2

MyBatis-Plus快速入門2.通用Service(5)查詢方法//根據(jù)ID查詢TgetById(Serializableid);//根據(jù)Wrapper,查詢一條記錄。結(jié)果集,如果是多個(gè)會(huì)拋出異常TgetOne(Wrapper<T>queryWrapper);//根據(jù)Wrapper,查詢一條記錄TgetOne(Wrapper<T>queryWrapper,booleanthrowEx);//根據(jù)Wrapper,查詢一條記錄Map<String,Object>getMap(Wrapper<T>queryWrapper);//根據(jù)Wrapper,查詢一條記錄<V>VgetObj(Wrapper<T>queryWrapper,Function<?superObject,V>mapper);5.3.2

MyBatis-Plus快速入門2.通用Service(5)查詢方法//查詢所有List<T>list();//查詢列表List<T>list(Wrapper<T>queryWrapper);//查詢(根據(jù)ID批量查詢)Collection<T>listByIds(Collection<?extendsSerializable>idList);//查詢(根據(jù)columnMap條件)Collection<T>listByMap(Map<String,Object>columnMap);//查詢所有列表List<Map<String,Object>>listMaps();5.3.2

MyBatis-Plus快速入門2.通用Service(5)查詢方法//查詢列表List<Map<String,Object>>listMaps(Wrapper<T>queryWrapper);//查詢?nèi)坑涗汱ist<Object>listObjs();//查詢?nèi)坑涗?lt;V>List<V>listObjs(Function<?superObject,V>mapper);//根據(jù)Wrapper條件,查詢?nèi)坑涗汱ist<Object>listObjs(Wrapper<T>queryWrapper);5.3.2

MyBatis-Plus快速入門2.通用Service(6)分頁(yè)查詢方法//無(wú)條件分頁(yè)查詢IPage<T>page(IPage<T>page);//條件分頁(yè)查詢IPage<T>page(IPage<T>page,Wrapper<T>queryWrapper);//無(wú)條件分頁(yè)查詢IPage<Map<String,Object>>pageMaps(IPage<T>page);//條件分頁(yè)查詢IPage<Map<String,Object>>pageMaps(IPage<T>page,Wrapper<T>queryWrapper);5.3.2

MyBatis-Plus快速入門3.條件構(gòu)造器在開(kāi)發(fā)中,有時(shí)候希望查詢根據(jù)所指定的條件進(jìn)行增刪改查操作,而這個(gè)條件可能包含多種情況。在MyBatis-Plus中可以使用條件構(gòu)造器Wrapper根據(jù)具體的需求定義來(lái)封裝指定的條件eq(Rcolumn,Objectval)(1)eqcolumn表示數(shù)據(jù)庫(kù)字段名,val表示字段值。eq()方法用于匹配字段中值等于某個(gè)值的記錄,例如,eq("name","老王")用于匹配name字段中值等于"老王"的記錄。5.3.2

MyBatis-Plus快速入門ne(Rcolumn,Objectval)(2)nene()方法用于匹配字段中值不等于某個(gè)值的記錄,例如,eq("name","老王")用于匹配name字段中值不等于"老王"的記錄。3.條件構(gòu)造器gt(Rcolumn,Objectval)(3)gtgt()方法用于匹配字段中值大于某個(gè)值的記錄,例如,gt("age",18)用于匹配age字段中值大于18的記錄。5.3.2

MyBatis-Plus快速入門ge(Rcolumn,Objectval)(4)gege()方法用于匹配字段中值大于或等于某個(gè)值的記錄,例如,ge("age",18)用于匹配age字段中值大于或等于18的記錄。3.條件構(gòu)造器lt(Rcolumn,Objectval)(5)ltlt()方法用于匹配字段中值小于某個(gè)值的記錄,例如,lt("age",18)用于匹配age字段中值小于18的記錄。5.3.2

MyBatis-Plus快速入門le(Rcolumn,Objectval)(6)lele()方法用于匹配字段中值小于或等于某個(gè)值的記錄,例如,le("age",18)用于匹配age字段中值小于或等于18的記錄。3.條件構(gòu)造器between(Rcolumn,Objectval1,Objectval2)(7)betweenbetween()方法用于匹配字段中值在指定區(qū)間的記錄,例如,between("age",18,30)用于匹配age字段中值大于18并且小于30的記錄。5.3.2

MyBatis-Plus快速入門like(Rcolumn,Objectval)(8)likelike()方法用于模糊匹配字段中的值,例如,like("name","王")用于匹配name字段中值包含“王”的記錄。3.條件構(gòu)造器in(Rcolumn,Collection<?>value)(9)inin()方法用于匹配字段的值在指定組合中的記錄,例如,in("age",{1,2,3})用于匹配age字段中值為1或者2或者3的記錄。5.3.2

MyBatis-Plus快速入門groupBy(R...columns)(10)groupBygroupBy()方法用于給指定字段進(jìn)行分組,例如,groupBy("id","name")用于對(duì)記錄根據(jù)id字段和name字段進(jìn)行分組。3.條件構(gòu)造器5.3.3

整合MyBatis-Plus先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握SpringBoot整合MyBatis-Plus,能夠整合SpringBoot和MyBatis-Plus,并使用MyBatis-Plus進(jìn)行基本的增刪改查5.3.3

整合MyBatis-Plus1.配置依賴在項(xiàng)目chapter05的pom.xml文件中配置MyBatis-Plus整合SpringBoot的啟動(dòng)器依賴,由于該依賴不是SpringBoot提供的,需要自行配置對(duì)應(yīng)的依賴版本號(hào),具體如文件5-8所示。文件5-8pom.xml源代碼5.3.3

整合MyBatis-Plus2.設(shè)置配置信息引入的MyBatis-Plus整合SpringBoot啟動(dòng)器依賴中,提供了數(shù)據(jù)庫(kù)連接的一些默認(rèn)配置。如果有單獨(dú)的MyBatis配置,請(qǐng)將對(duì)應(yīng)的配置文件路徑配置到configLocation中。本案例只演示MyBatis-Plus的基本操作,不需要配置額外的MyBatis配置,所以直接使用文件5-2中原有的數(shù)據(jù)庫(kù)連接配置即可。5.3.3

整合MyBatis-Plus3.創(chuàng)建實(shí)體類MyBatis-Plus標(biāo)注實(shí)體類的注解與SpringDataJPA不一樣,所以需要使用MyBatis-Plus的注解標(biāo)注實(shí)體類。在com.itheima.chapter05.entity包下創(chuàng)建實(shí)體類EBook,具體如文件5-9所示。文件5-9EBook.java源代碼5.3.3

整合MyBatis-Plus4.自定義Mapper接口在com.itheima.chapter05.dao包下創(chuàng)建自定義接口BookMapper,并使用該接口繼承BaseMapper接口,具體如文件5-10所示。文件5-10BookMapper.java源代碼5.3.3

整合MyBatis-Plus5.創(chuàng)建Service接口和實(shí)現(xiàn)類在項(xiàng)目的java目錄下創(chuàng)建包c(diǎn)om.itheima.chapter05.service,并在該包下創(chuàng)建Service接口和實(shí)現(xiàn)類,具體如文件5-11和文件5-12所示。文件5-11BookService.java文件5-12BookServiceImpl.java源代碼5.3.3

整合MyBatis-Plus6.掃描Mapper接口在啟動(dòng)類Chapter05Application上方使用@MapperScan注解掃描指定路徑的Mapper并交由Spring管理,具體如文件5-13所示。文件5-13Chapter05Application.java源代碼5.3.3

整合MyBatis-Plus7.定義測(cè)試方法在src\test\java目錄的com.itheima.chapter05包下創(chuàng)建測(cè)試類Chapter05ApplicationMPTests,在Chapter05ApplicationMPTests測(cè)試類中定義操作圖書信息的測(cè)試方法,具體如文件5-14所示。文件5-14Chapter05ApplicationMPTests.java源代碼5.3.3

整合MyBatis-Plus8.測(cè)試操作圖書信息運(yùn)行文件5-14中的saveEBook()方法,測(cè)試新增圖書信息。5.3.3

整合MyBatis-Plus8.測(cè)試操作圖書信息運(yùn)行文件5-14中的findEBook()方法,測(cè)試查詢圖書信息。5.3.3

整合MyBatis-Plus8.測(cè)試操作圖書信息運(yùn)行文件5-14中的editEBook()方法,測(cè)試修改圖書信息。5.3.3

整合MyBatis-Plus8.測(cè)試操作圖書信息運(yùn)行文件5-14中的delEBook()方法,測(cè)試刪除圖書信息。SpringBoot整合Redis5.45.4

SpringBoot整合Redis隨著互聯(lián)網(wǎng)Web2.0的興起,關(guān)系型數(shù)據(jù)庫(kù)在處理超大規(guī)模和高并發(fā)的Web2.0網(wǎng)站的數(shù)據(jù)時(shí)存在一些不足,需要采用更適合解決大規(guī)模數(shù)據(jù)集合、多重?cái)?shù)據(jù)種類的數(shù)據(jù)庫(kù),通常將這種類型的數(shù)據(jù)庫(kù)統(tǒng)稱為非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL,NotOnlySQL)。常見(jiàn)的非關(guān)系型數(shù)據(jù)庫(kù)有MongoDb、Redis等,其中Redis以超高的性能、完美的文檔和簡(jiǎn)潔易懂的源碼受到廣大開(kāi)發(fā)人員的喜愛(ài)。下面將對(duì)Redis的相關(guān)知識(shí)和SpringBoot整合Redis進(jìn)行講解。5.4.1

Redis快速入門先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!熟悉Redis快速入門,能夠說(shuō)出Redis的概念和優(yōu)點(diǎn)、安裝和啟動(dòng)Redis的方法、以及說(shuō)出Redis支持的數(shù)據(jù)類型5.4.1

Redis快速入門1.Redis概述Redis(RemoteDictionaryServer,遠(yuǎn)程字典服務(wù))是一個(gè)基于內(nèi)存的鍵值型非關(guān)系型數(shù)據(jù)庫(kù),以Key-Value的形式存儲(chǔ)數(shù)據(jù)。Redis中存儲(chǔ)鍵(Key)、值(Value)的方式和Java中的HashMap類似,鍵和值是映射關(guān)系。在同一個(gè)庫(kù)中,Key是唯一不可重復(fù)的,每一個(gè)Key對(duì)應(yīng)一個(gè)Value。鍵值存儲(chǔ)的本質(zhì)就是使用Key標(biāo)示Value,當(dāng)想要檢索Value時(shí),必須使用與Value相對(duì)應(yīng)的Key進(jìn)行查找。5.4.1

Redis快速入門1.Redis概述Redis與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)截然不同,Redis沒(méi)有提供手動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句,Redis啟動(dòng)后會(huì)默認(rèn)創(chuàng)建16個(gè)數(shù)據(jù)庫(kù),用0~15進(jìn)行編號(hào),默認(rèn)使用編號(hào)為0的數(shù)據(jù)庫(kù)。相較于其他的鍵值存儲(chǔ)系統(tǒng),Redis主要有以下優(yōu)點(diǎn)。存取速度快:Redis基于內(nèi)存來(lái)實(shí)現(xiàn)數(shù)據(jù)存取,相對(duì)于磁盤來(lái)說(shuō),其讀寫速度要高出好幾個(gè)數(shù)量級(jí),每秒可執(zhí)行大約110000次的設(shè)置操作,或者執(zhí)行81000次的讀取操作。支持豐富的數(shù)據(jù)類型:Redis支持開(kāi)發(fā)人員常用的大多數(shù)數(shù)據(jù)類型,例如列表、集合、有序集合和散列等。操作具有原子性:所有Redis操作都是原子操作,這使得兩個(gè)客戶端并發(fā)訪問(wèn)時(shí),Redis服務(wù)器能接收更新后的值。提供多種功能:Redis提供了多種功能特性,可用作非關(guān)系型數(shù)據(jù)庫(kù)、緩存中間件、消息中間件等。5.4.1

Redis快速入門2.Redis安裝和啟動(dòng)要想使用非關(guān)系型數(shù)據(jù)庫(kù)Redis,必須先安裝Redis。Redis可以在Windows系統(tǒng)和Linux系統(tǒng)安裝,也可以通過(guò)Docker鏡像來(lái)安裝,不同安裝方式的安裝過(guò)程也不相同。為了方便操作,此處選擇在Windows平臺(tái)下進(jìn)行Redis安裝。5.4.1

Redis快速入門2.Redis安裝和啟動(dòng)用于啟動(dòng)Redis服務(wù)??蛻舳斯ぞ?。5.4.1

Redis快速入門2.Redis安裝和啟動(dòng)雙擊redis-server.exe啟動(dòng)Redis服務(wù)。5.4.1

Redis快速入門2.Redis安裝和啟動(dòng)雙擊redis-cli.exe啟動(dòng)客戶端程序。5.4.1

Redis快速入門2.Redis安裝和啟動(dòng)Redis自帶的客戶端工具有時(shí)侯使用起來(lái)并不是特別方便,讀者也可以使用一些圖形化Redis客戶端管理軟件管理Redis。常用的有RedisDesktopManager,其在2022年更名為RESP.app。5.4.1

Redis快速入門2.Redis安裝和啟動(dòng)單擊RRESP.app主界面左側(cè)的“連接到Redis服務(wù)器”,彈出“新連接設(shè)置”對(duì)話框。5.4.1

Redis快速入門2.Redis安裝和啟動(dòng)設(shè)置所連接的Redis的相關(guān)信息后,單擊“確定”按鈕創(chuàng)建連接。5.4.1

Redis快速入門3.Redis的數(shù)據(jù)類型Redis中的數(shù)據(jù)庫(kù)沒(méi)有“數(shù)據(jù)表”的概念,通過(guò)Value不同的數(shù)據(jù)類型來(lái)實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù)的需求,不同的數(shù)據(jù)類型能夠適應(yīng)不同的應(yīng)用場(chǎng)景,從而滿足開(kāi)發(fā)者的需求。Value的數(shù)據(jù)類型有五種常用數(shù)據(jù)類型,分別為String(字符串)、Hash(散列)、List(列表)、Set(集合)、SortedSet(有序集合)。5.4.1

Redis快速入門3.Redis的數(shù)據(jù)類型(1)StringString可以靈活地表示字符串、整數(shù)、浮點(diǎn)數(shù)3種值,String有以下常見(jiàn)命令。SETkeyvalue:添加或者修改已經(jīng)存在的鍵值對(duì)。GETkey:根據(jù)鍵獲取對(duì)應(yīng)的值。MSETkey1value1[key2value2...]:批量添加多個(gè)鍵值對(duì)。MGETkey1[key2..]:根據(jù)一個(gè)或多個(gè)鍵獲取對(duì)應(yīng)的值。INCRkey:將鍵存儲(chǔ)的整數(shù)值自增1。INCRBYkeyincrement:將鍵存儲(chǔ)的整數(shù)值根據(jù)指定步長(zhǎng)increment自增。INCRBYFLOATkeyincrement:將鍵存儲(chǔ)的浮點(diǎn)數(shù)根據(jù)指定步長(zhǎng)increment自增。SETNXkeyvalue:當(dāng)且僅當(dāng)Key不存在時(shí),添加一個(gè)鍵值對(duì)。SETEXkeysecondsvalue:添加一個(gè)String類型的鍵值對(duì),并且指定有效期為seconds秒。5.4.1

Redis快速入門3.Redis的數(shù)據(jù)類型(2)ListRedis中的List與Java中的LinkedList類似,可以看作是一個(gè)雙向鏈表結(jié)構(gòu),既可以支持正向檢索,也可以支持反向檢索。List類型的數(shù)據(jù)有序、元素可以重復(fù)、插入和刪除速度快、查詢速度一般。常見(jiàn)命令如下。LPUSHkeyvalue1[value2...]:根據(jù)鍵向列表左側(cè)插入一個(gè)或多個(gè)元素。LPOPkey:根據(jù)鍵移除并返回列表左側(cè)的第一個(gè)元素,沒(méi)有則返回nil。RPUSHkeyvalue1[value2...]:根據(jù)鍵向列表右側(cè)插入一個(gè)或多個(gè)元素。RPOPkey:根據(jù)鍵移除并返回列表右側(cè)的第一個(gè)元素。LRANGEkeystarend:根據(jù)鍵返回指定范圍內(nèi)的所有元素。BLPOP和BRPOP:與LPOP和RPOP類似,只不過(guò)在沒(méi)有元素時(shí)等待指定時(shí)間,而不是直接返回nil。5.4.1

Redis快速入門3.Redis的數(shù)據(jù)類型(3)SetRedis的Set類型與Java中的HashSet類似,可以看作是一個(gè)Value為null的HashMap。Set類型的數(shù)據(jù)具有無(wú)序、元素不可重復(fù)、查找速度快和支持交集、并集、差集等功能的特征,常見(jiàn)命令如下。SADDkeymember1[member2...]:將一個(gè)或多個(gè)member元素加入到集合key中。SREMkeymember1[member2...]:刪除集合key中的一個(gè)或多個(gè)member元素。SCARDkey:返回集合key中元素的個(gè)數(shù)。SISMEMBERkeymember:判斷元素member是否存在于集合key中。SMEMBERSkey:獲取集合key中的所有元素。SINTERkey1[key2...]:獲取所有集合的交集。5.4.1

Redis快速入門3.Redis的數(shù)據(jù)類型(4)SortedSetRedis中的SortedSet是一個(gè)可排序的Set集合,SortedSet中的每一個(gè)元素都帶有一個(gè)score屬性,可以基于score屬性對(duì)元素排序,底層的實(shí)現(xiàn)是一個(gè)跳表(SkipList)加Hash表。SortedSet常見(jiàn)命令如下。ZADDkeyscoremember:添加一個(gè)或多個(gè)元素到集合key中,如果已經(jīng)存在則更新其score值。ZREMkeymember:刪除集合key中的元素member。ZSCOREkeymember:獲取集合key中的元素member的score值。ZRANKkeymember:獲取集合key中的元素member的排名。ZCARDkey:獲取集合key中的元素個(gè)數(shù)。ZCOUNTkeyminmax:統(tǒng)計(jì)集合key中score值在給定范圍內(nèi)的所有元素的個(gè)數(shù)。ZINCRBYkeyincrementmember:讓集合key中的元素member根據(jù)步長(zhǎng)increment進(jìn)行自增。5.4.1

Redis快速入門3.Redis的數(shù)據(jù)類型(5)HashHash是由字符串類型的field和value組成的映射表,可以把它理解成一個(gè)包含了多個(gè)鍵值對(duì)的集合,一般用于存儲(chǔ)對(duì)象。Hash有以下常見(jiàn)命令。HSETkeyfieldvalue:將集合key中字段field的值設(shè)為value。HGETkeyfield:獲取集合key中字段field的值。HMSETkeyfield1value1[field2value2...]:將一個(gè)或多個(gè)field-value對(duì)設(shè)置到集合key中。HMGETkeyfield1[field2...]:獲取集合key中一個(gè)或多個(gè)field的值。HGETALLkey:獲取集合key中的所有的field和Value。HKEYSkey:獲取集合key中的所有的field。HINCRBYkeyfieldincrement:讓集合key中的field字段根據(jù)步長(zhǎng)increment自增。HSETNXkeyfieldvalue:在集合key中,當(dāng)且僅當(dāng)field不存在時(shí),添加字段field,字段對(duì)應(yīng)的值為value。5.4.2

SpringDataRedis快速入門先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握SpringDataRedis快速入門,能夠說(shuō)出SpringDataRedis的特性,以及應(yīng)用SpringDataRedis的常見(jiàn)操作5.4.2

SpringDataRedis快速入門為了方便開(kāi)發(fā)者使用Redis,Redis官方為主流的編程語(yǔ)言都提供了對(duì)應(yīng)的客戶端,其中面向Java的客戶端有Redisson、Jedis和Lettuce等。Jedis和Lettuce提供了Redis命令對(duì)應(yīng)的API,因此操作Redis比較方便。如果一個(gè)項(xiàng)目中使用了Lettuce連接Redis,后來(lái)決定棄用Lettuce改用Jedis,就要面臨修改代碼的問(wèn)題,對(duì)于此種問(wèn)題,可以使用SpringDataRedis。下面對(duì)SpringDataRedis概述和常見(jiàn)操作進(jìn)行講解。5.4.2

SpringDataRedis快速入門SpringDataRedis是SpringData在Spring管理的項(xiàng)目中對(duì)Redis操作的具體實(shí)現(xiàn)。SpringBoot為支持Redis提供了spring-boot-starter-data-redis.jar,該Starter使用SpringDataRedis對(duì)底層Lettuce和Jedis進(jìn)行了封裝,并為L(zhǎng)ettuce和Jedis提供了自動(dòng)配置。SpringDataRedis具有如下特性。提供了對(duì)不同Redis客戶端的整合Lettuce和Jedis。提供了RedisTemplate統(tǒng)一API來(lái)操作Redis。支持Redis的發(fā)布訂閱模型。支持Redis哨兵和Redis集群。支持基于Lettuce的響應(yīng)式編程。支持基于JDK、JSON、字符串、Spring對(duì)象的數(shù)據(jù)序列化及反序列化。支持基于Redis的JDKCollection實(shí)現(xiàn)。1.SpringDataRedis概述5.4.2

SpringDataRedis快速入門(1)RedisTemplate常見(jiàn)APISpringDataRedis中提供了RedisTemplate工具類,該工具類封裝了各種對(duì)Redis的操作,并且將不同數(shù)據(jù)類型的操作API封裝到了不同的Operation接口對(duì)象中。2.SpringDataRedis常見(jiàn)操作方法說(shuō)明ValueOperations<K,V>opsForValue()獲取操作String類型數(shù)據(jù)的對(duì)象。ListOperations<K,V>opsForList()獲取操作List類型數(shù)據(jù)的對(duì)象。SetOperations<K,V>opsForSet()獲取操作Set類型數(shù)據(jù)的對(duì)象。ZSetOperations<K,V>opsForZSet()獲取操作SortedSet類型數(shù)據(jù)的對(duì)象。HashOperations<K,HK,HV>opsForHash()獲取操作Hash類型數(shù)據(jù)的對(duì)象。獲取常用Operation接口對(duì)象的方法5.4.2

SpringDataRedis快速入門為了能更便捷操作Redis,RedisTemplate還可以通過(guò)bound綁定指定的Key,綁定Key后再次進(jìn)行一系列的操作時(shí),無(wú)須顯式的再次指定Key。2.SpringDataRedis常見(jiàn)操作常用的綁定Key的方法方法說(shuō)明BoundValueOperations<K,V>boundValueOps(Kkey)綁定映射String類型數(shù)據(jù)的KeyBoundListOperations<K,V>boundListOps(Kkey)綁定映射List類型數(shù)據(jù)的KeyBoundSetOperations<K,V>boundSetOps(Kkey綁定映射Set類型數(shù)據(jù)的KeyBoundZSetOperations<K,V>boundZSetOps(Kkey)綁定映射SortedSet類型數(shù)據(jù)的KeyBoundHashOperations

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論