先看效果圖:
分頁參數類:
package com.yadou.model;
/**
* 分頁參數類
* Created by lv on 16-5-12.
*/
public class PageParam {
/**
* 起始頁碼
*/
private int page = 1;
/**
* 每頁顯示條數
*/
private int limit;
/**
* 默認爲10條
*/
public static final int PAGE_SIZE = 10;
/**
* 排序字段
*/
private String sort;
/**
* asc or desc
*/
private String dir;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
}
分頁工具類:
package com.yadou.util;
import com.yadou.model.PageParam;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import java.util.List;
public class Pagination extends JdbcDaoSupport {
private static final Logger LOGGER = LogManager.getLogger(Pagination.class);
//一頁顯示的記錄數
private int pageSize;
//記錄總數
private int totalRows;
//總頁數
private int totalPages;
//當前頁碼
private int currentPage;
//起始行數
private int startIndex;
//結束行數
private int lastIndex;
//結果集存放List
private List resultList;
//JdbcTemplate jTemplate
private JdbcTemplate jTemplate;
/**
* 分頁構造函數
*
* @param sql 根據傳入的sql語句得到一些基本分頁信息
* @param params 參數列表
* @param pageParam 分頁參數對象
* @param jTemplate JdbcTemplate實例
*/
public Pagination(String sql, Object[] params, PageParam pageParam, JdbcTemplate jTemplate) {
if (jTemplate == null) {
throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
} else if (sql == null || sql.equals("")) {
throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
}
//設置每頁顯示記錄數
setPageSize(pageParam.getLimit());
//設置要顯示的頁數
setCurrentPage(pageParam.getPage());
//計算總記錄數
StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( ");
totalSQL.append(sql);
totalSQL.append(" ) totalTable ");
//給JdbcTemplate賦值
setJdbcTemplate(jTemplate);
//總記錄數
setTotalRows(getJdbcTemplate().queryForObject(totalSQL.toString(), params, Integer.class));
//計算總頁數
setTotalPages();
//計算起始行數
setStartIndex();
//計算結束行數
setLastIndex();
//裝入結果集
setResultList(getJdbcTemplate().queryForList(getMySQLPageSQL(new StringBuilder(sql), pageParam), params));
}
/**
* 構造MySQL數據分頁SQL
*
* @param queryString
* @return
*/
public String getMySQLPageSQL(StringBuilder queryString, PageParam pageParam) {
String resultSql = null;
if (pageParam != null && pageParam.getSort() != null && pageParam.getDir() != null) {
queryString.append(" order by ").append(pageParam.getSort()).append(" ").append(pageParam.getDir());
}
if (0 != pageSize) {
resultSql = queryString.append(" limit ").append(startIndex).append(",").append(pageSize).toString();
} else {
resultSql = queryString.toString();
}
LOGGER.info("page sql:{}", resultSql);
return resultSql;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
//如果當前頁碼<1,則默認加載第一頁數據
if (currentPage < 0) {
this.currentPage = 1;
} else {
this.currentPage = currentPage;
}
}
public List getResultList() {
return resultList;
}
public void setResultList(List resultList) {
this.resultList = resultList;
}
public int getTotalPages() {
return totalPages;
}
//計算總頁數
public void setTotalPages() {
if (pageSize == 0) {
totalPages = 0;
} else {
if (totalRows % pageSize == 0) {
this.totalPages = totalRows / pageSize;
} else {
this.totalPages = (totalRows / pageSize) + 1;
}
}
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getStartIndex() {
return startIndex;
}
public void setStartIndex() {
//如果總頁數>當前頁,則默認加載最後一頁
if (currentPage > totalPages) {
currentPage = totalPages;
}
this.startIndex = (currentPage - 1) * pageSize;
}
public int getLastIndex() {
return lastIndex;
}
public JdbcTemplate getJTemplate() {
return jTemplate;
}
public void setJTemplate(JdbcTemplate template) {
jTemplate = template;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
//計算結束時候的索引
public void setLastIndex() {
LOGGER.debug("totalRows={}", totalRows);///////////
LOGGER.debug("pageSize={}", pageSize);///////////
if (pageSize != 0) {
if (totalRows < pageSize) {
this.lastIndex = totalRows;
} else if ((totalRows % pageSize == 0) || (totalRows % pageSize != 0 && currentPage < totalPages)) {
this.lastIndex = currentPage * pageSize;
} else if (totalRows % pageSize != 0 && currentPage == totalPages) {//最後一頁
this.lastIndex = totalRows;
}
}
}
}
程序中使用:
public Pagination find(BGoodsVO bGoodsVO, PageParam pageParam) {
List<Object> params = new ArrayList<>();
StringBuilder sqlBuilder = new StringBuilder("SELECT\n" +
" g.*, s.shop_name\n" +
"FROM\n" +
" b_goods g,\n" +
" b_shop s\n" +
"WHERE\n" +
" g.shopid = s.ID\n");
if (bGoodsVO != null) {
if (bGoodsVO.getState() != null) {
//狀態
sqlBuilder.append(" and g.state = ?");
params.add(bGoodsVO.getState());
}
}
return new Pagination(sqlBuilder.toString(), params.toArray(), pageParam, super.getJdbcTemplate());
}