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. Json schema前奏 关于JSON

    目录 1. 何为 JSON 2. JSON 基本语法 3. JSON值的类型 4. 与XML比较 5. 辅助工具 1. 何为 JSON JSON( JavaScript Object Notation ...

  2. Quartz基础调度框架-第一篇控制台

    Quartz基础调度框架 Quartz核心的概念:scheduler任务调度.Job任务.Trigger触发器.JobDetail任务细节 结构 Conf 在这个基本结构里 是用来存放配置 publi ...

  3. 使用密码远程QQ时窗口闪退

    系统时间不一致,在QQ上使用密码远程时会闪退,把系统时间调到大概一致就行了.

  4. Kubernetes(K8s)基础知识(docker容器技术)

    今天谈谈K8s基础知识关键词: 一个目标:容器操作:两地三中心:四层服务发现:五种Pod共享资源:六个CNI常用插件:七层负载均衡:八种隔离维度:九个网络模型原则:十类IP地址:百级产品线:千级物理机 ...

  5. How do you run an interactive process in Dart?

    https://stackoverflow.com/questions/12682269/how-do-you-run-an-interactive-process-in-dart The test ...

  6. 【转载】sqlserver中小数类型float和deciaml类型比较

    在sqlserver数据库中,float类型和double类型都可以用来表示小数类型,float类型是一种近似数值的小数类型,而decimal类型则是精确数值的小数类型.如果需要在sqlserver数 ...

  7. react新旧生命周期

    React16.3.0之前生命周期 16.3开始建议使用新的生命周期

  8. chrome浏览页面常用快捷键

    1.chrome浏览页面常用快捷键 Ctrl+N 打开新窗口. Ctrl+T 打开新标签页. Ctrl+W关闭当前标签 Ctrl + F4 关闭chrome浏览器 Ctrl+Tab 或 Ctrl+Pg ...

  9. mouseover和mouseenter两个事件的区别

    mouseover(鼠标覆盖) mouseenter(鼠标进入) 二者的本质区别在于,mouseenter不会冒泡,简单的说,它不会被它本身的子元素的状态影响到.但是mouseover就会被它的子元素 ...

  10. CASE WHEN 函数

    --Case函数: --有两种格式: -- 1.简单Case函数. -- 2.Case搜索函数. --1.简单Case函数: -- CASE [COLUMN_NAME] -- WHEN ['条件参数' ...