《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第6、7章 Spring Boot的數(shù)據(jù)訪問(wèn)、MyBatis與MyBatis-Plus_第1頁(yè)
《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第6、7章 Spring Boot的數(shù)據(jù)訪問(wèn)、MyBatis與MyBatis-Plus_第2頁(yè)
《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第6、7章 Spring Boot的數(shù)據(jù)訪問(wèn)、MyBatis與MyBatis-Plus_第3頁(yè)
《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第6、7章 Spring Boot的數(shù)據(jù)訪問(wèn)、MyBatis與MyBatis-Plus_第4頁(yè)
《 Spring Boot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》 課件 第6、7章 Spring Boot的數(shù)據(jù)訪問(wèn)、MyBatis與MyBatis-Plus_第5頁(yè)
已閱讀5頁(yè),還剩183頁(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)介

第6章SpringBoot的數(shù)據(jù)訪問(wèn)學(xué)習(xí)目的與要求本章將詳細(xì)介紹Spring

Boot訪問(wèn)數(shù)據(jù)庫(kù)的解決方案。通過(guò)本章的學(xué)習(xí),掌握SpringBoot訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)及非關(guān)系型數(shù)據(jù)庫(kù)的解決方案?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

目錄6.1SpringDataJPA6.2REST6.3MongoDB6.4Redis6.5數(shù)據(jù)緩存Cache《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.1SpringDataJPAJPA(JavaPersistenceAPI)是官方提出的Java持久化規(guī)范。JPA通過(guò)注解或XML描述對(duì)象—關(guān)系(表)的映射關(guān)系,并將內(nèi)存中的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)。SpringDataJPA通過(guò)提供基于JPA的Repository極大地簡(jiǎn)化了JPA的寫法,在幾乎不寫實(shí)現(xiàn)的情況下,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的訪問(wèn)和操作。使用SpringDataJPA建立數(shù)據(jù)訪問(wèn)層十分方便,只需要定義一個(gè)繼承JpaRepository接口的接口即可?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.1SpringDataJPA

JpaRepository<T,ID>接口方法:voidflush():將緩存的對(duì)象數(shù)據(jù)操作更新到數(shù)據(jù)庫(kù)。<SextendsT>SsaveAndFlush(Sentity):保存對(duì)象的同時(shí)立即更新到數(shù)據(jù)庫(kù)。<SextendsT>List<S>saveAllAndFlush(Iterable<S>entities):保存多個(gè)對(duì)象的同時(shí)立即更新到數(shù)據(jù)庫(kù)。voiddeleteAllInBatch(Iterable<T>entities):批量刪除提供的實(shí)體對(duì)象。voiddeleteAllByIdInBatch(Iterable<ID>ids):根據(jù)id批量刪除提供的實(shí)體對(duì)象。voiddeleteAllInBatch():批量刪除所有的實(shí)體對(duì)象。TgetReferenceById(IDid):根據(jù)id獲得對(duì)應(yīng)的實(shí)體對(duì)象。<SextendsT>List<S>findAll(Example<S>example):根據(jù)提供的example實(shí)例查詢實(shí)體對(duì)象數(shù)據(jù)。<SextendsT>List<S>findAll(Example<S>example,Sortsort):根據(jù)提供的example實(shí)例,并按照指定規(guī)則,查詢實(shí)體對(duì)象數(shù)據(jù)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.1.1SpringBoot的支持在SpringBoot應(yīng)用中,如果需要使用SpringDataJPA訪問(wèn)數(shù)據(jù)庫(kù),那么我們可以通過(guò)IDEA創(chuàng)建SpringBoot應(yīng)用時(shí)選擇SpringDataJPA模塊依賴。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

