前文说到,新项目中,用到的是SpringMVC + jdbcTemplate,前台是EasyUI,发现同事以前封装分页是逻辑分页,于是,自己动手封装了下物理分页。

这个是核心分页实体:

import java.io.Serializable;
import java.util.List;
import java.util.Map; import org.apache.commons.lang.StringUtils;
import org.springframework.jdbc.core.JdbcTemplate; /**
* 分页实体
* @author lyh
* @version 2013-10-10
* @see Pagination
* @since
*/
public class Pagination implements Serializable
{
/**
* 序列号<br>
*/
private static final long serialVersionUID = -2554565760258955645L; /**
* 每页显示的记录数
*/
private int numPerPage; /**
* 记录总数 (命名必须为total 对应easyui分页)
*/
private int total; /**
* 总页数
*/
private int totalPages; /**
* 当前页码
*/
private int currentPage; /**
* 记录起始行数
*/
private int startIndex; /**
* 记录结束行数
*/
private int lastIndex; /**
* 结果集存放List (命名必须为rows 对应easyui分页)
*/
private List<Map<String,Object>> rows; /**
* 构造函数
* @param sql sql语句
* @param currentPage 当前页码
* @param numPerPage 每页显示记录数
* @param jdbcTemplate JdbcTemplate实例
*/
public Pagination(String sql, int currentPage, int numPerPage, JdbcTemplate jdbcTemplate)
{
if (jdbcTemplate == null)
{
throw new IllegalArgumentException(
"jdbcTemplate is null , pls initialize ... ");
}
else if (StringUtils.isBlank(sql))
{
throw new IllegalArgumentException("sql is blank , pls initialize ... ");
}
//设置每页显示记录数
setNumPerPage(numPerPage); //设置当前页数
setCurrentPage(currentPage); //计算总记录数SQL
StringBuffer totalSQL = new StringBuffer(" select count(1) from ( ");
totalSQL.append(sql);
totalSQL.append(" ) "); //总记录数
setTotal(jdbcTemplate.queryForInt(totalSQL.toString())); //计算总页数
setTotalPages(); //计算起始行数
setStartIndex(); //计算结束行数
setLastIndex(); //拼装oracle的分页语句 (其他DB修改此处的分页关键词即可)
StringBuffer paginationSQL = new StringBuffer(" select * from ( ");
paginationSQL.append(" select row_limit.*,rownum rownum_ from ( ");
paginationSQL.append(sql);
paginationSQL.append(" ) row_limit where rownum <= " + lastIndex);
paginationSQL.append(" ) where rownum_ > " + startIndex); //装入结果集(key转为小写)
setRows(ConvertMapkey.listKeyToLower(jdbcTemplate.queryForList(
paginationSQL.toString())));
} /**
* 根据总记录数和每页显示记录数 计算总页数
*
* @see
*/
private void setTotalPages()
{
if (total % numPerPage == 0)
{
this.totalPages = total / numPerPage;
}
else
{
this.totalPages = (total / numPerPage) + 1;
}
} /**
* 根据当前页和每页显示记录条数 计算记录开始行数
*
* @see
*/
private void setStartIndex()
{
this.startIndex = (currentPage - 1) * numPerPage;
} /**
* 计算记录结束行数
*
* @see
*/
private void setLastIndex()
{
if (total < numPerPage)
{
this.lastIndex = total;
}
else if ((total % numPerPage == 0)
|| (total % numPerPage != 0 && currentPage < totalPages))
{
this.lastIndex = currentPage * numPerPage;
}
else if (total % numPerPage != 0 && currentPage == totalPages)
{
this.lastIndex = total;
}
} //setter and getter
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 List<Map<String,Object>> getRows()
{
return rows;
} public void setRows(List<Map<String,Object>> rows)
{
this.rows = rows;
} public int getTotalPages()
{
return totalPages;
} public int getTotal()
{
return total;
} public void setTotal(int total)
{
this.total = total;
} public int getStartIndex()
{
return startIndex;
} public int getLastIndex()
{
return lastIndex;
} }

Map转化工具类:

public class ConvertMapkey {

	/**
* 把map对象的key全部转为小写形式
* @param map
* @return
*/
public static Map<String, Object> keyToLower(Map<String, Object> map) {
Map<String, Object> r = new HashMap<String, Object>();
if (map == null || map.size() == 0)
return r;
for (Map.Entry<String, Object> entry : map.entrySet()) {
r.put(entry.getKey().toLowerCase(), entry.getValue());
}
return r;
} /**
* 把list map中map对象的key全部转为小写形式
* @param listmap
* @return
*/
public static List<Map<String, Object>> listKeyToLower(List<Map<String, Object>> listmap) {
List<Map<String, Object>> r = new ArrayList<Map<String, Object>>();
if (listmap == null || listmap.size() == 0)
return r;
for (Map<String, Object> map : listmap) {
r.add(keyToLower(map));
}
return r;
}
}

