1. 程式人生 > >使用Spring JPA中Page、Pageable介面和Sort類完成分頁排序

使用Spring JPA中Page、Pageable介面和Sort類完成分頁排序

Spring專案使用JPA進行資料庫操作可以極大的簡化開發,下面我將用一個完整的Demo為大家展示分頁查詢並顯示在前臺頁面

首先來說一下分頁和排序所用到的PagePageable介面和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");
		}
	}
}

後臺先給前臺傳過去資料總量,前臺計算完顯示第幾頁,再將第幾頁傳送給後臺,後臺進行查詢並返回資料