1.JDBC的自動(dòng)配置SpringDataJPA模塊的依賴關(guān)系,如圖6.1所示。從圖6.1的依賴關(guān)系可知,spring-boot-starter-data-jpa依賴于spring-boot-starter-jdbc,而SpringBoot對(duì)spring-boot-starter-jdbc做了自動(dòng)配置。JDBC自動(dòng)配置源碼位于org.springframework.boot.autoconfigure.jdbc包下。從DataSourceProperties類可以看出,我們可以使用“spring.datasource”為前綴的屬性在perties配置文件中配置datasource?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.JPA的自動(dòng)配置SpringBoot對(duì)JPA的自動(dòng)配置位于org.springframework.boot.autoconfigure.orm.jpa包下。從HibernateJpaAutoConfiguration類可以看出,SpringBoot對(duì)JPA的默認(rèn)實(shí)現(xiàn)是Hibernate。從JpaProperties類可以看出,我們可以使用“spring.jpa”為前綴的屬性在perties配置文件中配置JPA?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.SpringDataJPA的自動(dòng)配置SpringBoot對(duì)SpringDataJPA的自動(dòng)配置位于org.springframework.boot.autoconfigure.data.jpa包下。從JpaRepositoriesAutoConfiguration類可以看出,JpaRepositoriesAutoConfiguration依賴于HibernateJpaAutoConfiguration配置;從JpaRepositoriesRegistrar類可以看出,SpringBoot自動(dòng)開啟了對(duì)SpringDataJPA的支持,即開發(fā)人員無(wú)須在配置類中顯示聲明@EnableJpaRepositories。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4.SpringBoot應(yīng)用的SpringDataJPA我們?cè)赟pringBoot應(yīng)用中使用SpringDataJPA訪問(wèn)數(shù)據(jù)庫(kù)時(shí),除了添加spring-boot-starter-data-jpa依賴外,只需定義DataSource、持久化實(shí)體類和數(shù)據(jù)訪問(wèn)層,并在需要使用數(shù)據(jù)訪問(wèn)的地方(如Service層)依賴注入數(shù)據(jù)訪問(wèn)層即可。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.1.2簡(jiǎn)單條件查詢只需定義一個(gè)繼承JpaRepository接口的接口即可使用SpringDataJPA建立數(shù)據(jù)訪問(wèn)層。因此,自定義的數(shù)據(jù)訪問(wèn)接口完全繼承了JpaRepository的接口方法。但更重要的是,在自定義的數(shù)據(jù)訪問(wèn)接口中可以根據(jù)查詢關(guān)鍵字定義查詢方法,這些查詢方法需要符合它的命名規(guī)則,一般是根據(jù)持久化實(shí)體類的屬性名來(lái)確定的。1.查詢關(guān)鍵字目前,SpringDataJPA支持的查詢關(guān)鍵字如表6.1所示。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.限制查詢結(jié)果數(shù)量在SpringDataJPA中,使用Top和First關(guān)鍵字限制查詢結(jié)果數(shù)量。示例如下:publicinterfaceUserRepositoryextendsJpaRepository<MyUser,Integer>{ /** *獲得符合查詢條件的前10條 */ publicList<MyUser>findTop10ByUnameLike(Stringuname); /** *獲得符合查詢條件的前15條 */ publicList<MyUser>findFirst15ByUnameLike(Stringuname);}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.簡(jiǎn)單條件查詢示例【例6-1】使用SpringDataJPA進(jìn)行簡(jiǎn)單條件查詢。1)創(chuàng)建數(shù)據(jù)庫(kù)本書采用的關(guān)系型數(shù)據(jù)庫(kù)是MySQL8,我們?yōu)榱搜菔颈纠?,首先通過(guò)命令“CREATEDATABASEspringbootjpa;”創(chuàng)建名為springbootjpa的數(shù)據(jù)庫(kù)。2)創(chuàng)建基于Thymeleaf和SpringDataJPA的SpringBootWeb應(yīng)用ch6_1在IDEA中,創(chuàng)建基于Lombok、Thymeleaf和SpringDataJPA的SpringBootWeb應(yīng)用ch6_1。3)修改pom.xml文件,添加MySQL依賴《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.簡(jiǎn)單條件查詢示例4)設(shè)置Web應(yīng)用ch6_1的上下文路徑及數(shù)據(jù)源配置信息server.servlet.context-path=/ch6_1spring.datasource.url=jdbc:mysql://localhost:3306/springbootjpa?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#指定數(shù)據(jù)庫(kù)類型spring.jpa.database=MYSQL#指定是否在日志中顯示SQL語(yǔ)句spring.jpa.show-sql=true#指定自動(dòng)創(chuàng)建、更新數(shù)據(jù)庫(kù)表等配置,update表示如果數(shù)據(jù)庫(kù)中存在持久化類對(duì)應(yīng)的表就不創(chuàng)建,不存在就創(chuàng)建對(duì)應(yīng)的表spring.jpa.hibernate.ddl-auto=update#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.簡(jiǎn)單條件查詢示例5)創(chuàng)建持久化實(shí)體類MyUser@Entity@Table(name="user_table")@DatapublicclassMyUserimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateintid;//主鍵

/**使用@Column注解,可以配置列相關(guān)屬性(列名,長(zhǎng)度等),可以省略,默認(rèn)為屬性名小寫,如果屬性名是詞組,將在中間加上“_”。*/privateStringuname;privateStringusex;privateintage;}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.簡(jiǎn)單條件查詢示例6)創(chuàng)建數(shù)據(jù)訪問(wèn)層創(chuàng)建名為com.ch.ch6_1.repository的包,并在該包中創(chuàng)建名為UserRepository的接口。該接口繼承JpaRepository接口。/**這里不需要使用@Repository注解數(shù)據(jù)訪問(wèn)層,因?yàn)镾pringBoot自動(dòng)配置了JpaRepository*/publicinterfaceUserRepositoryextendsJpaRepository<MyUser,Integer>{ publicMyUserfindByUname(Stringuname); publicList<MyUser>findByUnameLike(Stringuname);}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.簡(jiǎn)單條件查詢示例7)創(chuàng)建業(yè)務(wù)層創(chuàng)建名為com.ch.ch6_1.service的包,并在該包中創(chuàng)建UserService接口和接口的實(shí)現(xiàn)類UserServiceImpl。@ServicepublicclassUserServiceImplimplementsUserService{

@Autowired//依賴注入數(shù)據(jù)訪問(wèn)層

privateUserRepositoryuserRepository;

……}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.簡(jiǎn)單條件查詢示例8)創(chuàng)建控制器類UserTestController創(chuàng)建名為com.ch.ch6_1.controller的包,并在該包中創(chuàng)建名為UserTestController的控制器類。@ControllerpublicclassUserTestController{

@Autowired privateUserServiceuserService; @GetMapping("/save")

@ResponseBody publicStringsave(){

userService.saveAll(); return"保存用戶成功!"; } ……}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.簡(jiǎn)單條件查詢示例9)整理腳本樣式靜態(tài)文件JS腳本、CSS樣式、圖片等靜態(tài)文件默認(rèn)放置在src/main/resources/static目錄下,ch6_1應(yīng)用引入的BootStrap和jQuery與【例5-5】中的一樣,不再贅述。10)創(chuàng)建View視圖頁(yè)面在src/main/resources/templates目錄下,創(chuàng)建視圖頁(yè)面showAll.html和showAuser.html?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.簡(jiǎn)單條件查詢示例11)運(yùn)行首先,運(yùn)行Ch61Application主類。然后,訪問(wèn)“http://localhost:8080/ch6_1/save/”。通過(guò)訪問(wèn)“http://localhost:8080/ch6_1/findAll”查詢所有用戶,運(yùn)行效果如圖6.3所示?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.1.3關(guān)聯(lián)查詢1.@OneToOne在SpringDataJPA中,可用兩種方式描述一對(duì)一關(guān)系映射。一種是通過(guò)外鍵的方式(一個(gè)實(shí)體通過(guò)外鍵關(guān)聯(lián)到另一個(gè)實(shí)體的主鍵);一種是通過(guò)一張關(guān)聯(lián)表來(lái)保存兩個(gè)實(shí)體一對(duì)一的關(guān)系?!纠?-2】使用SpringDataJPA實(shí)現(xiàn)人與身份證的一對(duì)一關(guān)系映射。首先,為【例6-2】創(chuàng)建基于Lombok與SpringDataJPA依賴的SpringBootWeb應(yīng)用ch6_2。ch6_2應(yīng)用的數(shù)據(jù)庫(kù)、pom.xml以及perties與ch6_1應(yīng)用基本一樣,不再贅述?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

