spring Boot查詢數(shù)據(jù)分頁(yè)顯示的方法實(shí)例
springBoot所有依賴和配置文件都寫(xiě)好的情況下
1、dao接口的實(shí)現(xiàn)方法
package com.cy.pj.sys.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.cy.pj.sys.pojo.SysLog;
@Mapper
public interface SysLogDao {
/**
*
* @param username 查詢條件(例如查詢那個(gè)用戶的日志信息)
* @return 總記錄數(shù)(基于這個(gè)結(jié)果可以計(jì)算總頁(yè)數(shù))
*/
int getRowCount(@Param("username") String username);
/**
*
* @param username 查詢條件(例如查詢那個(gè)用戶的日志信息)
* @param startIndex 當(dāng)前頁(yè)的起始位置
* @param paInteger 當(dāng)前頁(yè)的頁(yè)面大小
* @return 當(dāng)前頁(yè)的日志記錄信息
* 數(shù)據(jù)庫(kù)中每條日志信息封裝到一個(gè)SysLog對(duì)象中
*/
List<SysLog> findPageObjects(
@Param("username")String username,
@Param("startIndex")Integer startIndex,
@Param("pageSize")Integer pageSize
);
}
2、寫(xiě)實(shí)現(xiàn)dao中Mapper的sql語(yǔ)句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.pj.sys.dao.SysLogDao">
<!-- sql元素用于對(duì)于sql語(yǔ)句共性的提取,需要的位置用<include>引入 -->
<sql id="queryWhereId">
from sys_Logs
<where>
<if test="username!=null and username!=''">
username like concat('%',#{username},'%')
<!-- concat 字符串的連接 -->
</if>
</where>
</sql>
<!-- 按條件統(tǒng)計(jì)記錄總數(shù) -->
<select id="getRowCount" resultType="int">
select count(*)
<include refid="queryWhereId"/>
</select>
<!-- 在映射文件中添加為id為 findPageObjects元素,,實(shí)現(xiàn)分頁(yè)查詢-->
<select id="findPageObjects" resultType="com.cy.pj.sys.pojo.SysLog">
select *
<include refid="queryWhereId"/>
order by createdTime desc
limit #{startIndex},#{pageSize}
</select>
</mapper>
3、寫(xiě)pojo類對(duì)數(shù)據(jù)進(jìn)行封裝,所顯示的表字段的pojo類
3.1這里是SysLog
package com.cy.pj.sys.pojo;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 定義用于封裝日志信息的一個(gè)pojo對(duì)象,這樣的對(duì)象,在定義時(shí)要遵循一下規(guī)則
* 1)屬性盡量都用對(duì)象類型
* 2)提供無(wú)參數(shù)構(gòu)造函數(shù)
* 3)提供set/get方法,boolean類型變量不能以is作為前綴
* 4)實(shí)現(xiàn)序列化接口并手動(dòng)添加序列化id(便于后續(xù)對(duì)此對(duì)象進(jìn)行序列化):在java中建議所有用于存儲(chǔ)數(shù)據(jù) 的對(duì)象都實(shí)現(xiàn)
* FAQ?
* 1)為什么要實(shí)現(xiàn)序列化接口
* 2)什么是序列化?(將對(duì)象轉(zhuǎn)化為字節(jié))
* 3)為什么要序列化?應(yīng)用在什么場(chǎng)景?(將數(shù)據(jù)持久化,或?qū)?shù)據(jù)存儲(chǔ)到緩存中)
* 4)什么是反序列化?(將字節(jié)轉(zhuǎn)換為對(duì)象
* 5)如何序列化和反序列化
* 5.1)設(shè)計(jì)類是要實(shí)現(xiàn)序列化接口
* 5.2)構(gòu)建IO對(duì)象(ObjectOutputStream/ObjectinputStream)
* 5.3)通過(guò)I/O對(duì)象進(jìn)行序列化和反序列化
* @author Administrator
*
*/
@Data
public class SysLog implements Serializable{
private static final long serialVersionUID = -1592163223057343412L;
private Integer id;
//用戶名
private String username;
//用戶操作
private String operation;
//請(qǐng)求方法
private String method;
//請(qǐng)求參數(shù)
private String params;
//執(zhí)行時(shí)長(zhǎng)(毫秒)
private Long time;
//ip地址
private String ip;
//創(chuàng)建時(shí)間
private Date createdTime;
}
3.2對(duì)獲取的信息進(jìn)行封裝(獲取分頁(yè)信息的頁(yè)碼值、頁(yè)面大小(就是每頁(yè)所顯示的記錄)、獲取的表總共記錄數(shù)、總頁(yè)數(shù) 、當(dāng)前記錄)
package com.cy.pj.sys.pojo;
import java.util.List;
import lombok.Data;
/**
*
* @author PageObject 為業(yè)務(wù)封裝分業(yè)務(wù)相關(guān)數(shù)據(jù)的BO對(duì)象
* @param <T>參數(shù)化的類型(泛型)
*/
@Data
public class PageObject<T> {//類名<泛型>:類泛型(這里的泛型用于約束類中的屬性,方法參數(shù),方法的返回值)
/**當(dāng)前頁(yè)的頁(yè)碼值 */
private Integer pageCurrent=1;
/**頁(yè)面大小*/
private Integer pageSize=3;
/**總行數(shù)(通過(guò)查詢獲得)*/
private Integer rowCount=0;
/**總頁(yè)數(shù)(通過(guò)計(jì)算獲得)*/
private Integer pageCount=0;
/**當(dāng)前頁(yè)記錄*/
private List<T> records;
}
3.3處理異常進(jìn)行封裝
package com.cy.pj.sys.pojo;
public class JsonResult {
/**
* 狀態(tài)碼
*/
private int state=1;
/**
* 狀態(tài)信息
*/
private String message="ok";
/**
* 正確數(shù)據(jù)
*/
private Object data;
public JsonResult() {
}
public JsonResult(String message) {
this.message = message;
}
public JsonResult(Object data) {
this.data = data;
}
public JsonResult(Throwable t) {
this.state=0;
this.message=t.getMessage();
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
4、寫(xiě)service接口
package com.cy.pj.sys.service;
import com.cy.pj.sys.pojo.PageObject;
import com.cy.pj.sys.pojo.SysLog;
public interface SysLogService {
PageObject<SysLog> findPageObject(String username,Integer pageCurrent);
}
5、寫(xiě)實(shí)現(xiàn)service接口的實(shí)現(xiàn)類
package com.cy.pj.sys.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.cy.pj.sys.dao.SysLogDao;
import com.cy.pj.sys.pojo.PageObject;
import com.cy.pj.sys.pojo.SysLog;
import com.cy.pj.sys.service.SysLogService;
import om.cy.pj.common.exception.ServiceException;
@Service
public class SysLogServiceImpl implements SysLogService {
@Autowired
private SysLogDao sysLogDao;
@Override
public PageObject<SysLog> findPageObject(String username, Integer pageCurrent) {
// 1.驗(yàn)證參數(shù)的合法性
// 1.1驗(yàn)證pageCurrent的合法性
// 不合法拋出IllegalArgumentException異常
if (pageCurrent == null || pageCurrent < 1)
throw new IllegalArgumentException("當(dāng)前也顯示不正確");
// 基于條件查詢總記錄數(shù)
// 2.1執(zhí)行查詢
int rowCount = sysLogDao.getRowCount(username);
// 2.2驗(yàn)證查詢結(jié)果,假如結(jié)果為0不在執(zhí)行如下操作
if (rowCount == 0)
throw new ServiceException("系統(tǒng)登錄沒(méi)有查到對(duì)應(yīng)的記錄");
// 3.基于條件查詢當(dāng)前頁(yè)記錄(pageSize定義為2)
// 3.1)定義pageSize
int pageSize = 2;
//3.2計(jì)算startIndex
int startIndex=(pageCurrent-1)*pageSize;
//3.3執(zhí)行當(dāng)前數(shù)據(jù)的查詢操作
List<SysLog> records = sysLogDao.findPageObjects(username, startIndex, pageSize);
//4.對(duì)分頁(yè)信息以及當(dāng)前頁(yè)記錄進(jìn)行封裝
//4.1 構(gòu)建PageObject對(duì)象
PageObject<SysLog> pageObject = new PageObject<>();
//4.2封裝數(shù)據(jù)
pageObject.setPageCurrent(pageCurrent);
pageObject.setPageSize(pageSize);
pageObject.setRowCount(rowCount);
pageObject.setRecords(records);
pageObject.setPageCount((rowCount-1)/pageSize+1);
//5.返回封裝結(jié)果
return pageObject;
}
}
5.自定義異常
package om.cy.pj.common.exception;
public class ServiceException extends RuntimeException {
public ServiceException() {
super();
}
public ServiceException(String message) {
super(message);
}
public ServiceException(Throwable cause) {
super(cause);
}
}
controller類
package om.cy.pj.common.exception;
public class ServiceException extends RuntimeException {
public ServiceException() {
super();
}
public ServiceException(String message) {
super(message);
}
public ServiceException(Throwable cause) {
super(cause);
}
}
html頁(yè)面和js寫(xiě)的方法
數(shù)據(jù)顯示頁(yè)面的js編寫(xiě)方法
<div id="pageId" class="box-footer clearfix" dm="100"></div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
</div>
<script type="text/javascript">
/* 分頁(yè)頁(yè)面加載完成,向服務(wù)端發(fā)起異步請(qǐng)求 */
$(function() {
$("#pageId").load("doPageUI",function(){
doGetObjects();
});
});
/* 定義異步請(qǐng)求處理函數(shù), */
function doGetObjects(){
//1.定義url和參數(shù)
var url = "doFindPageObjects";
var params={"pageCurrent":1};
//2.發(fā)起異步請(qǐng)求
//請(qǐng)問(wèn)如下ajax請(qǐng)求的回調(diào)函數(shù)參數(shù)名可以是任意嗎?//可以,必須符合標(biāo)識(shí)符的規(guī)范
$.getJSON(url,params,function(result){
doHandleQueryResponseResult(result);
});//特殊的ajax函數(shù)
}
function doHandleQueryResponseResult(result){
if(result.state==1){//ok
//更新table中tbody內(nèi)部的數(shù)據(jù)
doSetTableBodyRows(result.data.records);//將數(shù)據(jù)呈現(xiàn)在頁(yè)面上
/*
//更新頁(yè)面page。html分頁(yè)數(shù)據(jù)
*/
doSetPagination(result.data);
}else{
alert(result.message);
}
}
function doSetTableBodyRows(records){
//1.獲取tBody對(duì)象,并清除對(duì)象
var tBody=$("#tbodyId");
tBody.empty();
//2.迭代records記錄,并將其內(nèi)容追加到tbody
for(var i in records){
//2.1構(gòu)建tr對(duì)象
var tr=$("<tr></tr>");
//2.2構(gòu)建tds對(duì)象
var tds=doCreateTds(records[i]);
//2.3將tds追加到tr中
tr.append(tds);
//2.4將tr追加tbody中
tBody.append(tr);
}
}
function doCreateTds(data){
var tds="<td><input type='checkbox' class='cBox' name='cItem' value='"+data.id+"'></td>"
+"<td>"+data.username+"</td>"
+"<td>"+data.operation+"</td>"
+"<td>"+data.method+"</td>"
+"<td>"+data.params+"</td>"
+"<td>"+data.ip+"</td>"
+"<td>"+data.time+"</td>";
return tds;
}
</script>
創(chuàng)建上下頁(yè)翻頁(yè)的按鈕HTML頁(yè) 以及js的編寫(xiě)
<ul class="pagination pagination-sm no-margin pull-right">
<li><a class="first">首頁(yè)</a></li>
<li><a class="pre">上一頁(yè)</a></li>
<li><a class="next">下一頁(yè)</a></li>
<li><a class="last">尾頁(yè)</a></li>
<li><a class="rowCount">總記錄數(shù)(0)</a></li>
<li><a class="pageCount">總頁(yè)數(shù)(0)</a></li>
<li><a class="pageCurrent">當(dāng)前頁(yè)(0)</a></li>
</ul>
<script type="text/javascript">
function doSetPagination(page){
console.log("page",page)
//1.初始化數(shù)據(jù)
$(".rowCount").html("總記錄數(shù)("+page.rowCount+")");
$(".pageCount").html("總頁(yè)數(shù)("+page.pageCount+")");
$(".pageCurrent").html("當(dāng)前頁(yè)("+page.pageCurrent+")");
//2.綁定數(shù)據(jù)(為后續(xù)對(duì)此數(shù)據(jù)的使用提供服務(wù))
$("#pageId").data("pageCurrent",page.pageCurrent);
$("#pageId").data("pageCount",page.pageCount);
}
$(function(){
//事件注冊(cè)
$("#pageId").on("click",".first,.pre,.next,.last",doJumpToPage);
})
function doJumpToPage(){
//1.獲取點(diǎn)擊對(duì)象的clss值
var cls=$(this).prop("class");//Property
//2.基于點(diǎn)擊的對(duì)象執(zhí)行pageCurrent值得修改
//2.1獲取pageCurrent, pageCount的當(dāng)前值
var pageCurrent=$("#pageId").data("pageCurrent");
var pageCount=$("#pageId").data("pageCount");
//2.2修改pageCurrent的值
if(cls=="first"){//首頁(yè)
pageCurrent=1;
}else if(cls=="pre"&&pageCurrent>1){//上一頁(yè)
pageCurrent--;
}else if(cls=="next"&&pageCurrent<pageCount){//下一頁(yè)
pageCurrent++;
}else if(cls=="last"){//最后一頁(yè)
pageCurrent=pageCount;
}else{
return;
}
//3.對(duì)pageCurrent值進(jìn)行重新綁定
$("#pageId").data("pageCurrent",pageCurrent);
//4.基于新的pageCurrent的值進(jìn)行當(dāng)前頁(yè)數(shù)據(jù)查詢
doGetObjects();
}
function doGetObjects(){
//1.定義url和參數(shù)
var url ="doFindPageObjects";
//data是從指定元素上獲取綁定的數(shù)據(jù)
//數(shù)據(jù)會(huì)在何時(shí)進(jìn)行綁定?(setPagination,doQueryObjects)
var pageCurrent = $("#pageId").data("pageCurrent");
//為什么要執(zhí)行如下判斷,然后初始化pageCurrent的值為1
//pageCurrent參數(shù)在沒(méi)有賦值的情況下,默認(rèn)初始值應(yīng)該為1.
if(!pageCurrent)
pageCurrent=1;
var params={"pageCurrent":pageCurrent};
//2.發(fā)起異步請(qǐng)求
//請(qǐng)問(wèn)如下ajax請(qǐng)求的回調(diào)函數(shù)參數(shù)名可以是任意的嗎??可以,必須符合標(biāo)識(shí)符的規(guī)范
$.getJSON(url,params,function(result){
//請(qǐng)問(wèn)result是一個(gè)字符串還是json格式的js對(duì)象? 答:json格式對(duì)象
doHandleQueryResponseResult(result);
});
}//特殊的ajax函數(shù)
</script>~~~~
總結(jié)
到此這篇關(guān)于spring Boot查詢數(shù)據(jù)分頁(yè)顯示的文章就介紹到這了,更多相關(guān)springBoot查詢數(shù)據(jù)分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin與java8的SAM轉(zhuǎn)換對(duì)比(進(jìn)階)
這篇文章主要介紹了Kotlin與java8的SAM轉(zhuǎn)換對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
JAVA讀取文件流,設(shè)置瀏覽器下載或直接預(yù)覽操作
這篇文章主要介紹了JAVA讀取文件流,設(shè)置瀏覽器下載或直接預(yù)覽操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
Java連接數(shù)據(jù)庫(kù)步驟解析(Oracle、MySQL)
本文主要介紹了Java連接Oracle數(shù)據(jù)庫(kù)和MySQL數(shù)據(jù)庫(kù)的步驟解析。具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12
SpringBoot使用MockMvc測(cè)試get和post接口的示例代碼
Spring Boot MockMvc是一個(gè)用于單元測(cè)試的模塊,它是Spring框架的一部分,專注于簡(jiǎn)化Web應(yīng)用程序的測(cè)試,MockMvc主要用來(lái)模擬一個(gè)完整的HTTP請(qǐng)求-響應(yīng)生命周期,本文給大家介紹了SpringBoot使用MockMvc測(cè)試get和post接口,需要的朋友可以參考下2024-06-06