DAO层 \ Service层:

return new Pagination(sqlFetchRows, page, rows, jdbcTemplate);

Controller层:

  @RequestMapping(value = "/list_school")
@ResponseBody
public Pagination listSchool(HttpServletRequest request) { Pagination p = null;
try { int page = Integer.parseInt(request.getParameter("page"));
int rows = Integer.parseInt(request.getParameter("rows")); String school_code = request.getParameter("s_school_code");
String school_name = request.getParameter("s_school_name"); //page:当前页 rows:每页显示记录条数 区别结果集存放List-rows
p = schoolService.pageData(page, rows, school_id, school_code, school_name); } catch (Exception e) {
logger.error(e);
}
return p;
}

注意:Controller返回的 Pagination实体在会转为JSON(故实体中一定不能含有jdbcTemplate字段,jdbcTemplate只能通过方法形式注入),然后在EasyUi中展示。

通过FireFox 可以发现上述返回的分页实体的JSON。

JS部分:

      // 查询
$('#btn_02010100').click(function() {
$('#basedg').datagrid('load');
});
	$('#basedg').datagrid({
animate: true, //是否动画展开折叠
checkbox: true, //全选复选框
checkOnSelect: true, //选中复选框的同时选中行
selectOnCheck: true, //选中行的同时选中复选框
singleSelect: false, //是否单选
collapsible: true, //是否可折叠
height: 'auto', //自动高度
iconCls: 'icon-save', //样式图标
idField: 'school_id', //主索引,唯一标识字段
loadMsg: '数据载入中,请稍候......',
maximizable: true,
nowrap: true, //截断内文
pagination: true, //分页
pageList: [10,15,20,25,30],
rownumbers: true, //是否显示列数,
url: basePath + '/school/list_school',
frozenColumns: [[
{field:'ck',checkbox:true},
{field:'school_id',title:'唯一id',hidden:true},
{field:'school_code',title:'学校代码',width:80},
{field:'school_name',title:'学校名称',width:200}
]],
columns: [[
{field:'schooling_length',title:'学制',width:100},
{field:'telephone',title:'联系电话',width:120},
{field:'school_address',title:'学校地址',width:300},
{field:'establishment_date',title:'建校年月',width:80,
formatter:function (value) {
return value == null ? '' : (new Date(value).format('yyyy-MM-dd'));
}
}
]],
onBeforeLoad: function (param) {
param.s_school_code = $('#s_school_code').searchbox('getValue');
param.s_school_name = $('#s_school_name').searchbox('getValue');
}
});
}

JSP页面:

<table id="basedg" toolbar="#toolbar" pagination="true"></table>
<div id="toolbar">
<div id="searchbar">
<table cellspacing="0" cellpadding="0">
<tr>
<td>查询条件:</td>
<td>
<input id="s_school_code" class="easyui-searchbox" data-options="prompt:'学校代码'"></input>
</td>
<td>
<input id="s_school_name" class="easyui-searchbox" data-options="prompt:'学校名称'"></input>
</td>
</tr>
</table>
</div>
<a href="javascript:void(0)" id="btn_02010100" class="easyui-linkbutton" iconCls="icon-search" plain="true">查询</a>
</div>

最终效果:

每次查询时的触发SQL如下:

log Begining method: com.ruhuiyun.studentmanager.service.SchoolService.pageData
2013-10-11 10:40:18,345 [qtp14565508-22] DEBUG [org.springframework.jdbc.core.JdbcTemplate] - Executing SQL query [ select count(1) from ( SELECT school_id, school_code, school_name, schooling_length, school_address, telephone, establishment_date FROM T_SCHOOL WHERE 1 = 1 AND instr(school_name, '无锡') > 0 ) ]
2013-10-11 10:40:18,349 [qtp14565508-22] DEBUG [org.springframework.jdbc.core.JdbcTemplate] - Executing SQL query [ select * from ( select row_limit.*,rownum rownum_ from ( SELECT school_id, school_code, school_name, schooling_length, school_address, telephone, establishment_date FROM T_SCHOOL WHERE 1 = 1 AND instr(school_name, '无锡') > 0 ) row_limit where rownum <= 2 ) where rownum_ > 0]
2013-10-11 10:40:18,353 [qtp14565508-22] INFO [com.ruhuiyun.studentmanager.aop.LogAdvice] - log Ending method: com.ruhuiyun.studentmanager.service.SchoolService.pageData

一曲终了~~

Spring jdbcTemplate + EasyUI 物理分页的更多相关文章

  1. (转)Spring JdbcTemplate 方法详解

    Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...

  2. [转]Spring JdbcTemplate 查询分页

    原文:http://blog.csdn.net/xiaofanku/article/details/4280128 现在进行的项目由于数据库的遗留原因(设计的不堪入目)不能用hibernate.所以用 ...

  3. spring jdbcTemplate query

    1. spring jdbcTemplate query需要实现mapRow方法 package com.cdv.apolloagent.jdbc.dao.impl; import java.sql. ...

  4. Spring JdbcTemplate 的使用与学习(转)

    紧接上一篇 (JdbcTemplate是线程安全的,因此可以配置一个简单的JdbcTemplate实例,将这个共享的实例注入到多个DAO类中.辅助的文档) Spring DAO支持 http://ww ...

  5. SpringMVC +mybatis+spring 结合easyui用法及常见问题总结

    SpringMVC +mybatis+spring 结合easyui用法及常见问题总结 1.FormatString的用法. 2.用postAjaxFillGrid实现dataGrid 把form表单 ...

  6. Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)易错使用--转载

    原文地址: http://blog.csdn.net/will_awoke/article/details/12617383 一直用ORM,今天用JdbcTemplate再次抑郁了一次. 首先看下这个 ...

  7. spring jdbcTemplate源码剖析

    本文浅析 spring jdbcTemplate 源码,主要是学习其设计精髓.模板模式.巧妙的回调 一.jdbcTemplate 类结构 ①.JdbcOperations : 接口定义了方法,如 &l ...

  8. hibernate+spring+mvc+Easyui框架模式下使用grid++report的总结

    最近刚开始接触hibernate+spring+mvc+Easyui框架,也是刚开通了博客,希望能记录一下自己实践出来的东西,让其他人少走弯路. 转让正题,以个人浅薄的认识hibernate对于开发人 ...

  9. 使用Spring JDBCTemplate简化JDBC的操作

    使用Spring JDBCTemplate简化JDBC的操作 接触过JAVA WEB开发的朋友肯定都知道Hibernate框架,虽然不否定它的强大之处,但个人对它一直无感,总感觉不够灵活,太过臃肿了. ...

随机推荐

  1. 树形dp-hdu-4714-Tree2cycle

    题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4714 题目意思: 给一棵树,去掉一条边和增加一条边的花费都为1,求最小的花费,使该树变成一个环. 解 ...

  2. var_dump(php)

    var_dump -- 打印变量的相关信息 描述 void var_dump ( mixed expression [, mixed expression [, ...]] ) 此函数显示关于一个或多 ...

  3. ORACLE 如何查询被锁定表及如何解锁释放session

    ORACLE EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 --锁表查询SQLSELECT ...

  4. hadoop 各种组件配置参数

    ********************************************hive*********************************************** hive ...

  5. JAVA 年轻代收集器 第九节

    JAVA 年轻代收集器  第九节 继续上一章所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程.如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低. 因此我 ...

  6. Python核心编程读笔 11:模块

    第12章 模块 1.基本概念 模块的文件名就是模块名字.py 每个模块都定义了自己唯一的名称空间 模块的搜索路径:会被保存在 sys 模块的 sys.path 变量里 >>>sys. ...

  7. 解决SVN:could not start external diff program的问题。

    今天装完SVN之后,用来查看文件不同老是出现could not start external diff program,网上找了很多资料也没找到自己想要的,无意中中右键 Settings看到有个Dif ...

  8. Java提高学习之Object(4)

    哈希码 问: hashCode()方法是用来做什么的? 答: hashCode()方法返回给调用者此对象的哈希码(其值由一个hash函数计算得来).这个方法通常用在基于hash的集合类中,像java. ...

  9. windows迁移linux问题集锦[ZZ]

    http://blog.csdn.net/m_star_jy_sy/article/details/8482202 1)‘_wcsicmp’在此作用域中尚未声明 #ifdef WIN32#define ...

  10. jQuery 源码分析和使用心得 - 序

    众所周知, jQuery (个人简称为jq) 在前端开发中占有着非常重要的地位, 可以说jQuery的存在大大降低了学习网页设计和交互的门槛, 他的简单的语法和顺畅的使用逻辑激发了人们强烈的学习兴趣, ...