1)創(chuàng)建持久化實(shí)體類創(chuàng)建名為com.ch.ch6_2.entity的包,并在該包中創(chuàng)建名為Person和IdCard的持久化實(shí)體類?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2)創(chuàng)建數(shù)據(jù)訪問(wèn)層創(chuàng)建名為com.ch.ch6_2.repository的包,并在該包中創(chuàng)建名為IdCardRepository和PersonRepository的接口?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3)創(chuàng)建業(yè)務(wù)層創(chuàng)建名為com.ch.ch6_2.service的包,并在該包中創(chuàng)建名為PersonAndIdCardService的接口和接口實(shí)現(xiàn)類PersonAndIdCardServiceImpl?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4)創(chuàng)建控制器類創(chuàng)建名為com.ch.ch6_2.controller的包,并在該包中創(chuàng)建名為TestOneToOneController的控制器類?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

5)運(yùn)行首先,運(yùn)行Ch62Application主類。然后,訪問(wèn)“http://localhost:8080/ch6_2/save”。通過(guò)“http://localhost:8080/ch6_2/findByIdCard_id?id=1”查詢身份證id為1的人員信息(關(guān)聯(lián)查詢)。通過(guò)“http://localhost:8080/ch6_2/findByPerson_id?id=1”查詢?nèi)藛Tid為1的身份證信息(關(guān)聯(lián)查詢)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.@OneToMany和@ManyToOne在SpringDataJPA中,使用@OneToMany和@ManyToOne來(lái)表示一對(duì)多的雙向關(guān)聯(lián)。例如,一端(Author)使用@OneToMany,多端(Article)使用@ManyToOne。在JPA規(guī)范中,一對(duì)多的雙向關(guān)系由多端(如Article)來(lái)維護(hù)。就是說(shuō)多端為關(guān)系的維護(hù)端,負(fù)責(zé)關(guān)系的增刪改查。一端則為關(guān)系的被維護(hù)端,不能維護(hù)關(guān)系。一端(Author)使用@OneToMany注解的mappedBy="author"屬性表明一端(Author)是關(guān)系的被維護(hù)端。多端(Article)使用@ManyToOne和@JoinColumn來(lái)注解屬性author,@ManyToOne表明Article是多端,@JoinColumn設(shè)置在article表的關(guān)聯(lián)字段(外鍵)上?!纠?-3】使用SpringDataJPA實(shí)現(xiàn)Author與Article的一對(duì)多關(guān)系映射?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

1)創(chuàng)建持久化實(shí)體類在com.ch.ch6_2.entity包中,創(chuàng)建名為Author和Article的持久化實(shí)體類?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2)創(chuàng)建數(shù)據(jù)訪問(wèn)層在com.ch.ch6_2.repository包中,創(chuàng)建名為AuthorRepository和ArticleRepository的接口?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3)創(chuàng)建業(yè)務(wù)層在com.ch.ch6_2.service包中,創(chuàng)建名為AuthorAndArticleService的接口和接口實(shí)現(xiàn)類AuthorAndArticleServiceImpl?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4)創(chuàng)建控制器類在com.ch.ch6_2.controller包中,創(chuàng)建名為TestOneToManyController的控制器類?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

5)運(yùn)行首先,運(yùn)行Ch62Application主類。然后,訪問(wèn)“http://localhost:8080/ch6_2/saveOneToMany”。通過(guò)“http://localhost:8080/ch6_2/findArticleByAuthor_id?id=2”查詢作者id為2的文章列表(關(guān)聯(lián)查詢)。通過(guò)“http://localhost:8080/ch6_2/findArticleByAuthor_aname?aname=陳恒1”查詢作者名為陳恒1的文章列表(關(guān)聯(lián)查詢)。通過(guò)“http://localhost:8080/ch6_2/findByArticleList_titleContaining?title=對(duì)多1”查詢文章標(biāo)題包含“對(duì)多1”的作者(關(guān)聯(lián)查詢)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.@ManyToMany在SpringDataJPA中使用@ManyToMany來(lái)注解多對(duì)多的映射關(guān)系,由一個(gè)關(guān)聯(lián)表來(lái)維護(hù)。關(guān)聯(lián)表的表名默認(rèn)是:主表名+下劃線+從表名(主表是指關(guān)系維護(hù)端對(duì)應(yīng)的表,從表是指關(guān)系被維護(hù)端對(duì)應(yīng)的表)。關(guān)聯(lián)表只有兩個(gè)外鍵字段,分別指向主表ID和從表ID。字段的名稱默認(rèn)為:主表名+下劃線+主表中的主鍵列名,從表名+下劃線+從表中的主鍵列名。需要注意的是,多對(duì)多關(guān)系中一般不設(shè)置級(jí)聯(lián)保存、級(jí)聯(lián)刪除、級(jí)聯(lián)更新等操作?!纠?-4】使用SpringDataJPA實(shí)現(xiàn)用戶(User)與權(quán)限(Authority)的多對(duì)多關(guān)系映射?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

