您的位置:首页 > 编程语言 > Java开发

springmvc+Mybatis 分页查询的简单实现

2017-11-03 16:10 906 查看


目前较常用的分页实现办法有两种:

  1.每次翻页都修改SQL,向SQL传入相关参数去数据库实时查出该页的数据并显示。

  2.查出数据库某张表的全部数据,再通过在业务逻辑里面进行处理去取得某些数据并显示。

  对于数据量并不大的简单的管理系统而言,第一种实现方法相对来说容易使用较少的代码实现分页这一功能,本文也正是为大家介绍这种方法:

代码片段:

1,Page.java

[java] view
plain copy

package com.cm.contract.common;

import org.apache.commons.lang.StringUtils;

import org.apache.commons.lang.builder.ToStringBuilder;

/**分页类

* @author FENGWEI

* @date 2016-5-23

*/

public class Page implements java.io.Serializable{

private static final long serialVersionUID = 1L;

//前一页

private Boolean hasPrePage;

//后一页

private Boolean hasNextPage;

//每页显示多少条:默认20条

private Long everyPage = 20L;

//总页数

private Long totalPage;

//当前第多少页:默认第1页

private Long currentPage = 1L;

//开始下标

private Long beginIndex;

//结束下标

private Long endinIndex;

//总共多少条

private Long totalCount;

//排序列名

private String sortName;

//排序状态

private String sortState;

//排序信息

private String sortInfo;

//是否排序

private Boolean sort = false;

private String defaultInfo = " ";

public String getDefaultInfo() {

return defaultInfo;

}

public void setDefaultInfo(String defaultInfo) {

this.defaultInfo = defaultInfo;

}

public String getSortInfo() {

return sortInfo;

}

public void setSortInfo(String sortInfo) {

this.sortInfo = sortInfo;

}

public String getSortName() {

return sortName;

}

public void setSortName(String sortName) {

setPageSortState(sortName);

}

public String getSortState() {

return sortState;

}

public void setSortState(String sortState) {

this.sortState = sortState;

}

public Page() {

}

/**

* 常用,用于计算分页

* */

public Page(Long totalRecords){

this.totalCount = totalRecords;

setTotalPage(getTotalPage(totalRecords));

}

/**

* 设置每页显示多少条时使用

* */

public Page(Long everyPage,Long totalRecords){

this.everyPage = everyPage;

this.totalCount = totalRecords;

setTotalPage(getTotalPage(totalRecords));

}

/**

* @param state 状态码

* @param value 到第多少页或者设置每页显示多少条或者为排序列名

*/

public void pageState(int index,String value) {

sort = false;

switch (index) {

case 0 :setEveryPage(Long.parseLong(value));break;

case 1 :first();break;

case 2: previous();break;

case 3: next();break;

case 4: last();break;

case 5: sort = true;sort(value);break;

case 6 ://到指定第多少页

setCurrentPage(Long.parseLong(value));

break;

}

}

/**

* 最前一页

*/

private void first() {

currentPage = 1L;

}

private void previous() {

currentPage--;

}

private void next() {

currentPage++;

}

private void last() {

currentPage = totalPage;

}

private void sort(String sortName) {

//设置排序状态

setPageSortState(sortName);

}

/**

* 计算总页数

* */

private Long getTotalPage(Long totalRecords) {

Long totalPage = 0L;

everyPage = everyPage == null ? 10L : everyPage;

if (totalRecords % everyPage == 0)

totalPage = totalRecords / everyPage;

else {

totalPage = totalRecords / everyPage + 1;

}

return totalPage;

}

public Long getBeginIndex() {

this.beginIndex = (currentPage - 1) * everyPage;

return this.beginIndex;

}

public void setBeginIndex(Long beginIndex) {

this.beginIndex = beginIndex;

}

public Long getCurrentPage() {

this.currentPage = currentPage == 0 ? 1 : currentPage;

return this.currentPage;

}

public void setCurrentPage(Long currentPage) {

if(0 == currentPage){

currentPage = 1L;

}

this.currentPage = currentPage;

}

public Long getEveryPage() {

this.everyPage = everyPage == 0 ? 10 : everyPage;

return this.everyPage;

}

public void setEveryPage(Long everyPage) {

this.everyPage = everyPage;

}

public Boolean getHasNextPage() {

this.hasNextPage = (currentPage != totalPage) && (totalPage != 0);

return this.hasNextPage;

}

public void setHasNextPage(Boolean hasNextPage) {

this.hasNextPage = hasNextPage;

}

public Boolean getHasPrePage() {

this.hasPrePage = currentPage != 1;

return this.hasPrePage;

}

public void setHasPrePage(Boolean hasPrePage) {

this.hasPrePage = hasPrePage;

}

public Long getTotalPage() {

return this.totalPage;

}

public void setTotalPage(Long totalPage) {

if(this.currentPage > totalPage){

this.currentPage = totalPage;

}

this.totalPage = totalPage;

}

public Long getTotalCount() {

return this.totalCount;

}

public void setTotalCount(Long totalCount) {

setTotalPage(getTotalPage(totalCount));

this.totalCount = totalCount;

}

@Override

public String toString() {

return ToStringBuilder.reflectionToString(this);

}

/**

* 设置排序状态

* */

private void setPageSortState(String newPageSortName){

//判断之前的排序字段是否为空

if(StringUtils.isEmpty(sortName)){

//默认排序为升序

this.sortState = PageUtil.ASC;

this.sortInfo = PageUtil.PAGE_ASC;

}else{

if(StringUtils.equalsIgnoreCase(newPageSortName, sortName)){

//判断sortState排序状态值

if(StringUtils.equalsIgnoreCase(sortState, PageUtil.ASC)){

this.sortState = PageUtil.DESC;

this.sortInfo = PageUtil.PAGE_DESC;

}else{

this.sortState = PageUtil.ASC;

this.sortInfo = PageUtil.PAGE_ASC;

}

}else{

//默认

this.sortState = PageUtil.ASC;

this.sortInfo = PageUtil.PAGE_ASC;

}

}

sortName = newPageSortName.toLowerCase();

}

public Boolean isSort() {

return sort;

}

public void setSort(Boolean sort) {

this.sort = sort;

}

public Long getEndinIndex() {

this.endinIndex = (currentPage) * everyPage;

return endinIndex;

}

public void setEndinIndex(Long endinIndex) {

this.endinIndex = endinIndex;

}

}

