java分頁解決方法總結


分頁需要用到的倆個參數;pageNum(頁碼)、pageSize(每頁的條數)

有時候前端(移動端)傳遞的是start(從多少條記錄開始)、count(獲取的數量,也就是條數)

后端方法需要的是;pageNum和pageSize

一、將start、count轉換為pageNum和pageSize

(一)、定義PageCounter類

@Getter
@Setter
@Builder
public class PageCounter {
//    當前頁碼
    private Integer pageNum;
//    每頁的條數
    private Integer pageSize;
}

(二)、將 start、count轉換為pageNum、pageSie

public class CommonUtil {
//    將 start、count轉換為pageNum、pageSie
    public static PageCounter converToPageParameter(Integer start, Integer count){
        int pageNum = start/count;
        PageCounter pageCounter = PageCounter.builder()
                .pageNum(pageNum)
                .pageSize(count)
                .build();
        return pageCounter;
    }
}

二、分頁的實現方法

mybatis 里的pager 分頁

代碼:https://github.com/zhaobao1830/mmall-zb項目usercontroller的list.do接口

  (一)、pom.xml安裝pagehelper 

<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper</artifactId>
   <version>4.1.0</version>
</dependency>

(二)、例子

/**
* @Author: zhaobao1830
* @Date: 2021/3/17 9:15
* 返回分頁數據
*/
public class PagedGridResult {
/**
* 當前頁數
*/
private Integer pageNum;
/**
* 每頁條數
*/
private Integer pageSize;
/**
* 總頁數
*/
private Integer pages;
/**
* 總條數
*/
private long total;
/**
* 每行顯示的內容
*/
private List<?> rows;

public int getPageNum() {
return pageNum;
}

public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}

public int getPageSize() {
return pageSize;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public int getPages() {
return pages;
}

public void setPages(int pages) {
this.pages = pages;
}

public long getTotal() {
return total;
}

public void setTotal(long total) {
this.total = total;
}

public List<?> getRows() {
return rows;
}

public void setRows(List<?> rows) {
this.rows = rows;
}
}

serviece

@Override
public PagedGridResult queryAll(int pageNum, int pageSize) {
// 傳入pageNum, pageSize參數
PageHelper.startPage(pageNum, pageSize);
// 獲取userList
List<User> userList = userMapper.queryAll();
// 對userList進行處理,獲取對應的volist
List<UserVO> userVoList = assembleUserVoList(userList);
return setterPagedGrid(pageNum, pageSize, userVoList);
}

public List<UserVO> assembleUserVoList(List<User> userList) {
List<UserVO> userVoList = Lists.newArrayList();
for (User user : userList) {
UserVO userVO = assembleUserVo(user);
userVoList.add(userVO);
}
return userVoList;
}

public UserVO assembleUserVo(User user) {
UserVO userVo = new UserVO();
userVo.setId(user.getId());
userVo.setUsername(user.getUsername());
userVo.setRole(user.getRole());
userVo.setPhone(user.getPhone());
userVo.setEmail(user.getEmail());
return userVo;
}

/**
* 封裝分頁方法
* @param pageNum 當前頁數
* @param pageSize 每頁條數
* @param list 列表
* @return {
* pageNum: 1
* pageSize: 6
* pages: 1
* rows: [{id: 1, username: "admin"}]
* total: 6
* }
*/
public PagedGridResult setterPagedGrid(Integer pageNum, Integer pageSize, List<?> list) {
PageInfo<?> pageList = new PageInfo<>(list);
PagedGridResult grid = new PagedGridResult();
grid.setPageNum(pageNum);
grid.setPageSize(pageSize);
grid.setPages(pageList.getPages());
grid.setTotal(pageList.getTotal());
grid.setRows(list);
return grid;
}

jpa里使用PageRequest

簡單版:

@Override
    public Page<Spu> getLatestPagingSpu(Integer pageNum, Integer pageSize) {
        Pageable page = PageRequest.of(pageNum, pageSize, Sort.by("createTime").descending());
        return spuRepository.findAll(page);
    }

PageRequest.of()將對應的參數傳遞進去

完整版:

(一)、pom.xml安裝dozermapper  用來對java bean進行拷貝

用到的場景:從數據庫查詢回來的數據,前端不全用的上,需要進行二次封裝(Vo),自己一個個屬性賦值太浪費時間。這時可以使用dozermapper  

 

要求倆個bean的屬性名要一致

<dependency>
      <groupId>com.github.dozermapper</groupId>
      <artifactId>dozer-core</artifactId>
      <version>6.5.0</version>
</dependency>

(二)、封裝分頁實體類

//封裝分頁實體類
@Getter
@Setter
@NoArgsConstructor
public class Paging<T> {
    // 總條數
    private Long total;
    // 當前返回的條數
    private Integer count;
    // 當前頁嗎
    private Integer page;
    // 總頁數
    private Integer totalPage;
    // 結果 不確定數組里元素的類型,所以使用泛型
    private List<T> items;

    public Paging(Page<T> pageT) {
        this.initPageParameters(pageT);
        this.items = pageT.getContent();
    }
    // 靜態方法,子類可以調用
    void initPageParameters(Page<T> pageT) {
        this.total = pageT.getTotalElements();
        this.count = pageT.getSize();
        this.page = pageT.getNumber();
        this.totalPage = pageT.getTotalPages();
    }
}

(三)、對分頁進行再次封裝,添加DozerBeanMapper功能

// 對分頁進行再次封裝,添加DozerBeanMapper功能
// 如果不需要進行vo賦值,直接用Paging就行
// 需要倆個泛型 T是源文件的類型  K是目標文件的類型
public class PagingDozer<T, K> extends Paging{
    @SuppressWarnings("unchecked")
    public PagingDozer(Page<T> pageT, Class<K> classk) {
        this.initPageParameters(pageT);

        // 使用DozerBeanMapper拷貝屬性
        Mapper mapper = DozerBeanMapperBuilder.buildDefault();
        List<T> tList = pageT.getContent();
        List<K> voList = new ArrayList<>();
        // 將查詢出的數據循環賦值到vo中
        tList.forEach(t -> {
            // t是源文件,classk是目標文件的class
            K vo = mapper.map(t, classk);
            voList.add(vo);
        });
        this.setItems(voList);
    }
}

(四)、service

@Override
    public Page<Spu> getLatestPagingSpu(Integer pageNum, Integer pageSize) {
        Pageable page = PageRequest.of(pageNum, pageSize, Sort.by("createTime").descending());
        return spuRepository.findAll(page);
    }

使用PageRequest生成Pageable

(五)、controller

@RequestMapping(value = "/latest", method = RequestMethod.GET)
    public PagingDozer<Spu, SpuSimplifyVO> getLatestSpuList(@RequestParam(defaultValue = "0") Integer start,
                                                            @RequestParam(defaultValue = "10") Integer count
    ) {
        PageCounter pageCounter = CommonUtil.converToPageParameter(start, count);
        // 從數據庫查詢出的數據
        Page<Spu> page = spuService.getLatestPagingSpu(pageCounter.getPageNum(), pageCounter.getPageSize());
        return new PagingDozer<>(page, SpuSimplifyVO.class);
    }

 


免責聲明!

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



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