1)創(chuàng)建持久化實(shí)體類在com.ch.ch6_2.entity包中,創(chuàng)建名為User和Authority的持久化實(shí)體類?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2)創(chuàng)建數(shù)據(jù)訪問(wèn)層在com.ch.ch6_2.repository包中,創(chuàng)建名為UserRepository和AuthorityRepository的接口?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3)創(chuàng)建業(yè)務(wù)層在com.ch.ch6_2.service包中,創(chuàng)建名為UserAndAuthorityService的接口和接口實(shí)現(xiàn)類UserAndAuthorityServiceImpl。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4)創(chuàng)建控制器類在com.ch.ch6_2.controller包中,創(chuàng)建名為TestManyToManyController的控制器類?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

5)運(yùn)行首先,運(yùn)行Ch62Application主類。然后,訪問(wèn)“http://localhost:8080/ch6_2/saveManyToMany”。通過(guò)“http://localhost:8080/ch6_2/findByAuthorityList_id?id=1”查詢擁有id為1的權(quán)限的用戶列表(關(guān)聯(lián)查詢)。通過(guò)“http://localhost:8080/ch6_2/findByAuthorityList_name?name=修改”查詢擁有“修改”權(quán)限的用戶列表(關(guān)聯(lián)查詢)。通過(guò)“http://localhost:8080/ch6_2/findByUserList_id?id=2”查詢id為2的用戶的權(quán)限列表(關(guān)聯(lián)查詢)。通過(guò)“http://localhost:8080/ch6_2/findByUserList_Username?username=陳恒2”查詢用戶名為“陳恒2”的用戶的權(quán)限列表(關(guān)聯(lián)查詢)。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.1.4@Query和@Modifying注解使用@Query注解可以將JPQL語(yǔ)句直接定義在數(shù)據(jù)訪問(wèn)接口方法上,并且接口方法名不受查詢關(guān)鍵字和關(guān)聯(lián)查詢命名規(guī)范約束。@Query("selectafromAuthorityainnerjoina.userListuwhereu.username=?1")publicList<Authority>findByUserListUsername(Stringusername);@Query("selectnewMap(a.titleastitle,a.contentascontent)fromArticleawherea.author.id=?1")publicList<Map<String,Object>>findTitleAndContentByAuthorId(Integerid);@Query("selectafromArticleawherea.author.aname=:aname1anda.author.id=:id1")publicList<Article>findArticleByAuthorAnameAndId(@Param("aname1")Stringaname,@Param("id1")Integerid);@Modifying@Query("deletefromAuthorawherea.id=?1")publicintdeleteAuthorByAuthorId(intid);《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.1.5排序與分頁(yè)查詢?cè)趯?shí)際應(yīng)用開發(fā)中,排序與分頁(yè)查詢是必需的。幸運(yùn)的是SpringDataJPA充分考慮了排序與分頁(yè)查詢的場(chǎng)景,為我們提供了Sort類、Page接口以及Pageable接口。【例6-5】排序與分頁(yè)查詢的使用方法。首先,為【例6-5】創(chuàng)建基于Thymeleaf、Lombok和SpringDataJPA的Spring

BootWeb應(yīng)用ch6_3。ch6_3應(yīng)用的數(shù)據(jù)庫(kù)、pom.xml、perties以及靜態(tài)資源等內(nèi)容與ch6_1應(yīng)用基本一樣,不再贅述?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

1.創(chuàng)建持久化實(shí)體類在應(yīng)用ch6_3的src/main/java目錄下,創(chuàng)建名為com.ch.ch6_3.entity的包,并在該包中創(chuàng)建名為Article和Author的持久化實(shí)體類。具體代碼分別與ch6_2應(yīng)用的Article和Author的代碼一樣,不再贅述。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.創(chuàng)建數(shù)據(jù)訪問(wèn)層在應(yīng)用ch6_3的src/main/java目錄下,創(chuàng)建名為com.ch.ch6_3.repository的包,并在該包中創(chuàng)建名為AuthorRepository的接口?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.創(chuàng)建業(yè)務(wù)層在應(yīng)用ch6_3的src/main/java目錄下,創(chuàng)建名為com.ch.ch6_3.service的包,并在該包中創(chuàng)建名為ArticleAndAuthorService的接口和接口實(shí)現(xiàn)類ArticleAndAuthorServiceImpl?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4.創(chuàng)建控制器類在應(yīng)用ch6_3的src/main/java目錄下,創(chuàng)建com.ch.ch6_3.controller的包,并在該包中創(chuàng)建名為TestSortAndPage的控制器類。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

5.創(chuàng)建View視圖頁(yè)面在src/main/resources/templates目錄下,創(chuàng)建視圖頁(yè)面index.html?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.運(yùn)行首先,運(yùn)行Ch63Application主類。然后,通過(guò)“http://localhost:8080/ch6_3/findByAnameContaining?aname=陳&sortColum=id”查詢作者名含有“陳”的作者列表,并按照id降序。通過(guò)“http://localhost:8080/ch6_3/findAllAuthorByPage”分頁(yè)查詢作者,并按照id降序。運(yùn)行效果如圖6.18所示。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