2.PageState.java

[java] view
plain copy

package com.cm.contract.common;

import org.apache.commons.lang.StringUtils;

/**分页状态类

* @author FENGWEI

* @date 2016-5-23

*/

public enum PageState {

/**

* 设置每页显示多少条

* */

SETPAGE,

/**

* 首页

* */

FIRST,

/**

* 向前一页

* */

PREVIOUS,

/**

* 向后一页

* */

NEXT,

/**

* 末页

* */

LAST,

/**

* 排序

* */

SORT,

/**

* 到第多少页

* */

GOPAGE;

/**

* @param value 索引名称

* @return 返回索引下标

*/

public static int getOrdinal(String value) {

int index = -1;

if (StringUtils.isEmpty(value)) {

return index;

}

String newValue = StringUtils.trim(value).toUpperCase();

try {

index = valueOf(newValue).ordinal();

} catch (IllegalArgumentException e) {}

return index;

}

}

3.PageUtil.java

[java] view
plain copy

/**

* 分页工具类

* @author FENGWEI

* @date 2016-5-23

*/

public class PageUtil {

public static final String ASC = "asc";

public static final String DESC = "desc";

public static final String PAGE_DESC = "↓";

public static final String PAGE_ASC = "↑";

public static final String PAGE_NULL = " ";

public static final String SESSION_PAGE_KEY = "page";

/**

* 初始化分页类

* @param initPageSql 未分页的查询SQL

* @param totalCount 总行数

* @param index 分页状态

* @param value 只有在设置每页显示多少条时,值不会NULL,其它为NULL

*/

public static Page inintPage(Long totalCount,Integer index,String value,Page sessionPage){

Page page = null;

if(index < 0){

page = new Page(totalCount);

}else{

/**每页显示多少条*/

Long everPage = null == value ? 10 : Long.parseLong(value);

/**获取Session中的分页类,方便保存页面分页状态*/

page = sessionPage;

page.setEveryPage(everPage);

page.setTotalCount(totalCount);

}

return page;

}

/**

* 当页点击:首页,前一页,后一页,末页,排序,到第多少页时进行分页操作

* @param index 分页状态

* @param value 排序字段名或者到第多少页

*/

public static Page execPage(int index,String value,Page sessionPage){

Page page = sessionPage;

/**调用方法进行分页计算*/

page.pageState(index,value);

return page;

}

}

