使用Spring JPA中Page、Pageable介面和Sort類完成分頁排序
阿新 • • 發佈:2018-11-30
Spring專案使用JPA進行資料庫操作可以極大的簡化開發,下面我將用一個完整的Demo為大家展示分頁查詢並顯示在前臺頁面
首先來說一下分頁和排序所用到的Page、Pageable介面和Sort類都是什麼
JpaRepository提供了兩個和分頁和排序有關的查詢
List findAll(Sort sort) 返回所有實體,按照指定順序排序返回
List findAll(Pageable pageable) 返回實體列表,實體的offest和limit通過pageable來指定
Sort物件用來指示排序,最簡單的Sort物件構造可以傳入一個屬性名列表(不是資料庫列名,是屬性名),預設採用升序排序。例:
Sort sort = new Sort("id");
//或 Sort sort = new Sort(Direction.ASC,"id");
return userDao.findAll(sort);
程式將查詢所有user並按照id進行生序排序。Sort還包括其他一些構造方法,在這裡就不一一贅述。
Pageable介面用於構造翻頁查詢,PageRequest是其實現類,可以通過提供的工廠方法建立PageRequest:
public static PageRequest of(int page, int size)
也可以在PageRequest中加入排序:
public static PageRequest of(int page, int size, Sort sort)
方法中的引數,page總是從0開始,表示查詢頁,size指每頁的期望行數。
Page介面可以獲得當前頁面的記錄、總頁數、總記錄數、是否有上一頁或下一頁等。Spring Data翻頁查詢總是返回Page物件,Page物件提供了以下常用的方法:
int getTotalPages() 總的頁數
long getTotalElements() 返回總數
List getContent() 返回此次查詢的結果集
程式碼實現:
1.建立SpringBoot工程,在pom.xml中新增以下依賴
<!--SpringMVC依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring JPA依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 連線mysql資料庫驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2.建立實體類
package org.gzc.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Marker {
@Id
@GeneratedValue
private int id;
private double lng;
private double lat;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getLng() {
return lng;
}
public void setLng(double lng) {
this.lng = lng;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
@Override
public String toString() {
return "Marker [id=" + id + ", lng=" + lng + ", lat=" + lat + "]";
}
}
3.編寫dao層介面
package org.gzc.dao;
import org.gzc.entity.Marker;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MarkerDao extends JpaRepository<Marker, Integer>{
}
4.編寫service層介面
package org.gzc.service;
import java.util.List;
import org.gzc.entity.Marker;
import org.springframework.data.domain.Pageable;
public interface MarkerService {
void saveMarker(Marker marker);
Page<Marker> findMarker(Pageable pageable);
}
5.編寫service層實現類
package org.gzc.serviceimpl;
import java.util.List;
import org.gzc.dao.MarkerDao;
import org.gzc.entity.Marker;
import org.gzc.service.MarkerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
@Service
public class MarkerServiceImpl implements MarkerService{
@Autowired
private MarkerDao markerDao;
@Override
public void saveMarker(Marker marker) {
markerDao.save(marker);
}
@Override
public Page<Marker> findMarker(Pageable pageable) {
return markerDao.findAll(pageable);
}
}
6.編寫controller
package org.gzc.controller;
import org.gzc.entity.Marker;
import org.gzc.service.MarkerService;
import org.gzc.util.Result;
import org.gzc.util.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MapHandlerController {
@Autowired
private MarkerService markerService;
@SuppressWarnings("rawtypes")
@PostMapping("/saveMarker")
public Result saveMarkerController(@RequestBody Marker marker){
System.out.println(marker);
if (marker!=null) {
markerService.saveMarker(marker);
return ResultUtil.success();
}
return ResultUtil.error(1, "儲存失敗", "/saveMarker");
}
@SuppressWarnings("rawtypes")
@GetMapping("/showMarkerCount")
public Result returnMarkerCount(){
long count = markerService.markerCount();
System.out.println("count------------------->"+count);
return ResultUtil.success(count, "/showMarkerCount");
}
@SuppressWarnings("rawtypes")
@GetMapping("/showMarkerByPage/{page}")
public Result showMarkerController(@PathVariable("page") int page){
PageRequest pageRequest = PageRequest.of(page, 5);
Page<Marker> markerPage = markerService.findMarker(pageRequest);
for (int i = 0; i < markerPage.getContent().size(); i++) {
System.out.println(markerPage.getContent().get(i));
System.out.println(markerPage.getTotalElements());
}
if (markerPage.getContent()!=null) {
return ResultUtil.success(markerPage.getContent(), "/showMarker");
}else {
return ResultUtil.error(1, "查詢失敗", "/showMarker");
}
}
}
後臺先給前臺傳過去資料總量,前臺計算完顯示第幾頁,再將第幾頁傳送給後臺,後臺進行查詢並返回資料