spring的jdbcTemplate实现分页

1、分页类代码:

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

/**
* * 分页函数 * *
*
* @author allenpan
*/
public class Pagination extends JdbcDaoSupport{
public static final int NUMBERS_PER_PAGE = 10;
// 一页显示的记录数
private int numPerPage;
// 记录总数
private int totalRows;
// 总页数
private int totalPages;
// 当前页码
private int currentPage;
// 起始行数
private int startIndex;
// 结束行数
private int lastIndex;
// 结果集存放List
private List resultList;
// JdbcTemplate jTemplate
private JdbcTemplate jTemplate;
//private Pagination pagination = new Pagination();
/**
* 每页显示10条记录的构造函数,使用该函数必须先给Pagination设置currentPage,jTemplate初值
*
* @param sql
* oracle语句
*/


public Pagination() {
  
}

/*public Pagination(int currentPage){
   this.currentPage = currentPage;
  
}*/
public Pagination(String sql) {
   if (jTemplate == null) {
    throw new IllegalArgumentException(
      "com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
   } else if (sql.equals("")) {
    throw new IllegalArgumentException(
      "com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
   }
   new Pagination(sql, currentPage, NUMBERS_PER_PAGE, jTemplate, null);
}

/**
* 分页构造函数
*
* @param sql
*            根据传入的sql语句得到一些基本分页信息
* @param currentPage
*            当前页
* @param numPerPage
*            每页记录数
* @param jTemplate
*            JdbcTemplate实例
*/
public Pagination(String sql, int currentPage, int numPerPage,
    JdbcTemplate jTemplate,RowMapper rowMapper) {
   this.currentPage = currentPage;
   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. ");
   }
   // 设置每页显示记录数
   setNumPerPage(numPerPage);
   // 设置要显示的页数
   setCurrentPage(currentPage);
   System.out.println("Pagination currentPage="+currentPage);
   // 计算总记录数
   StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( ");
   totalSQL.append(sql);
   totalSQL.append(" ) totalTable ");
   // 给JdbcTemplate赋值
   setJdbcTemplate(jTemplate);
   // 总记录数
   setTotalRows(getJdbcTemplate().queryForInt(totalSQL.toString()));
   // 计算总页数
   setTotalPages();
   // 计算起始行数
   setStartIndex();
   // 计算结束行数
   setLastIndex();
   System.out.println("lastIndex=" + lastIndex);//
   // 构造oracle数据库的分页语句
   StringBuffer paginationSQL = new StringBuffer(" SELECT * FROM ( ");
   paginationSQL.append(" SELECT temp.* ,ROWNUM num FROM ( ");
   paginationSQL.append(sql);
   paginationSQL.append(" ) temp where ROWNUM <= " + lastIndex);
   paginationSQL.append(" ) WHERE num > " + startIndex);
   System.out.println("sql:"+paginationSQL.toString());
   // 装入结果集
   setResultList(getJdbcTemplate().query(paginationSQL.toString(),rowMapper));
}

/**
* @param args
*/
public int getCurrentPage() {
   return currentPage;
}

public void setCurrentPage(int currentPage) {
   this.currentPage = currentPage;
}

public int getNumPerPage() {
   return numPerPage;
}

public void setNumPerPage(int numPerPage) {
   this.numPerPage = numPerPage;
}


public int getTotalPages() {
   return totalPages;
}

// 计算总页数
public void setTotalPages() {
   if(totalRows % numPerPage == 0){
   this.totalPages = totalRows / numPerPage;
   }else{
   this.totalPages= (totalRows / numPerPage) + 1;
   }
}

public int getTotalRows() {
   return totalRows;
}

public void setTotalRows(int totalRows) {
   this.totalRows = totalRows;
}

public int getStartIndex() {
   return startIndex;
}

public void setStartIndex() {
   this.startIndex = (currentPage - 1) * numPerPage;
}

public int getLastIndex() {
   return lastIndex;
}

public JdbcTemplate getJTemplate() {
   return jTemplate;
}

public void setJTemplate(JdbcTemplate template) {
   jTemplate = template;
}

// 计算结束时候的索引

public void setLastIndex() {
   System.out.println("totalRows=" + totalRows);// /
   System.out.println("numPerPage=" + numPerPage);// /
   if (totalRows < numPerPage) {
    this.lastIndex = totalRows;
   } else if ((totalRows % numPerPage == 0)
     || (totalRows % numPerPage != 0 && currentPage < totalPages)) {
    this.lastIndex = currentPage * numPerPage;
   } else if (totalRows % numPerPage != 0 && currentPage == totalPages) {//最后一页
    this.lastIndex = totalRows;
   }
}

public List getResultList() {
   return resultList;
}

public void setResultList(List resultList) {
   this.resultList = resultList;
}

}
2、页面:
<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags"%>
<script src="js/fenye.js" type="text/javascript"></script>
<%!
String code;
String contractCode;
%>
<%
code = (String)request.getAttribute("code");
contractCode = URLEncoder.encode(code);//为解决乱码问题而设计的,所传参数没有中文不需要
request.setAttribute("contractCode",contractCode);

%>
<table class="listViewPaginationTdS1"><tr>
<div>

<s:if test="pagination.totalPages != 0">
<s:url action="%{#request.url}" id="first">
<s:param name="pagination.currentPage" value="1"></s:param>
<s:param name="contract.contractCode" value="#request.contractCode"/>
</s:url>
<s:url action="%{#request.url}" id="next" >
<s:param name="pagination.currentPage"
value="pagination.currentPage+1">
</s:param>
<s:param name="contract.contractCode" value="#request.contractCode"/>
</s:url>
<s:url action="%{#request.url}" id="prior" >
<s:param name="pagination.currentPage"
value="pagination.currentPage-1"></s:param>
<s:param name="contract.contractCode" value="#request.contractCode"/>
</s:url>
<s:url action="%{#request.url}" id="last">
<s:param name="pagination.currentPage" value="pagination.totalPages"></s:param>
<s:param name="contract.contractCode" value="#request.contractCode"/>
</s:url>
<s:if test="pagination.currentPage == 1">
<td>
<span class="current">首页</span>
<span class="current">上一 页</span></td>
</s:if>
<s:else>
<td>
<s:a href="%{first}">首页</s:a>
<s:a href="%{prior}">上一页</s:a> </td>
</s:else>
<s:if
test="pagination.currentPage == pagination.totalPages || pagination.totalPages == 0">
<td>
<span class="current">下一页</span>
<span class="current">末u-26507 </span> </td>
</s:if>
<s:else>
<td>
<s:a href="%{next}">下一页</s:a>&nbsp;&nbsp;
                  <s:a href="%{last}">末页</s:a> </td>
</s:else>
<td>
<s:form action="%{#request.url}?contract.contractCode=%{#request.contractCode}" theme="simple"
cssStyle="display:inline">
<span class="jumplabel">跳转到</span>
<s:hidden name="pagination.totalPages" value="%{pagination.totalPages}"></s:hidden>
<input type="text" name="pagination.currentPage" size="2"
οnblur="selectPage(this)" />
<span class="jumplabel">页</span>
</s:form>
</td>
<td>
<span class="jumplabel">共<s:property
value="pagination.totalRows" />条</span>
<span class="jumplabel">当前是第 <s:property
value="pagination.currentPage" />/<s:property value="pagination.totalPages"/>页</span>

</td>
</s:if>

</div>

</tr></table>
fenye.js的内容如下
function trim(str){
return str.replace(/(^\s*)|(\s*$)/g, "");
}

function selectPage(input){

var value = trim(input.value);
if(value == ""){
return;
}

if(/\d+/.test(value)){

input.form.submit();
return;
}
alert("请输入正确的页数");
input.focus();

}
注意:pagination.totalRows、pagination.totalPages、pagination.currentPage等的.后面的属性写法一定要和类里面的属性一致,否则在页面无法显示
3、在dao里面调用
public List<ContractEntryDetail> queryDetail(String code,int currentPage) {
String sql = "......";
List<ContractEntryDetail> list = null;
   pagination = new Pagination(sql,currentPage,5,jdbcTemplate,new ContractEntryDetailRowMapper());
   list = pagination.getResultList();//pagination 是dao的一个属性,dao内包含其get、set方法
   return list;
}
4、Action里调用
public String execute(){
list = queryContractFenluDetailService.queryDetaiList(newSc3,pagination.getCurrentPage());
pagination = queryContractFenluDetailService.getPagination();
ActionContext ac = ActionContext.getContext();
ac.put("code", newSc3);
ac.put("url","fenlu.action");
ac.put("pagination",pagination);
ac.put("list", list);
return "success";

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值