zoukankan      html  css  js  c++  java
  • 学习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

  • 相关阅读:
    Shell脚本学习笔记2
    Shell脚本学习笔记1
    华大MCU硬件SMBus的应用
    华大MCU的应用中的问题记录
    STM32定时器输入捕获功能应用——超声波模块
    STM32定时器应用——PWM
    利用KEIL的软件仿真的逻辑分析仪功能观察GPIO的波形
    周期性过程数据通信和非周期性邮箱数据通信
    JDBCUtils
    反射
  • 原文地址:https://www.cnblogs.com/caofanqi/p/12051854.html
Copyright © 2011-2022 走看看