目錄6.1SpringDataJPA6.2REST6.3MongoDB6.4Redis6.5數(shù)據(jù)緩存Cache《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.2.1REST簡(jiǎn)介REST即表現(xiàn)層狀態(tài)轉(zhuǎn)化(英文:RepresentationalStateTransfer,簡(jiǎn)稱REST)是RoyThomasFielding博士在2000年他的博士論文中提出來(lái)的一種軟件架構(gòu)風(fēng)格。它是一種針對(duì)網(wǎng)絡(luò)應(yīng)用的設(shè)計(jì)和開發(fā)方式,可以降低開發(fā)的復(fù)雜性,提高系統(tǒng)的可伸縮性。目前在三種主流的Web服務(wù)實(shí)現(xiàn)方案中,因?yàn)镽EST模式的Web服務(wù)與復(fù)雜的SOAP和XML-RPC對(duì)比來(lái)講明顯的更加簡(jiǎn)潔,越來(lái)越多的Web服務(wù)開始采用REST風(fēng)格設(shè)計(jì)和實(shí)現(xiàn)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.2.1REST簡(jiǎn)介REST是一組架構(gòu)約束條件和原則。這些約束有:1.使用客戶/服務(wù)器模型。客戶和服務(wù)器之間通過(guò)一個(gè)統(tǒng)一的接口來(lái)互相通訊。2.層次化的系統(tǒng)。在一個(gè)REST系統(tǒng)中,客戶端并不會(huì)固定地與一個(gè)服務(wù)器打交道。3.無(wú)狀態(tài)。在一個(gè)REST系統(tǒng)中,服務(wù)端并不會(huì)保存有關(guān)客戶的任何狀態(tài)。也就是說(shuō),客戶端自身負(fù)責(zé)用戶狀態(tài)的維持,并在每次發(fā)送請(qǐng)求時(shí)都需要提供足夠的信息。4.可緩存。REST系統(tǒng)需要能夠恰當(dāng)?shù)鼐彺嬲?qǐng)求,以盡量減少服務(wù)端和客戶端之間的信息傳輸,以提高性能。5.統(tǒng)一的接口。一個(gè)REST系統(tǒng)需要使用一個(gè)統(tǒng)一的接口來(lái)完成子系統(tǒng)之間以及服務(wù)與用戶之間的交互。這使得REST系統(tǒng)中的各個(gè)子系統(tǒng)可以獨(dú)自完成演化。滿足這些約束條件和原則的應(yīng)用程序或設(shè)計(jì)就是RESTful。需要注意的是,REST是設(shè)計(jì)風(fēng)格而不是標(biāo)準(zhǔn)。REST通常基于HTTP、URI、XML以及HTML這些現(xiàn)有的廣泛流行的協(xié)議和標(biāo)準(zhǔn)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.2.2SpringBoot整合REST在SpringBoot的Web應(yīng)用中,自動(dòng)支持REST。也就是說(shuō),只要spring-boot-starter-web依賴在pom中,就支持REST?!纠?-6】一個(gè)RESTful應(yīng)用示例假如,在ch6_2應(yīng)用的控制器類中有如下處理方法:@RequestMapping("/findArticleByAuthor_id/{id}")publicList<Article>findByAuthor_id(@PathVariable("id")Integerid){

returnauthorAndArticleService.findByAuthor_id(id);}那么,我們可以使用如下所示的REST風(fēng)格的URL訪問(wèn)上述處理方法:http://localhost:8080/ch6_2/findArticleByAuthor_id/2《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.2.3SpringDataRESTSpringDataJPA是基于SpringData的repository之上,可以將repository自動(dòng)輸出為REST資源。目前,SpringDataREST支持將SpringDataJPA、SpringDataMongoDB、SpringDataNeo4j、SpringDataGemFire以及SpringDataCassandra的repository自動(dòng)轉(zhuǎn)換成REST服務(wù)。SpringBoot對(duì)SpringDataREST的自動(dòng)配置存放在org.springframework.boot.autoconfigure.data.rest包中。通過(guò)SpringBootRepositoryRestConfigurer類的源碼我們可以得出,SpringBoot已經(jīng)自動(dòng)配置了RepositoryRestConfiguration,所以在SpringBoot應(yīng)用中使用SpringDataREST只需引入spring-boot-starter-data-rest的依賴即可使用?!纠?-7】Spring

DataREST的構(gòu)建過(guò)程?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

1.創(chuàng)建SpringBoot應(yīng)用ch6_4創(chuàng)建SpringBoot應(yīng)用ch6_4,依賴為L(zhǎng)ombok、SpringDataJPA和RestRepositories。并在pom.xml文件中,添加MySQL依賴?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.設(shè)置應(yīng)用ch6_4的上下文路徑及數(shù)據(jù)源配置信息server.servlet.context-path=/apispring.datasource.url=jdbc:mysql://localhost:3306/springbootjpa?characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.jpa.database=MYSQL#指定是否在日志中顯示SQL語(yǔ)句spring.jpa.show-sql=true#指定自動(dòng)創(chuàng)建、更新數(shù)據(jù)庫(kù)表等配置,update表示如果數(shù)據(jù)庫(kù)中存在持久化類對(duì)應(yīng)的表就不創(chuàng)建,不存在就創(chuàng)建對(duì)應(yīng)的表spring.jpa.hibernate.ddl-auto=update#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.創(chuàng)建持久化實(shí)體類Student在應(yīng)用ch6_4的src/main/java目錄下,創(chuàng)建名為com.ch.ch6_4.entity的包,并在該包中創(chuàng)建名為Student的持久化實(shí)體類。@Entity@Table(name="student_table")@DatapublicclassStudentimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateintid;//主鍵}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4.創(chuàng)建數(shù)據(jù)訪問(wèn)層在應(yīng)用ch6_4的src/main/java目錄下,創(chuàng)建名為com.ch.ch6_4.repository的包,并在該包中創(chuàng)建名為StudentRepository的接口。publicinterfaceStudentRepositoryextendsJpaRepository<Student,Integer>{ /** *自定義接口查詢方法,暴露為REST資源 */

