spring Boot查询数据分页显示的方法实例
作者:Tony猿 发布时间:2023-04-28 13:30:08
标签:springboot,查询,分页
springBoot所有依赖和配置文件都写好的情况下
1、dao接口的实现方法
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 查询条件(例如查询那个用户的日志信息)
* @return 总记录数(基于这个结果可以计算总页数)
*/
int getRowCount(@Param("username") String username);
/**
*
* @param username 查询条件(例如查询那个用户的日志信息)
* @param startIndex 当前页的起始位置
* @param paInteger 当前页的页面大小
* @return 当前页的日志记录信息
* 数据库中每条日志信息封装到一个SysLog对象中
*/
List<SysLog> findPageObjects(
@Param("username")String username,
@Param("startIndex")Integer startIndex,
@Param("pageSize")Integer pageSize
);
}
2、写实现dao中Mapper的sql语句
<?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元素用于对于sql语句共性的提取,需要的位置用<include>引入 -->
<sql id="queryWhereId">
from sys_Logs
<where>
<if test="username!=null and username!=''">
username like concat('%',#{username},'%')
<!-- concat 字符串的连接 -->
</if>
</where>
</sql>
<!-- 按条件统计记录总数 -->
<select id="getRowCount" resultType="int">
select count(*)
<include refid="queryWhereId"/>
</select>
<!-- 在映射文件中添加为id为 findPageObjects元素,,实现分页查询-->
<select id="findPageObjects" resultType="com.cy.pj.sys.pojo.SysLog">
select *
<include refid="queryWhereId"/>
order by createdTime desc
limit #{startIndex},#{pageSize}
</select>
</mapper>
3、写pojo类对数据进行封装,所显示的表字段的pojo类
3.1这里是SysLog
package com.cy.pj.sys.pojo;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 定义用于封装日志信息的一个pojo对象,这样的对象,在定义时要遵循一下规则
* 1)属性尽量都用对象类型
* 2)提供无参数构造函数
* 3)提供set/get方法,boolean类型变量不能以is作为前缀
* 4)实现序列化接口并手动添加序列化id(便于后续对此对象进行序列化):在java中建议所有用于存储数据 的对象都实现
* FAQ?
* 1)为什么要实现序列化接口
* 2)什么是序列化?(将对象转化为字节)
* 3)为什么要序列化?应用在什么场景?(将数据持久化,或将数据存储到缓存中)
* 4)什么是反序列化?(将字节转换为对象
* 5)如何序列化和反序列化
* 5.1)设计类是要实现序列化接口
* 5.2)构建IO对象(ObjectOutputStream/ObjectinputStream)
* 5.3)通过I/O对象进行序列化和反序列化
* @author Administrator
*
*/
@Data
public class SysLog implements Serializable{
private static final long serialVersionUID = -1592163223057343412L;
private Integer id;
//用户名
private String username;
//用户操作
private String operation;
//请求方法
private String method;
//请求参数
private String params;
//执行时长(毫秒)
private Long time;
//ip地址
private String ip;
//创建时间
private Date createdTime;
}
3.2对获取的信息进行封装(获取分页信息的页码值、页面大小(就是每页所显示的记录)、获取的表总共记录数、总页数 、当前记录)
package com.cy.pj.sys.pojo;
import java.util.List;
import lombok.Data;
/**
*
* @author PageObject 为业务封装分业务相关数据的BO对象
* @param <T>参数化的类型(泛型)
*/
@Data
public class PageObject<T> {//类名<泛型>:类泛型(这里的泛型用于约束类中的属性,方法参数,方法的返回值)
/**当前页的页码值 */
private Integer pageCurrent=1;
/**页面大小*/
private Integer pageSize=3;
/**总行数(通过查询获得)*/
private Integer rowCount=0;
/**总页数(通过计算获得)*/
private Integer pageCount=0;
/**当前页记录*/
private List<T> records;
}
3.3处理异常进行封装
package com.cy.pj.sys.pojo;
public class JsonResult {
/**
* 状态码
*/
private int state=1;
/**
* 状态信息
*/
private String message="ok";
/**
* 正确数据
*/
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、写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、写实现service接口的实现类
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.验证参数的合法性
// 1.1验证pageCurrent的合法性
// 不合法抛出IllegalArgumentException异常
if (pageCurrent == null || pageCurrent < 1)
throw new IllegalArgumentException("当前也显示不正确");
// 基于条件查询总记录数
// 2.1执行查询
int rowCount = sysLogDao.getRowCount(username);
// 2.2验证查询结果,假如结果为0不在执行如下操作
if (rowCount == 0)
throw new ServiceException("系统登录没有查到对应的记录");
// 3.基于条件查询当前页记录(pageSize定义为2)
// 3.1)定义pageSize
int pageSize = 2;
//3.2计算startIndex
int startIndex=(pageCurrent-1)*pageSize;
//3.3执行当前数据的查询操作
List<SysLog> records = sysLogDao.findPageObjects(username, startIndex, pageSize);
//4.对分页信息以及当前页记录进行封装
//4.1 构建PageObject对象
PageObject<SysLog> pageObject = new PageObject<>();
//4.2封装数据
pageObject.setPageCurrent(pageCurrent);
pageObject.setPageSize(pageSize);
pageObject.setRowCount(rowCount);
pageObject.setRecords(records);
pageObject.setPageCount((rowCount-1)/pageSize+1);
//5.返回封装结果
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页面和js写的方法
数据显示页面的js编写方法
<div id="pageId" class="box-footer clearfix" dm="100"></div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
</div>
<script type="text/javascript">
/* 分页页面加载完成,向服务端发起异步请求 */
$(function() {
$("#pageId").load("doPageUI",function(){
doGetObjects();
});
});
/* 定义异步请求处理函数, */
function doGetObjects(){
//1.定义url和参数
var url = "doFindPageObjects";
var params={"pageCurrent":1};
//2.发起异步请求
//请问如下ajax请求的回调函数参数名可以是任意吗?//可以,必须符合标识符的规范
$.getJSON(url,params,function(result){
doHandleQueryResponseResult(result);
});//特殊的ajax函数
}
function doHandleQueryResponseResult(result){
if(result.state==1){//ok
//更新table中tbody内部的数据
doSetTableBodyRows(result.data.records);//将数据呈现在页面上
/*
//更新页面page。html分页数据
*/
doSetPagination(result.data);
}else{
alert(result.message);
}
}
function doSetTableBodyRows(records){
//1.获取tBody对象,并清除对象
var tBody=$("#tbodyId");
tBody.empty();
//2.迭代records记录,并将其内容追加到tbody
for(var i in records){
//2.1构建tr对象
var tr=$("<tr></tr>");
//2.2构建tds对象
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>
创建上下页翻页的按钮HTML页 以及js的编写
<ul class="pagination pagination-sm no-margin pull-right">
<li><a class="first">首页</a></li>
<li><a class="pre">上一页</a></li>
<li><a class="next">下一页</a></li>
<li><a class="last">尾页</a></li>
<li><a class="rowCount">总记录数(0)</a></li>
<li><a class="pageCount">总页数(0)</a></li>
<li><a class="pageCurrent">当前页(0)</a></li>
</ul>
<script type="text/javascript">
function doSetPagination(page){
console.log("page",page)
//1.初始化数据
$(".rowCount").html("总记录数("+page.rowCount+")");
$(".pageCount").html("总页数("+page.pageCount+")");
$(".pageCurrent").html("当前页("+page.pageCurrent+")");
//2.绑定数据(为后续对此数据的使用提供服务)
$("#pageId").data("pageCurrent",page.pageCurrent);
$("#pageId").data("pageCount",page.pageCount);
}
$(function(){
//事件注册
$("#pageId").on("click",".first,.pre,.next,.last",doJumpToPage);
})
function doJumpToPage(){
//1.获取点击对象的clss值
var cls=$(this).prop("class");//Property
//2.基于点击的对象执行pageCurrent值得修改
//2.1获取pageCurrent, pageCount的当前值
var pageCurrent=$("#pageId").data("pageCurrent");
var pageCount=$("#pageId").data("pageCount");
//2.2修改pageCurrent的值
if(cls=="first"){//首页
pageCurrent=1;
}else if(cls=="pre"&&pageCurrent>1){//上一页
pageCurrent--;
}else if(cls=="next"&&pageCurrent<pageCount){//下一页
pageCurrent++;
}else if(cls=="last"){//最后一页
pageCurrent=pageCount;
}else{
return;
}
//3.对pageCurrent值进行重新绑定
$("#pageId").data("pageCurrent",pageCurrent);
//4.基于新的pageCurrent的值进行当前页数据查询
doGetObjects();
}
function doGetObjects(){
//1.定义url和参数
var url ="doFindPageObjects";
//data是从指定元素上获取绑定的数据
//数据会在何时进行绑定?(setPagination,doQueryObjects)
var pageCurrent = $("#pageId").data("pageCurrent");
//为什么要执行如下判断,然后初始化pageCurrent的值为1
//pageCurrent参数在没有赋值的情况下,默认初始值应该为1.
if(!pageCurrent)
pageCurrent=1;
var params={"pageCurrent":pageCurrent};
//2.发起异步请求
//请问如下ajax请求的回调函数参数名可以是任意的吗??可以,必须符合标识符的规范
$.getJSON(url,params,function(result){
//请问result是一个字符串还是json格式的js对象? 答:json格式对象
doHandleQueryResponseResult(result);
});
}//特殊的ajax函数
</script>~~~~
来源:https://segmentfault.com/a/1190000023599865
0
投稿
猜你喜欢
- 简述:JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效。IDEA上原生是不支持热部署的,一般更新了 Java 文
- 详解 Java中日期数据类型的处理之格式转换的实例概要:日期以及时间格式处理,在Java中时间格式一般会涉及到的数据类型包括Calendar
- 目录首先必须要有一个个人微信公众号效果图后台路由代码完整代码首先必须要有一个个人微信公众号个人微信公众号相关的接口权限有限,不过用于个人学习
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:html代码如下:<body><input id="file
- 本文实例讲述了java数据结构与算法之双向循环队列的数组实现方法。分享给大家供大家参考,具体如下:需要说明的是此算法我并没有测试过,这里给出
- 一、前言我们经常会遇到业务想看debug日志的问题,但是debug日志频繁打印会对日志查看有影响,且日志多对系统也会有一定的压力,因此,如果
- Java 用反射设置对象的属性值实例详解/** * 用反射设置对象的属性值 * @param obj 需要設置值的對象 * @param f
- StringDictionary:默认key不区分大小写 NameValueCollection:默认key区分大小写 KeyedColle
- 接触过Android开发的同学们都知道在Android中访问程序资源基本都是通过资源ID来访问。这样开发起来很简单,并且可以不去考虑各种分辨
- 本篇分析ArrayList的源码,在分析之前先跟大家谈一谈数组。数组可能是我们最早接触到的数据结构之一,它是在内存中划分出一块连续的地址空间
- 目录前言实现思路其它总结前言本文将介绍如何通过使用EasyExcel自定义 * 实现在最终的Excel文件中新增一列自增的序号列,最终的效果
- 本文实例为大家分享了Android App获取屏幕旋转角度的具体代码,供大家参考,具体内容如下一、获取屏幕旋转角度的方法是:int rota
- 前言上一篇 文章我们完成了在 thymeleaf 模板引擎中使用 shiro 标签,也就是根据不同的用户身份信息,前端页面来显示不同的页面内
- 摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的。现在我们来看如何利
- 本文实例讲述了Java实现字符串解析为日期时间的方法。分享给大家供大家参考,具体如下:Java版本:1.8开始import java.tim
- 背景为了了解Seata AT模式的原理,我通过源码解读的方式画出了Seata AT模式启动的图示:如果是基于Springboot项目的话,项
- 新建一个集合List<Bill> billList = new ArrayList<>();将订单中所有物品的名称提
- 第一节 接口慨述接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语
- 概述:App几乎都离不开与服务器的交互,本文主要讲解了flutter网络请求三种方式 flutter自带的HttpClient、 第三方库h
- 背景描述通常如果需要一次更新多条数据有两个方式:(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据(更准确的说是一条sql语句来更