摘要:測試程序首先看到頂層服務使用格式進行輸出。的列舉包括以下值默認,公開所有公開和注解的,除非設置為暴露所有修飾的創建配置類測試分頁和排序分頁是一個由定義的接口,它擁有一個實現。排序提供一個對象提供排序機制。
使用 JPA 訪問數據 創建項目
打開IDEA -> Create New Project
創建目錄 創建實體package com.example.demo.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Customer { @Id @GeneratedValue private Long id; private String firstName; private String lastName; protected Customer() { } public Customer(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Override public String toString() { return "Customer{" + "id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "}"; } }創建 repository
創建與實體對應的Repository
package com.example.demo.repository; import com.example.demo.entity.Customer; import org.springframework.data.repository.CrudRepository; import java.util.List; public interface CustomerRepository extends CrudRepository{ List findByLastName(String lastName); }
通過繼承CrudRepository繼承幾種增刪改查方法,也可以通過方法名支定義其他查詢方法。
添加啟動加載類 CommandLineRunner 測試package com.example.demo; import com.example.demo.entity.Customer; import com.example.demo.repository.CustomerRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class SpringDataJpaDemoApplication { public static final Logger log = LoggerFactory.getLogger(SpringDataJpaDemoApplication.class); public static void main(String[] args) { SpringApplication.run(SpringDataJpaDemoApplication.class, args); } @Bean public CommandLineRunner demo(CustomerRepository repository) { return (args -> { repository.save(new Customer("Jack", "Bauer")); repository.save(new Customer("Chloe", "Brian")); repository.save(new Customer("Kim", "Bauer")); repository.save(new Customer("David", "Palmer")); repository.save(new Customer("Michelle", "Dessler")); log.info("Customer found with save() finish"); log.info("Customer found with findAll()"); log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); for (Customer customer : repository.findAll()) { log.info(customer.toString()); } log.info(""); repository.findById(1L).ifPresent(customer -> { log.info("Customer found with findById()"); log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); log.info(customer.toString()); log.info(""); }); log.info("Customer found with findByLastName("findByLastName")"); log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); repository.findByLastName("Bauer").forEach(bauer -> { log.info(bauer.toString()); }); log.info(""); }); } }
運行程序,通過 log 查看效果
使用 REST 訪問 JPA 數據pom.xml 添加依賴
創建實體org.springframework.boot spring-boot-starter-data-rest
package com.example.demo.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }創建 repository
package com.example.demo.repository; import com.example.demo.entity.Person; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RepositoryRestResource; import java.util.List; @RepositoryRestResource public interface PersonRepository extends PagingAndSortingRepository{ List findPersonByLastName(@Param("name") String name); }
此repository是一個接口,允許您執行涉及Person對象的各種操作。它通過繼承Spring Data Commons中定義的PagingAndSortingRepository接口來獲取這些操作
在運行時,Spring Data REST將自動創建此接口的實現。然后它將使用@RepositoryRestResource注解指導Spring MVC創建RESTful端點/persons。
測試程序
首先看到頂層服務
curl http://localhost:8080/ { "_links" : { "customers" : { "href" : "http://localhost:8080/customers" }, "persons" : { "href" : "http://localhost:8080/persons{?page,size,sort}", "templated" : true }, "profile" : { "href" : "http://localhost:8080/profile" } } }
Spring Data REST使用HAL格式進行JSON輸出。它非常靈活,可以方便地提供與所服務數據相鄰的鏈接。
curl http://localhost:8080/persons { "_embedded" : { "persons" : [ ] }, "_links" : { "self" : { "href" : "http://localhost:8080/persons{?page,size,sort}", "templated" : true }, "profile" : { "href" : "http://localhost:8080/profile/persons" }, "search" : { "href" : "http://localhost:8080/persons/search" } }, "page" : { "size" : 20, "totalElements" : 0, "totalPages" : 0, "number" : 0 } }
可以看到customers的也跟著顯示出來了,我們可以通過注釋隱藏,當然也可以全局隱藏:
設置存儲庫檢測策略Spring Data REST使用RepositoryDetectionStrategy來確定是否將存儲庫導出為REST資源。的RepositoryDiscoveryStrategies列舉包括以下值:
Name | Description |
---|---|
DEFAULT | 默認,ANNOTATION + VISIBILITY |
ALL | 公開所有Repository |
ANNOTATION | 公開@RepositoryRestResource和@RestResource注解的Repository,除非exported設置為false |
VISIBILITY | 暴露所有public修飾的Repository |
創建配置類
package com.example.demo.config; import org.springframework.data.rest.core.config.RepositoryRestConfiguration; import org.springframework.data.rest.core.mapping.RepositoryDetectionStrategy; import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer; import org.springframework.stereotype.Component; @Component public class RestConfigurer implements RepositoryRestConfigurer { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.setRepositoryDetectionStrategy(RepositoryDetectionStrategy.RepositoryDetectionStrategies.ANNOTATED); } }
測試
curl http://localhost:8080/ { "_links" : { "persons" : { "href" : "http://localhost:8080/persons{?page,size,sort}", "templated" : true }, "profile" : { "href" : "http://localhost:8080/profile" } } }分頁和排序 分頁
Pageable 是一個由 Spring 定義的接口,它擁有一個實現 PageRequest。讓我們看看如何創建一個 PageRequest。
Pageable pageable = PageRequest.of(0, 10); Pagepage = repository.findAll(pageable); // 也可以簡單一點 Page page = repository.findAll(PageRequest.of(0, 10));
表示請求第一頁10個數據。
如果我們要訪問下一頁,我們可以每次增加頁碼。
PageRequest.of(1, 10); PageRequest.of(2, 10); PageRequest.of(3, 10); ...排序
Spring Data JPA 提供一個Sort對象提供排序機制。讓我們看一下排序的方式。
repository.findAll(Sort.by("fistName")); repository.findAll(Sort.by("fistName").ascending().and(Sort.by("lastName").descending());同時排序和分頁
Pageable pageable = PageRequest.of(0, 20, Sort.by("firstName")); Pageable pageable = PageRequest.of(0, 20, Sort.by("fistName").ascending().and(Sort.by("lastName").descending());按示例對象查詢
QueryByExampleExecutor
構建復雜查詢SpringData JPA 為了實現 "Domain Driven Design" 中的規范概念,提供了一些列的 Specification 接口,其中最常用的便是 :JpaSpecificationExecutor。
使用 SpringData JPA 構建復雜查詢(join操作,聚集操作等等)都是依賴于 JpaSpecificationExecutor 構建的 Specification 。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73506.html
摘要:教程簡介本項目內容為教程樣例。目的是通過學習本系列教程,讀者可以從到掌握的知識,并且可以運用到項目中。本章將進一步講解,結合完成數據層訪問。創建控制器在下面創建控制器用于測試訪問程序運行和調試在類中,啟動程序。 教程簡介 本項目內容為Spring Boot教程樣例。目的是通過學習本系列教程,讀者可以從0到1掌握spring boot的知識,并且可以運用到項目中。如您覺得該項目對您有用,...
摘要:忽略該字段的映射省略創建數據訪問層接口,需要繼承,第一個泛型參數是實體對象的名稱,第二個是主鍵類型。 SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 上一篇介紹了Spring JdbcTempl...
摘要:以前都是用進行數據庫的開發,最近學習之后發現顯得更友好,所以我們就一起來了解一下的原理吧。簡單介紹持久性是的一個規范。它用于在對象和關系數據庫之間保存數據。充當面向對象的領域模型和關系數據庫系統之間的橋梁。是標識出主鍵是指定主鍵的自增方式。 以前都是用Mybatis進行數據庫的開發,最近學習Spring Boot之后發現JPA顯得更友好,所以我們就一起來了解一下JPA的原理吧。 Spr...
閱讀 2234·2021-11-17 09:33
閱讀 2774·2021-11-12 10:36
閱讀 3396·2021-09-27 13:47
閱讀 884·2021-09-22 15:10
閱讀 3485·2021-09-09 11:51
閱讀 1392·2021-08-25 09:38
閱讀 2757·2019-08-30 15:55
閱讀 2608·2019-08-30 15:53