@RestResource(path="snameStartsWith",rel="snameStartsWith") List<Student>findBySnameStartsWith(@Param("sname")Stringsname);}至此,基于SpringData的REST資源服務(wù)已經(jīng)構(gòu)建完畢,接下來(lái)就是使用REST客戶端測(cè)試此服務(wù)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.2.4REST服務(wù)測(cè)試Postman是一個(gè)接口測(cè)試工具,在做接口測(cè)試時(shí),Postman相當(dāng)于一個(gè)客戶端,它可以模擬用戶發(fā)起的各類HTTP請(qǐng)求,將請(qǐng)求數(shù)據(jù)發(fā)送至服務(wù)端,獲取對(duì)應(yīng)的響應(yīng)結(jié)果,從而驗(yàn)證響應(yīng)中的結(jié)果數(shù)據(jù)是否和預(yù)期值相匹配。Postman主要是用來(lái)模擬各種HTTP請(qǐng)求的(如:get/post/delete/put..等等),Postman與瀏覽器的區(qū)別在于有的瀏覽器不能輸出JSON格式,而Postman更直觀接口返回的結(jié)果。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

1.獲得列表數(shù)據(jù)在RESTful架構(gòu)中,每個(gè)網(wǎng)址代表一種資源(resource),所以網(wǎng)址中不能有動(dòng)詞,只能有名詞,而且所用的名詞往往與實(shí)體名對(duì)應(yīng)。一般來(lái)說(shuō),數(shù)據(jù)庫(kù)中的表都是同種記錄的“集合”(collection),所以API中的名詞也應(yīng)該使用復(fù)數(shù),如students。運(yùn)行ch6_4的主類Ch64Application后,我們手工在student_table添加幾條學(xué)生信息后,在Postman中,使用GET方式訪問(wèn)“http://localhost:8080/api/students”請(qǐng)求路徑獲得所有學(xué)生信息,如圖6.19所示?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.獲得單一對(duì)象在Postman中,使用GET方式訪問(wèn)“http://localhost:8080/api/students/1”請(qǐng)求路徑獲得id為1的學(xué)生信息,如圖6.20所示。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.查詢?cè)赑ostman中,search調(diào)用自定義的接口查詢方法。因此,可以使用GET訪問(wèn)“http://localhost:8080/api/students/search/snameStartsWith?sname=陳”請(qǐng)求路徑調(diào)用List<Student>findBySnameStartsWith(@Param("sname")Stringsname)接口方法,獲得姓名前綴為“陳”的學(xué)生信息,如圖6.21所示。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4.分頁(yè)查詢?cè)赑ostman中,使用GET方式訪問(wèn)“http://localhost:8080/api/students?page=0&size=2”請(qǐng)求路徑獲得第一頁(yè)的學(xué)生信息(page=0即第一頁(yè),size=2即每頁(yè)數(shù)量為2),如圖6.22所示?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

5.排序在Postman中,使用GET方式訪問(wèn)“http://localhost:8080/api/students?sort=sno,desc”請(qǐng)求路徑獲得按照sno屬性倒序的列表,如圖6.23所示?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.保存在Postman中,發(fā)起POST方式請(qǐng)求“http://localhost:8080/api/students”實(shí)現(xiàn)新增功能,將要保存的數(shù)據(jù)放置在請(qǐng)求體中,數(shù)據(jù)類型為JSON,如圖6.24所示?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

7.更新假如,我們需要更新新增的id為4的數(shù)據(jù),可以在Postman中,使用PUT方式訪問(wèn)“http://localhost:8080/api/students/4”,修改提交的數(shù)據(jù),如圖6.25所示?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

8.刪除假如,我們需要?jiǎng)h除新增的id為4的數(shù)據(jù),可以在Postman中,使用DELETE方式訪問(wèn)“http://localhost:8080/api/students/4”,刪除數(shù)據(jù),如圖6.26所示?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

