springBoot查询数据分页 spring Boot查询数据分页显示的方法实例
Tony猿 人气:0想了解spring Boot查询数据分页显示的方法实例的相关内容吗,Tony猿在本文为您仔细讲解springBoot查询数据分页的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:springboot分页条件查询,springboot的分页查询,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>~~~~
总结
加载全部内容