学习Spring-Data-Jpa(十七)---对Web模块的支持
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模块的支持的更多相关文章
- 学习Spring Data JPA
简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特殊 ...
- 学习-spring data jpa
spring data jpa对照表 Keyword Sample JPQL snippet And findByLastnameAndFirstname - where x.lastname = ? ...
- 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate
在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...
- Spring Data Jpa 入门学习
本文主要讲解 springData Jpa 入门相关知识, 了解JPA规范与Jpa的实现,搭建springboot+dpringdata jpa环境实现基础增删改操作,适合新手学习,老鸟绕道~ 1. ...
- spring data jpa入门学习
本文主要介绍下spring data jpa,主要聊聊为何要使用它进行开发以及它的基本使用.本文主要是入门介绍,并在最后会留下完整的demo供读者进行下载,从而了解并且开始使用spring data ...
- SpringBoot学习笔记:Spring Data Jpa的使用
更多请关注公众号 Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR ...
- 一步步学习 Spring Data 系列之JPA(二)
继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...
- Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题
开新坑 开新坑了(笑)....公司项目使用的是Spring Data JPA做持久化框架....学习了一段时间以后发现了一点值得注意的小问题.....与大家分享 主要是针对1:N单向关联产生的一系列问 ...
- Spring Boot入门第二天:一个基于Spring Boot的Web应用,使用了Spring Data JPA和Freemarker。
原文链接 今天打算从数据库中取数据,并展示到视图中.不多说,先上图: 第一步:添加依赖.打开pom.xml文件,添加必要的依赖,完整代码如下: <?xml version="1.0&q ...
随机推荐
- Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态
一.Django请求生命周期 二.路由层 urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...
- Python之路【第二十九篇】:django ORM模型层
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
- Vivado关联Notepad++
Vivado自带的编辑器非常难看,我习惯用Notepad++,这里记录一下二者的关联. 1.打开Vivado,点击 Tools --- Settings --- Text Editor,右侧选择 Cu ...
- ElasticSearch 调优
来源:http://tinyurl.com/y4gnzbje 第一部分:调优索引速度 第二部分-调优搜索速度 英文原文:https://www.elastic.co/guide/en/elastics ...
- oracle基础知识语法大全
ORACLE支持五种类型的完整性约束NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值.CHECK (检查)--检查在约束中 ...
- angular js根据json文件动态生成路由状态
项目上有一个新需求,就是需要根据json文件动态生成路由状态,查阅了一下资料,现在总结一下发出来: 首先项目用到的是angular的UI-路由,所以必须引入angular.js和angular-ui- ...
- 小div在大div中垂直居中方式
代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-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 ...
- PHP 基于redis的分布式锁
<?php class ProcessRedisLock { /** * redis key 前缀 */ const KEY_PREFIX = 'PROCESS_REDIS_LOCK:'; /* ...
- Spring中获取被代理的对象
目录 Spring中获取被代理的对象 获取Spring被代理对象什么时候可能会用到? Spring中获取被代理的对象 Spring中获取被代理的对象 ### 获取Spring被代理对象的JAVA工具类 ...