目錄6.1SpringDataJPA6.2REST6.3MongoDB6.4Redis6.5數(shù)據(jù)緩存Cache《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.3MongoDBMongoDB是一個(gè)基于分布式文件存儲(chǔ)的NoSQL數(shù)據(jù)庫(kù)。由C++語(yǔ)言編寫。旨在為Web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似JSON的BSON(BinaryJSON,二進(jìn)制JSON)格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點(diǎn)是它支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.3.1安裝MongoDB我們可以從官方網(wǎng)站/download-center/community下載自己操作系統(tǒng)對(duì)應(yīng)版本的MongoDB,作者編寫本書時(shí)使用的MongoDB是mongodb-win32-x86_64-2012plus-4.2.0-signed.msi。成功下載后,雙擊mongodb-win32-x86_64-2012plus-4.2.0-signed.msi,按照默認(rèn)安裝即可。我們可以使用MongoDB的圖形界面管理工具M(jìn)ongoDBCompass可視化操作MongoDB數(shù)據(jù)庫(kù)??梢允褂胢ongodb-win32-x86_64-2012plus-4.2.0-signed.msi自帶的MongoDBCompass,也可以從官方網(wǎng)站https:///download-center/compass下載。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.3.2SpringBoot整合MongoDB1.Spring對(duì)MongoDB的支持Spring對(duì)MongoDB的支持主要是通過(guò)SpringDataMongoDB實(shí)現(xiàn)的,SpringDataMongoDB為我們提供了如下功能。1)對(duì)象/文檔映射注解2)MongoTemplate與JdbcTemplate一樣,SpringDataMongoDB也我們提供了一個(gè)MongoTemplate,而MongoTemplate為我們提供了數(shù)據(jù)訪問(wèn)的方法。3)Repository類似于SpringDataJPA,SpringDataMongoDB也我們提供了Repository的支持,使用方式和SpringDataJPA一樣。注解含義@Document映射領(lǐng)域?qū)ο笈cMongoDB的一個(gè)文檔@Id映射當(dāng)前屬性是文檔對(duì)象ID@DBRef當(dāng)前屬性將參考其他文檔@Field為文檔的屬性定義名稱@Version將當(dāng)前屬性作為版本《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.SpringBoot對(duì)MongoDB的支持SpringBoot對(duì)MongoDB的自動(dòng)配置位于org.springframework.boot.autoconfigure.mongo包中。主要配置了數(shù)據(jù)庫(kù)連接、MongoTemplate,我們可以在配置文件中使用以“spring.data.mongodb”為前綴的屬性來(lái)配置MongoDB的相關(guān)信息。SpringBoot對(duì)MongoDB提供了一些默認(rèn)屬性,如默認(rèn)端口號(hào)為27017、默認(rèn)服務(wù)器為localhost、默認(rèn)數(shù)據(jù)庫(kù)為test、默認(rèn)無(wú)用戶名和無(wú)密碼訪問(wèn)方式,并默認(rèn)開啟了對(duì)Repository的支持。因此,我們?cè)赟pringBoot應(yīng)用中,只需引入spring-boot-starter-data-mongodb依賴即可按照默認(rèn)配置操作MongoDB數(shù)據(jù)庫(kù)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.3.3增刪改查【例6-8】在SpringBoot應(yīng)用中,對(duì)MongoDB數(shù)據(jù)庫(kù)的增刪改查。1.創(chuàng)建基于spring-boot-starter-data-mongodb依賴的SpringBootWeb應(yīng)用ch6_5在IDEA中創(chuàng)建基于Lombok、SpringWeb與SpringDataMongo依賴的SpringBootWeb應(yīng)用ch6_5。2.配置perties文件在該SpringBoot應(yīng)用ch6_5中,我們使用MongoDB的默認(rèn)數(shù)據(jù)庫(kù)連接。所以,不需要在perties文件中配置數(shù)據(jù)庫(kù)連接信息。perties文件的具體內(nèi)容如下:server.servlet.context-path=/ch6_5#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.創(chuàng)建領(lǐng)域模型在應(yīng)用ch6_5的src/main/java目錄中,創(chuàng)建名為com.ch.ch6_5.domain的包,并在該包中創(chuàng)建領(lǐng)域模型Person(人)以及Person去過(guò)的Location(地點(diǎn))。在Person類中,使用@Document注解將Person領(lǐng)域模型和MongoDB的文檔進(jìn)行映射。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4.創(chuàng)建數(shù)據(jù)訪問(wèn)接口在應(yīng)用ch6_5的src/main/java目錄中,創(chuàng)建名為com.ch.ch6_5.repository的包,并在該包中創(chuàng)建數(shù)據(jù)訪問(wèn)接口PersonRepository,該接口繼承MongoRepository接口。publicinterfacePersonRepositoryextendsMongoRepository<Person,String>{ PersonfindByPname(Stringpname);//支持方法名查詢,方法名命名規(guī)范參照表6.1

@Query("{'psex':?0}")//JSON字符串

List<Person>selectPersonsByPsex(Stringpsex);}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

5.創(chuàng)建控制器層由于本實(shí)例業(yè)務(wù)簡(jiǎn)單,我們直接在控制器層調(diào)用數(shù)據(jù)訪問(wèn)層。創(chuàng)建名為com.ch.ch6_5.controller的包,并在該包中創(chuàng)建控制器類TestMongoDBController?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.運(yùn)行首先,運(yùn)行Ch65Application主類。然后,訪問(wèn)“http://localhost:8080/ch6_5/save”測(cè)試保存數(shù)據(jù)。通過(guò)“http://localhost:8080/ch6_5/findByPname?pname=陳恒1”查詢?nèi)嗣麨椤瓣惡?”的文檔數(shù)據(jù)。通過(guò)“http://localhost:8080/ch6_5/selectPersonsByPsex?psex=女”查詢性別為“女”的文檔數(shù)據(jù)。通過(guò)“http://localhost:8080/ch6_5/updatePerson?oldPname=陳恒1&newPname=陳恒111”將人名為“陳恒1”的數(shù)據(jù)修改成人名為“陳恒111”。通過(guò)“http://localhost:8080/ch6_5/deletePerson?pname=陳恒111”將人名為“陳恒111”的文檔數(shù)據(jù)刪除?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

目錄6.1SpringDataJPA6.2REST6.3MongoDB6.4Redis6.5數(shù)據(jù)緩存Cache《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.4RedisRedis是一個(gè)開源的使用ANSIC語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。它支持字符串、哈希表、列表、集合、有序集合、位圖、地理空間信息等數(shù)據(jù)類型,同時(shí)也可以作為高速緩存和消息隊(duì)列代理。但是,Redis在內(nèi)存中存儲(chǔ)數(shù)據(jù),因此,存放在Redis中的數(shù)據(jù)不應(yīng)該大于內(nèi)存容量,否則會(huì)導(dǎo)致操作系統(tǒng)性能降低?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.4.1安裝Redis1.下載Redis編寫本書時(shí),Redis官方網(wǎng)站只提供Linux版本的下載。因此,我們只能通過(guò)/MSOpenTech/redis/tags從github上下載Redis,本書下載的版本是Redis-x64-3.2.100.zip。在運(yùn)行中輸入cmd,然后把目錄指向解壓的Redis目錄,如圖6.29所示?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.啟動(dòng)Redis服務(wù)使用redis-serverredis.windows.conf命令行啟動(dòng)Redis服務(wù),出現(xiàn)圖6.30的顯示,表示成功啟動(dòng)Redis服務(wù)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