4.DefaultController.java 此部分可以灵活使用

[java] view
plain copy

package com.cm.contract.common;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.springframework.web.bind.annotation.ModelAttribute;

/**

* 提取公用的request和response Title:DefaultController Descrption:

*

* @author FENGWEI

* @date 2016-5-6下午3:30:32

*/

public class DefaultController {

/**

* oracel的三层分页语句 子类在展现数据前,进行分页计算!

*

* @param querySql

* 查询的SQL语句,未进行分页

* @param totalCount

* 根据查询SQL获取的总条数

* @param columnNameDescOrAsc

* 列名+排序方式 : ID DESC or ASC

*/

protected Page executePage(HttpServletRequest request, Long totalCount) {

if (null == totalCount) {

totalCount = 0L;

}

/** 页面状态,这个状态是分页自带的,与业务无关 */

String pageAction = request.getParameter("pageAction");

String value = request.getParameter("pageKey");

/** 获取下标判断分页状态 */

int index = PageState.getOrdinal(pageAction);

Page page = null;

/**

* index < 1 只有二种状态 1 当首次调用时,分页状态类中没有值为 NULL 返回 -1 2 当页面设置每页显示多少条:

* index=0,当每页显示多少条时,分页类要重新计算

* */

Page sessionPage = getPage(request);

if (index < 1) {

page = PageUtil.inintPage(totalCount, index, value, sessionPage);

} else {

page = PageUtil.execPage(index, value, sessionPage);

}

setSession(request, page);

return page;

}

private Page getPage(HttpServletRequest request) {

Page page = (Page) request.getSession().getAttribute(

PageUtil.SESSION_PAGE_KEY);

if (page == null) {

page = new Page();

}

return page;

}

private void setSession(HttpServletRequest request, Page page) {

request.getSession().setAttribute(PageUtil.SESSION_PAGE_KEY, page);

}

}

使用方法:

5,Controller.java

[java] view
plain copy

/**

* model 添加的分页条件

* executePage 方法写在工具类中

* @param model

*/

@Controller

public class CMLogController extends DefaultController {

@RequestMapping("index.do")

public ModelAndView userInto(ModelMap model, String username) {

nameStr = username;

model.addAttribute("username", nameStr);

// 分页数

Long totalCount = logService.pageCounts(model);

// 分页显示

Page page = executePage(request, totalCount);

if (page.isSort()) {

model.put("orderName", page.getSortName());

model.put("descAsc", page.getSortState());

} else {

model.put("orderName", "logtime");

model.put("descAsc", "desc");

}

model.put("startIndex", page.getBeginIndex());

model.put("endIndex", page.getEndinIndex());

ModelAndView mv = new ModelAndView();

// 分页查询

logList = logService.pageList(model);

mv.addObject("logList", logList);

mv.setViewName("/jsp/log");

return mv;

}}

6.maybatis中几条查询语句

[html] view
plain copy

//分页查询

<select id="pageList" parameterType="map" resultMap="BaseResultMap">

