Spring-Data还提供了Web模块的支持,这要求Web组件Spring-MVC的jar包位于classpath下。通常通过使用@EnableSpringDataWebSupport注解来启用继承支持。

SpringDataWebAutoConfiguration上已经添加了@EnableSpringDataWebSupport注解,我们不需要再额外配置。

  

一、EnableSpringDataWebSupport会为我们注册几个组件:

  1、DomainClassConverter:可以直接让我们在Spring-MVC控制器的方法参数列表中使用实体类型,而无需通过Repository手动查找实例(需要Repository实现CrudRepository才有资格被发现可以进行转换)。

1.1、Controller:

/**
*
* @author caofanqi
*/
@RestController
@RequestMapping("/user")
public class UserController { /**
* 这里会直接调用User对应的Repository来进行findById查询。
* 需要Repository实现CrudRepository才有资格被发现可以进行转换
*/
@GetMapping("/{id}")
public User findUserById(@PathVariable("id")User user){
return user;
}
}

1.2、单元测试:

@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest { @Resource
private MockMvc mockMvc; @Test
void findUserById() throws Exception { String result = this.mockMvc.perform(get("/user/47"))
.andDo(print())
.andExpect(status().isOk())
.andReturn().getResponse().getContentAsString(); System.out.println(result); }
}

  

  2、HandlerMethodArgumentResolvers:还为我们注册了PageableHandlerMethodArgumentResolver和SortHandlerMethodArgumentResolver让Pageable和Sort可以作为控制层方法参数。

2.1、Pageable或Sort作为控制层方法参数

  参数page:当前页,默认为0;参数size:每页大小,默认20;参数sort:排序方向,如果不同的方向使用多个sort参数。

    /**
* 参数page:默认为0。
* 参数size:默认为20。
* 参数sort:排序按property,property(,ASC|DESC)的方式来填写,默认为升序,如果想要属性有不同的排序方向,要用多个sort参数
*/
@GetMapping
public Page<User> listUser(Pageable pageable){
System.out.println("page:" + pageable.getPageNumber());
System.out.println("size:" + pageable.getPageSize());
System.out.println("sort:" + pageable.getSort());
return userRepository.findAll(pageable);
} @GetMapping("/sort")
public String sort(Sort sort){
System.out.println("sort:" + sort);
return "sort";
}
    @Test
void listUser1() throws Exception {
String result = this.mockMvc.perform(get("/user"))
.andExpect(status().isOk())
.andReturn().getResponse().getContentAsString(); System.out.println(result);
} @Test
void listUser2() throws Exception {
String result = this.mockMvc.perform(get("/user")
.param("page","2").param("size","2").param("sort","username,asc")
.param("sort","age,desc"))
.andExpect(status().isOk())
.andReturn().getResponse().getContentAsString(); System.out.println(result);
}

2.2、如果有多个分页或排序时(多个表),用@Qualifier来解决,请求参数要以${qualifier}_开头

    @GetMapping("/multi/pageable")
public String multiPageable(@Qualifier("user") Pageable userPageable, @Qualifier("book") Pageable bookPageable){
System.out.println("userPageable page:" + userPageable.getPageNumber());
System.out.println("userPageable size:" + userPageable.getPageSize());
System.out.println("userPageable sort:" + userPageable.getSort()); System.out.println("bookPageable page:" + bookPageable.getPageNumber());
System.out.println("bookPageable size:" + bookPageable.getPageSize());
System.out.println("bookPageable sort:" + bookPageable.getSort());
return "test";
}
    @Test
void multiPageable() throws Exception {
this.mockMvc.perform(get("/user/multi/pageable")
.param("user_page","2").param("user_size","2").param("user_sort","username,asc").param("user_sort","age,desc")
.param("book_page","20").param("book_size","20").param("book_sort","bookName").param("book_sort","price,desc"))
.andExpect(status().isOk());
}

  

二、使用@PageableDefault自定义pageable

  我们也可以通过@PageableDefault来自定义默认值

    /**
* 使用@PageableDefault自定义pageable
*/
@GetMapping("pageable/default")
public String pageableDefault(@PageableDefault(page = 2,size = 20,sort = {"username","age"},direction = Sort.Direction.DESC) Pageable pageable){
System.out.println("page:" + pageable.getPageNumber());
System.out.println("size:" + pageable.getPageSize());
System.out.println("sort:" + pageable.getSort());
return "PageableDefault";
}
    @Test