Redis設(shè)置成Windows下的服務(wù)關(guān)閉cmd重新打開cmd,進(jìn)入Redis解壓目錄。執(zhí)行設(shè)置服務(wù)命令:redis-server--service-installredis.windows-service.conf--loglevelverbose,如圖6.31所示?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.常用的Redis服務(wù)命令卸載服務(wù):redis-server--service-uninstall開啟服務(wù):redis-server--service-start停止服務(wù):redis-server--service-stop《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4.啟動(dòng)Redis服務(wù)我們可以在cmd中,使用redis-server--service-start命令啟動(dòng)Redis服務(wù),如圖6.33所示。同時(shí)也可以在windows服務(wù)中啟動(dòng)Redis服務(wù)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

5.操作測(cè)試Redis啟動(dòng)Redis服務(wù)后,首先,使用redis-cli.exe-h-p6379命令創(chuàng)建一個(gè)地址為、端口號(hào)為6379的Redis數(shù)據(jù)庫(kù)服務(wù)。然后,使用setkeyvalue和getkey命令保存和獲得數(shù)據(jù)?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.4.2SpringBoot整合Redis1.SpringDataRedisSpring對(duì)Redis的支持是通過(guò)SpringDataRedis來(lái)實(shí)現(xiàn)的。SpringDataRedis為我們提供了RedisTemplate和StringRedisTemplate兩個(gè)模板來(lái)進(jìn)行數(shù)據(jù)操作,其中,StringRedisTemplate只針對(duì)鍵值都是字符串類型的數(shù)據(jù)進(jìn)行操作。

RedisTemplate和StringRedisTemplate模板提供的主要數(shù)據(jù)訪問(wèn)方法如表6.3所示。方法說(shuō)明opsForValue()操作只有簡(jiǎn)單屬性的數(shù)據(jù)opsForList()操作含有List的數(shù)據(jù)opsForSet()操作含有Set的數(shù)據(jù)opsForZSet()操作含有Zset(有序的Set)的數(shù)據(jù)opsForHash()操作含有Hash的數(shù)據(jù)《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

2.Serializer當(dāng)數(shù)據(jù)存儲(chǔ)到Redis時(shí),鍵和值都是通過(guò)Spring提供的Serializer序列化到數(shù)據(jù)的。RedisTemplate默認(rèn)使用JdkSerializationRedisSerializer序列化的,StringRedisTemplate默認(rèn)使用StringRedisSerializer序列化的?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

3.SpringBoot的支持SpringBoot對(duì)Redis的支持位于org.springframework.boot.autoconfigure.data.redis包下,在RedisAutoConfiguration配置類中,為我們默認(rèn)配置了RedisTemplate和StringRedisTemplate,讓我們可以直接使用Redis存儲(chǔ)數(shù)據(jù)。在RedisProperties類中,我們看到可以使用以“spring.redis”為前綴的屬性在perties中配置Redis。默認(rèn)為我們配置了數(shù)據(jù)庫(kù)名為db0、服務(wù)器地址為localhost、端口號(hào)為6379的Redis。因此,在SpringBoot應(yīng)用中,我們只要引入spring-boot-starter-data-redis依賴就可以使用默認(rèn)配置的Redis進(jìn)行數(shù)據(jù)操作?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.4.3使用StringRedisTemplate和RedisTemplate【例6-9】在SpringBoot應(yīng)用中使用StringRedisTemplate和RedisTemplate模板訪問(wèn)操作Redis數(shù)據(jù)庫(kù)。1.創(chuàng)建基于spring-boot-starter-data-redis依賴的SpringBootWeb應(yīng)用ch6_6在IDEA中創(chuàng)建基于Lombok、SpringWeb與SpringDataRedis依賴的SpringBootWeb應(yīng)用ch6_6。2.配置perties文件在Spring

Boot應(yīng)用ch6_6中,我們使用Redis的默認(rèn)數(shù)據(jù)庫(kù)連接。所以,不需要在perties文件中配置數(shù)據(jù)庫(kù)連接信息。3.創(chuàng)建實(shí)體類在應(yīng)用ch6_6的src/main/java目錄中,創(chuàng)建名為com.ch.ch6_6.entity的包,并在該包中創(chuàng)建名為Student的實(shí)體類。該類必須實(shí)現(xiàn)序列化接口,這是因?yàn)槭褂肑ackson做序列化需要一個(gè)空構(gòu)造?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

4.創(chuàng)建數(shù)據(jù)訪問(wèn)層在應(yīng)用ch6_6的src/main/java目錄中,創(chuàng)建名為com.ch.ch6_6.repository的包,并在該包中創(chuàng)建名為StudentRepository的類,該類使用@Repository注解標(biāo)注為數(shù)據(jù)訪問(wèn)層。@RepositorypublicclassStudentRepository{ @SuppressWarnings("unused")

@Autowired privateStringRedisTemplatestringRedisTemplate; @SuppressWarnings("unused")

@Autowired privateRedisTemplate<Object,Object>redisTemplate;《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

5.創(chuàng)建控制器層由于本實(shí)例業(yè)務(wù)簡(jiǎn)單,我們直接在控制器層調(diào)用數(shù)據(jù)訪問(wèn)層。在應(yīng)用ch6_6的src/main/java目錄中,創(chuàng)建名為com.ch.ch6_6.controller的包,并在該包中創(chuàng)建控制器類TestRedisController。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學(xué)出版社,2024

6.修改配置類Ch69Application我們知道RedisTemplate默認(rèn)使用JdkSerializationRedisSerializer序列化數(shù)據(jù),這對(duì)使用RedisClient查看數(shù)據(jù)很不直觀,因?yàn)镴dkSerializationRedisSerializer使用二進(jìn)制形式存儲(chǔ)數(shù)據(jù)。所以,在此我們將自己配置RedisTemplate,并定義Serialize

溫馨提示

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