Spring通過springframework.data的@PageableDefault注解分頁


在使用Spring+mybatis框架時,看到很多人用的pageHelper插件進行分頁,如果不用的話,使用spring.data下的@PageableDefault也是可以完成分頁功能的。

@PageableDefault接口

package org.springframework.data.web;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.data.domain.Sort.Direction;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface PageableDefault {
    int value() default 10;

    int size() default 10;

    int page() default 0;

    String[] sort() default {};

    Direction direction() default Direction.ASC;
}

Pageable定義了很多方法,但其核心的信息只有兩個:一是分頁的信息(page、size),二是排序的信息。使用@PageableDefault的時候可以自定義分頁信息@PageableDefault(value = 15, sort = { "update_time" }, direction = Sort.Direction.DESC) Pageable pageable)

controller層:

package me.cf81.onestep.cms.controller;

import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import me.cf81.commons.web.bind.annotation.FormModel;
import me.cf81.commons.web.bind.util.MapWrapper;
import me.cf81.onestep.cms.model.CMSPage;
import me.cf81.onestep.cms.service.CMSPageService;
import me.cf81.onestep.epc.Exceptions;
import me.cf81.onestep.util.Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * Created by yh on 2018/08/07.
 */

@RestController
@RefreshScope
public class CMSPageController {

    @Autowired
    private CMSPageService cmsPageService;

    @ApiOperation(value = "頁面分頁")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "x-access-token", value = "令牌", paramType = "header", required = true),
            @ApiImplicitParam(name = "page", value = "頁碼,從0開始", paramType = "query"),
            @ApiImplicitParam(name = "search.name", value = "頁面名稱", paramType = "query")
    })
    @GetMapping("/cms/page/page_list:search")
    public Page<CMSPage> getPageByMap(@FormModel MapWrapper<String, Object> mapWrappers, @PageableDefault(value = 15, sort = { "update_time" }, direction = Sort.Direction.DESC) Pageable pageable) {
        try {
            Long companyId = Util.getCompanyId();
            return cmsPageService.findPageByMap(mapWrappers.toMap(), pageable, companyId);
        } catch (Exception e) {
            e.printStackTrace();
            throw Exceptions.ERROR.buildException();
        }
    }
}

sql語句:

<!--新聞分頁-->
    <select id="selectPageByMap" resultType="me.cf81.onestep.cms.model.CMSPage">
        SELECT id,`name`,create_time,update_time,`key`,is_delete,is_release
        FROM temp_cms_page cp
        <where>
            cp.is_delete=0 AND company_id = #{companyId}
            <include refid="conditions"/>
        </where>
    </select>

當不對@PageableDefault設置屬性時,采用的是默認屬性(0,10,不排序),這個時候就需要將分頁信息寫進sql語句。

controller:

@RestController
@RefreshScope
public class CMSPageController {

    @Autowired
    private CMSPageService cmsPageService;

    @ApiOperation(value = "頁面分頁")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "x-access-token", value = "令牌", paramType = "header", required = true),
            @ApiImplicitParam(name = "page", value = "頁碼,從0開始", paramType = "query"),
            @ApiImplicitParam(name = "search.name", value = "頁面名稱", paramType = "query")
    })
    @GetMapping("/cms/page/page_list:search")
    public Page<CMSPage> getPageByMap(@FormModel MapWrapper<String, Object> mapWrappers, @PageableDefault Pageable pageable) {
        try {
            Long companyId = Util.getCompanyId();
            return cmsPageService.findPageByMap(mapWrappers.toMap(), pageable, companyId);
        } catch (Exception e) {
            e.printStackTrace();
            throw Exceptions.ERROR.buildException();
        }
    }
}

sql語句:

<!--新聞分頁-->
    <select id="selectPageByMap" resultType="me.cf81.onestep.cms.model.CMSPage">
        SELECT id,`name`,create_time,update_time,`key`,is_delete,is_release
        FROM temp_cms_page cp
        <where>
            cp.is_delete=0 AND company_id = #{companyId}
            <include refid="conditions"/>
        </where>
        ORDER BY cp.update_time DESC
        limit #{pageable.offset}, #{pageable.pageSize}
    </select>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM