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

这个是核心分页实体:

  1. import java.io.Serializable;
  2. import java.util.List;
  3. import java.util.Map;
  4.  
  5. import org.apache.commons.lang.StringUtils;
  6. import org.springframework.jdbc.core.JdbcTemplate;
  7.  
  8. /**
  9. * 分页实体
  10. * @author lyh
  11. * @version 2013-10-10
  12. * @see Pagination
  13. * @since
  14. */
  15. public class Pagination implements Serializable
  16. {
  17. /**
  18. * 序列号<br>
  19. */
  20. private static final long serialVersionUID = -2554565760258955645L;
  21.  
  22. /**
  23. * 每页显示的记录数
  24. */
  25. private int numPerPage;
  26.  
  27. /**
  28. * 记录总数 (命名必须为total 对应easyui分页)
  29. */
  30. private int total;
  31.  
  32. /**
  33. * 总页数
  34. */
  35. private int totalPages;
  36.  
  37. /**
  38. * 当前页码
  39. */
  40. private int currentPage;
  41.  
  42. /**
  43. * 记录起始行数
  44. */
  45. private int startIndex;
  46.  
  47. /**
  48. * 记录结束行数
  49. */
  50. private int lastIndex;
  51.  
  52. /**
  53. * 结果集存放List (命名必须为rows 对应easyui分页)
  54. */
  55. private List<Map<String,Object>> rows;
  56.  
  57. /**
  58. * 构造函数
  59. * @param sql sql语句
  60. * @param currentPage 当前页码
  61. * @param numPerPage 每页显示记录数
  62. * @param jdbcTemplate JdbcTemplate实例
  63. */
  64. public Pagination(String sql, int currentPage, int numPerPage, JdbcTemplate jdbcTemplate)
  65. {
  66. if (jdbcTemplate == null)
  67. {
  68. throw new IllegalArgumentException(
  69. "jdbcTemplate is null , pls initialize ... ");
  70. }
  71. else if (StringUtils.isBlank(sql))
  72. {
  73. throw new IllegalArgumentException("sql is blank , pls initialize ... ");
  74. }
  75. //设置每页显示记录数
  76. setNumPerPage(numPerPage);
  77.  
  78. //设置当前页数
  79. setCurrentPage(currentPage);
  80.  
  81. //计算总记录数SQL
  82. StringBuffer totalSQL = new StringBuffer(" select count(1) from ( ");
  83. totalSQL.append(sql);
  84. totalSQL.append(" ) ");
  85.  
  86. //总记录数
  87. setTotal(jdbcTemplate.queryForInt(totalSQL.toString()));
  88.  
  89. //计算总页数
  90. setTotalPages();
  91.  
  92. //计算起始行数
  93. setStartIndex();
  94.  
  95. //计算结束行数
  96. setLastIndex();
  97.  
  98. //拼装oracle的分页语句 (其他DB修改此处的分页关键词即可)
  99. StringBuffer paginationSQL = new StringBuffer(" select * from ( ");
  100. paginationSQL.append(" select row_limit.*,rownum rownum_ from ( ");
  101. paginationSQL.append(sql);
  102. paginationSQL.append(" ) row_limit where rownum <= " + lastIndex);
  103. paginationSQL.append(" ) where rownum_ > " + startIndex);
  104.  
  105. //装入结果集(key转为小写)
  106. setRows(ConvertMapkey.listKeyToLower(jdbcTemplate.queryForList(
  107. paginationSQL.toString())));
  108. }
  109.  
  110. /**
  111. * 根据总记录数和每页显示记录数 计算总页数
  112. *
  113. * @see
  114. */
  115. private void setTotalPages()
  116. {
  117. if (total % numPerPage == 0)
  118. {
  119. this.totalPages = total / numPerPage;
  120. }
  121. else
  122. {
  123. this.totalPages = (total / numPerPage) + 1;
  124. }
  125. }
  126.  
  127. /**
  128. * 根据当前页和每页显示记录条数 计算记录开始行数
  129. *
  130. * @see
  131. */
  132. private void setStartIndex()
  133. {
  134. this.startIndex = (currentPage - 1) * numPerPage;
  135. }
  136.  
  137. /**
  138. * 计算记录结束行数
  139. *
  140. * @see
  141. */
  142. private void setLastIndex()
  143. {
  144. if (total < numPerPage)
  145. {
  146. this.lastIndex = total;
  147. }
  148. else if ((total % numPerPage == 0)
  149. || (total % numPerPage != 0 && currentPage < totalPages))
  150. {
  151. this.lastIndex = currentPage * numPerPage;
  152. }
  153. else if (total % numPerPage != 0 && currentPage == totalPages)
  154. {
  155. this.lastIndex = total;
  156. }
  157. }
  158.  
  159. //setter and getter
  160. public int getCurrentPage()
  161. {
  162. return currentPage;
  163. }
  164.  
  165. public void setCurrentPage(int currentPage)
  166. {
  167. this.currentPage = currentPage;
  168. }
  169.  
  170. public int getNumPerPage()
  171. {
  172. return numPerPage;
  173. }
  174.  
  175. public void setNumPerPage(int numPerPage)
  176. {
  177. this.numPerPage = numPerPage;
  178. }
  179.  
  180. public List<Map<String,Object>> getRows()
  181. {
  182. return rows;
  183. }
  184.  
  185. public void setRows(List<Map<String,Object>> rows)
  186. {
  187. this.rows = rows;
  188. }
  189.  
  190. public int getTotalPages()
  191. {
  192. return totalPages;
  193. }
  194.  
  195. public int getTotal()
  196. {
  197. return total;
  198. }
  199.  
  200. public void setTotal(int total)
  201. {
  202. this.total = total;
  203. }
  204.  
  205. public int getStartIndex()
  206. {
  207. return startIndex;
  208. }
  209.  
  210. public int getLastIndex()
  211. {
  212. return lastIndex;
  213. }
  214.  
  215. }

Map转化工具类:

  1. public class ConvertMapkey {
  2.  
  3. /**
  4. * 把map对象的key全部转为小写形式
  5. * @param map
  6. * @return
  7. */
  8. public static Map<String, Object> keyToLower(Map<String, Object> map) {
  9. Map<String, Object> r = new HashMap<String, Object>();
  10. if (map == null || map.size() == 0)
  11. return r;
  12. for (Map.Entry<String, Object> entry : map.entrySet()) {
  13. r.put(entry.getKey().toLowerCase(), entry.getValue());
  14. }
  15. return r;
  16. }
  17.  
  18. /**
  19. * 把list map中map对象的key全部转为小写形式
  20. * @param listmap
  21. * @return
  22. */
  23. public static List<Map<String, Object>> listKeyToLower(List<Map<String, Object>> listmap) {
  24. List<Map<String, Object>> r = new ArrayList<Map<String, Object>>();
  25. if (listmap == null || listmap.size() == 0)
  26. return r;
  27. for (Map<String, Object> map : listmap) {
  28. r.add(keyToLower(map));
  29. }
  30. return r;
  31. }
  32. }

DAO层 \ Service层:

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

Controller层:

  1. @RequestMapping(value = "/list_school")
  2. @ResponseBody
  3. public Pagination listSchool(HttpServletRequest request) {
  4.  
  5. Pagination p = null;
  6. try {
  7.  
  8. int page = Integer.parseInt(request.getParameter("page"));
  9. int rows = Integer.parseInt(request.getParameter("rows"));
  10.  
  11. String school_code = request.getParameter("s_school_code");
  12. String school_name = request.getParameter("s_school_name");
  13.  
  14. //page:当前页 rows:每页显示记录条数 区别结果集存放List-rows
  15. p = schoolService.pageData(page, rows, school_id, school_code, school_name);
  16.  
  17. } catch (Exception e) {
  18. logger.error(e);
  19. }
  20. return p;
  21. }

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

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

JS部分:

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

JSP页面:

  1. <table id="basedg" toolbar="#toolbar" pagination="true"></table>
  2. <div id="toolbar">
  3. <div id="searchbar">
  4. <table cellspacing="0" cellpadding="0">
  5. <tr>
  6. <td>查询条件:</td>
  7. <td>
  8. <input id="s_school_code" class="easyui-searchbox" data-options="prompt:'学校代码'"></input>
  9. </td>
  10. <td>
  11. <input id="s_school_name" class="easyui-searchbox" data-options="prompt:'学校名称'"></input>
  12. </td>
  13. </tr>
  14. </table>
  15. </div>
  16. <a href="javascript:void(0)" id="btn_02010100" class="easyui-linkbutton" iconCls="icon-search" plain="true">查询</a>
  17. </div>

最终效果:

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

  1. log Begining method: com.ruhuiyun.studentmanager.service.SchoolService.pageData
  2. 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 ) ]
  3. 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]
  4. 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. 列"xx"不在表Table中

    在数据库中用了left join来查一个表的所有列和另一个表的一个列,但无论用IDataReader还是DataSet都不能获取到另一个表的列,调试时总是说没有那个值,但在数据库中执行语句又有.一直想 ...

  2. javascript高级程序设计一(80-116)

    81.函数内部属性:arguments.arguments.callee.this. window.color = "red"; var o={color:"blue&q ...

  3. SqlServer2008 数据库同步的两种方式 (发布、订阅)

    尊重原著作:本文转载自http://www.cnblogs.com/tyb1222/archive/2011/05/31/2064944.html 上篇中说了通过SQL JOB的方式对数据库的同步,这 ...

  4. Oracle EBS 如何月结[Z]

    概述应付模块的多数业务基于采购和库存的操作,因此应付模块的月结应该在采购模块和库存模块月结后才能关闭会计期.月结步骤在每个会计期末,应付模块的月结应遵循以下流程:1.检查业务是否全部录入;2.检查是否 ...

  5. XML CDATA(Mybatis mapper and XML)

    Tip:must be followed by either attribute specifications, ">" or "/>". 所有 X ...

  6. 《OS X Mountain Lion》 读书杂记

    OS X是一个类UNIX操作系统,由底层的Darwin和上层的OS X应用程序框架(Cocoa, Carbon, Quartz等)及Aqua用户界面组成.其中Darwin是一个开源.完整的POSIX- ...

  7. Android Every day a new function:two

    分享功能: 效果图: 代码(分享TEXT,视频或者图片设置type即可): @Override protected void onCreate(Bundle savedInstanceState) { ...

  8. CPU核心数

    Process.ProcessorAffinity 属性: public IntPtr ProcessorAffinity { get; set; }属性值:位掩码,表示关联进程内的线程可以在其上运行 ...

  9. 在CMD命令行下关闭进程的命令

    转载: [重要]在CMD命令行下关闭进程的命令━━━━━━━━━━━━━━━━━━━━━━━━━━ 方法一: 在"运行"中输入:ntsd -c q -pn 程序名字(在MS-Dos ...

  10. SelectDirectory使用方法以及EnableTaskWindows

    SelectDirectory使用方法 格式 Delphi syntax: On Windows: function SelectDirectory(const Caption: string; co ...