void pageableDefault() throws Exception {
this.mockMvc.perform(get("/user/pageable/default"))
.andExpect(status().isOk());
}

  

三、properties中的属性配置

  Spring-Data还为我们提供了一些定制化配置,可以修改常见的是否将1作为第一页,默认是0,定制参数的名字,和每页最大数量等。

#是否将1为第一页
spring.data.web.pageable.one-indexed-parameters=true
#pageable默认每页大小
spring.data.web.pageable.default-page-size=10
#每页大小最大值
spring.data.web.pageable.max-page-size=100
#当前页参数名
spring.data.web.pageable.page-parameter=pageIndex
#每页大小参数名
spring.data.web.pageable.size-parameter=pageSize
#排序参数名
spring.data.web.sort.sort-parameter=pageSort
#page和size参数的前缀,不会影响sort的参数名称
spring.data.web.pageable.prefix=pre
#多参数时分隔符
spring.data.web.pageable.qualifier-delimiter=-

源码地址:https://github.com/caofanqi/study-spring-data-jpa

学习Spring-Data-Jpa(十七)---对Web模块的支持的更多相关文章

  1. 学习Spring Data JPA

    简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特​​殊 ...

  2. 学习-spring data jpa

    spring data jpa对照表 Keyword Sample JPQL snippet And findByLastnameAndFirstname - where x.lastname = ? ...

  3. 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate

    在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...

  4. Spring Data Jpa 入门学习

    本文主要讲解 springData Jpa 入门相关知识, 了解JPA规范与Jpa的实现,搭建springboot+dpringdata jpa环境实现基础增删改操作,适合新手学习,老鸟绕道~ 1. ...

  5. spring data jpa入门学习

    本文主要介绍下spring data jpa,主要聊聊为何要使用它进行开发以及它的基本使用.本文主要是入门介绍,并在最后会留下完整的demo供读者进行下载,从而了解并且开始使用spring data ...

  6. SpringBoot学习笔记:Spring Data Jpa的使用

    更多请关注公众号 Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR ...

  7. 一步步学习 Spring Data 系列之JPA(二)

    继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...

  8. Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题

    开新坑 开新坑了(笑)....公司项目使用的是Spring Data JPA做持久化框架....学习了一段时间以后发现了一点值得注意的小问题.....与大家分享 主要是针对1:N单向关联产生的一系列问 ...

  9. Spring Boot入门第二天:一个基于Spring Boot的Web应用,使用了Spring Data JPA和Freemarker。

    原文链接 今天打算从数据库中取数据,并展示到视图中.不多说,先上图: 第一步:添加依赖.打开pom.xml文件,添加必要的依赖,完整代码如下: <?xml version="1.0&q ...

随机推荐

  1. Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态

    一.Django请求生命周期 二.路由层  urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...

  2. Python之路【第二十九篇】:django ORM模型层

    ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  3. Vivado关联Notepad++

    Vivado自带的编辑器非常难看,我习惯用Notepad++,这里记录一下二者的关联. 1.打开Vivado,点击 Tools --- Settings --- Text Editor,右侧选择 Cu ...

  4. ElasticSearch 调优

    来源:http://tinyurl.com/y4gnzbje 第一部分:调优索引速度 第二部分-调优搜索速度 英文原文:https://www.elastic.co/guide/en/elastics ...

  5. oracle基础知识语法大全

    ORACLE支持五种类型的完整性约束NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值.CHECK (检查)--检查在约束中 ...

  6. angular js根据json文件动态生成路由状态

    项目上有一个新需求,就是需要根据json文件动态生成路由状态,查阅了一下资料,现在总结一下发出来: 首先项目用到的是angular的UI-路由,所以必须引入angular.js和angular-ui- ...

  7. 小div在大div中垂直居中方式

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  8. insurance Alternative forms insuraunce保险

    insurance Contents 1 English 1.1 Alternative forms 1.2 Etymology 1.3 Pronunciation 1.4 Noun 1.4.1 De ...

  9. PHP 基于redis的分布式锁

    <?php class ProcessRedisLock { /** * redis key 前缀 */ const KEY_PREFIX = 'PROCESS_REDIS_LOCK:'; /* ...

  10. Spring中获取被代理的对象

    目录 Spring中获取被代理的对象 获取Spring被代理对象什么时候可能会用到? Spring中获取被代理的对象 Spring中获取被代理的对象 ### 获取Spring被代理对象的JAVA工具类 ...