select ttt.* from(select tt.*,rownum rn from(select * from CM_LOG

<where>

<if test="username != null and username != ''">

<!--

特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。

在开发时使用: $,方便调试sql,发布时使用: #

-->

and username like '%${username}%'

</if>

<if test="type != null and type != ''">

<!--

特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。

在开发时使用: $,方便调试sql,发布时使用: #

-->

AND TYPE = #{type,jdbcType=VARCHAR}

</if>

</where>

order by ${orderName} ${descAsc} )tt)ttt

<where>

<if test="startIndex != null and startIndex != ''">

rn > ${startIndex}

</if>

<if test="endIndex != null and endIndex != ''">

<![CDATA[ and rn <= ${endIndex} ]]>

</if>

</where>

</select>

// 分页数

<select id="pageCounts" parameterType="map" resultType="long">

select count(*) from CM_LOG

<where>

<if test="username != null and username != ''">

and username like '%${username}%'

</if>

</where>

</select>

7.前台页面index.jsp

[javascript] view
plain copy

//只需在页面布局添加该div

//username 为条件

// <jsp:param name="url" value="/log/index.do?"/> 不带条件的方式 问号必须存在

<body >

<div align="right" style="height: 20">

<jsp:include page="/jsp/page.jsp">

<jsp:param name="url" value="/log/index.do?username=${username }"/>

</jsp:include>

</div>

</body >

8,引用的Page.jsp

[javascript] view
plain copy

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:set var="page" value="${sessionScope.page}" />

<c:set var="path" value="${pageContext.request.contextPath}" />

<c:set var="url" value="${param.url}" />

<c:set var="urlParams" value="${param.urlParams}" />

<c:set var="pathurl" value="${path}/${url}" />

<tr>

<td colspan="5">

${urlParams }

共${page.totalCount}条记录 共${page.totalPage}页 每页显示${page.everyPage}条

当前第${page.currentPage}页

<c:choose>

<c:when test="${page.hasPrePage eq false}">

<<首页 <上页

</c:when>

<c:otherwise>

<a href="${pathurl}&pageAction=first${urlParams}"><<首页 </a>

<a href="${pathurl}&pageAction=previous${urlParams}" /><上一页</a>

</c:otherwise>

</c:choose>

||

<c:choose>

<c:when test="${page.hasNextPage eq false}">

下页> 尾页>>

</c:when>

<c:otherwise>

<a href="${pathurl}&pageAction=next${urlParams}">下一页> </a>

<a href="${pathurl}&pageAction=last${urlParams}">末页>></a>

</c:otherwise>

</c:choose>

<SELECT name="indexChange" id="indexChange"

onchange="getCurrentPage(this.value);">

<c:forEach var="index" begin="1" end="${page.totalPage}" step="1">

<option value="${index}" ${page.currentPage eq index ? "selected" : ""}>

第${index}页

</option>

</c:forEach>

</SELECT>

每页显示:<select name="everyPage" id="everyPage" onchange="setEveryPage(this.value);">

<c:forEach var="pageCount" begin="5" end="${page.totalCount}" step="5">

<option value="${pageCount}" ${page.everyPage eq pageCount ? "selected" : ""}>

${pageCount}条

</option>

</c:forEach>

</select>

</td>

</tr>

<div style='display: none'>

<a class=listlink id="indexPageHref" href='#'></a>

</div>

<script>

function getCurrentPage(index){

var a = document.getElementById("indexPageHref");

a.href = '${pathurl}&pageAction=gopage&pageKey='+index+'${urlParams}';

a.setAttribute("onclick",'');

a.click("return false");

}

function setEveryPage(everyPage){

var a = document.getElementById("indexPageHref");

var currentPage = document.getElementById('indexChange').value;

a.href = '${pathurl}&pageAction=setpage&pageKey='+everyPage+'${urlParams}';

a.setAttribute("onclick",'');

a.click("return false");

}

function sortPage(sortName){

var a = document.getElementById("indexPageHref");

a.href = '${pathurl}&pageAction=sort&pageKey='+sortName+'${urlParams}';

a.setAttribute("onclick",'');

a.click("return false");

}

</script>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: