mybatis的物理分页:mybatis-paginator

github上有一个专门针对mybatis的物理分页开源项目:mybatis-paginator,兼容目前绝大多数主流数据库,十分好用,下面是使用步骤:

环境:struts2 + spring + mybatis

一、pom.xml中添加依赖项

1   <dependency>
2    <groupId>com.github.miemiedev</groupId>
3    <artifactId>mybatis-paginator</artifactId>
4    <version>1.2.15</version>
5   </dependency>

二、mybatis映射文件中按常规写sql语句

 1     <select id="getFsuList" resultType="N_CA_FSU">
 2         Select t.RECID                        recId,
 3                t.GROSSWEIGHT                  grossWeight,
 4                t.TOTALGROSSWEIGHT             totalGrossWeight,

 5                t.GROSSWEIGHTUNITCODE          grossWeightUnitCode,
 6               ...
 7
 8           From N_CA_FSU t
 9          Where ...
10     </select>

三、服务层基类

 1 package acc.service.support;
 2
 3 import java.io.Serializable;
 4 import java.util.List;
 5
 6 import org.apache.ibatis.session.SqlSession;
 7 import org.apache.ibatis.session.SqlSessionFactory;
 8 import org.mybatis.spring.SqlSessionFactoryBean;
 9 import org.mybatis.spring.SqlSessionUtils;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12 import org.springframework.beans.factory.annotation.Autowired;
13
14 import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
15
16 public class BaseServiceImpl implements Serializable {
17
18     private static final long serialVersionUID = 1293567786956029903L;
19
20     protected Logger logger = LoggerFactory.getLogger(this.getClass());
21
22     @Autowired
23     protected SqlSessionFactoryBean sqlSessionFactory;
24
25     /**
26      * 查询分页数据
27      *
28      * @param mapperClass
29      * @param sqlId
30      * @param sqlParameter
31      * @param pageIndex
32      * @param pageSize
33      * @return
34      * @throws Exception
35      */
36     protected List<?> getPageList(Class<?> mapperClass, String sqlId,
37             Object sqlParameter, int pageIndex, int pageSize) throws Exception {
38         SqlSession session = null;
39         try {
40             SqlSessionFactory sessionFactory = sqlSessionFactory.getObject();
41             session = SqlSessionUtils.getSqlSession(sessionFactory);
42             if (pageIndex <= 0) {
43                 pageIndex = 1;
44             }
45             if (pageSize <= 0) {
46                 pageSize = 10;
47             }
48             PageBounds pageBounds = new PageBounds(pageIndex, pageSize);
49             return session.selectList(mapperClass.getName() + "." + sqlId,
50                     sqlParameter, pageBounds);
51         } finally {
52             session.close();
53         }
54
55     }
56
57 }

四、具体的服务层子类调用

 1 package acc.service.support;
 2
 3 ...
 4
 5 @Service
 6 public class FsuServiceImpl extends BaseServiceImpl implements FsuService {
 7
 8     private static final long serialVersionUID = 6560424159072027262L;
 9
10     @Autowired
11     FsuMapper fsuMapper;
12
13     ...
14
15
16     @SuppressWarnings("unchecked")
17     @Override
18     public PageList<N_CA_FSU> getAll(int pageIndex, int pageSize)
19             throws Exception {
20         return (PageList<N_CA_FSU>) getPageList(FsuMapper.class, "getFsuList",
21                 null, pageIndex, pageSize);
22     }
23
24     ...
25
26
27 }

服务层就处理完了,接下来看Action层

五、Action基类

 1 package acc.action;
 2
 3 import org.apache.struts2.ServletActionContext;
 4 import org.apache.struts2.convention.annotation.ParentPackage;
 5 import org.slf4j.Logger;
 6 import org.slf4j.LoggerFactory;
 7
 8 import acc.lms.invoker.utils.StringUtils;
 9
10 import com.opensymphony.xwork2.ActionSupport;
11
12 @ParentPackage("default")
13 public class BaseController extends ActionSupport {
14
15     protected Logger logger = LoggerFactory.getLogger(this.getClass());
16
17     private static final long serialVersionUID = -8955001188163866079L;
18
19     private int pageSize = 15;
20
21     private int pageIndex = 1;
22
23     private int totalCounts = 0;
24     private int totalPages = 0;
25
26     public int getPageSize() {
27         return pageSize;
28     }
29
30     public void setPageSize(int pageSize) {
31         this.pageSize = pageSize;
32     }
33
34     public int getPageIndex() {
35         String t = ServletActionContext.getRequest().getParameter("pageIndex");
36         if (!StringUtils.isEmpty(t)) {
37             pageIndex = Integer.parseInt(t);
38         }
39         return pageIndex;
40     }
41
42     public int getTotalCounts() {
43         return totalCounts;
44     }
45
46     public void setTotalCounts(int totalCounts) {
47         this.totalCounts = totalCounts;
48     }
49
50     public int getTotalPages() {
51         return totalPages;
52     }
53
54     public void setTotalPages(int totalPages) {
55         this.totalPages = totalPages;
56     }
57
58 }

注:约定分页时,url类似  /xxx.action?pageIndex=N

六、具体的Action子类调用

 1 package acc.action;
 2
 3 ...
 4
 5 @Results({ @Result(name = "success", type = "redirectAction", params = {
 6         "actionName", "fsu" }) })
 7 public class FsuController extends BaseController implements
 8         ModelDriven<Object> {
 9
10     ...
11     @Autowired
12     FsuService fsuService;
13
14     ...
15
16
17
18     // GET /fsu
19     public HttpHeaders index() throws Exception {
20         list = fsuService.getAll(getPageIndex(), getPageSize());
21
22         setPageSize(list.getPaginator().getLimit());
23         setTotalCounts(list.getPaginator().getTotalCount());
24         setTotalPages(list.getPaginator().getTotalPages());
25
26         return new DefaultHttpHeaders("index").disableCaching();
27     }
28
29     ...
30
31 }

七、前端页面

 1 <link href="${pageContext.request.contextPath}/resources/css/simplePagination/simplePagination.css" rel="stylesheet" type="text/css"/>
 2 <script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/common/jquery-1.7.1.min.js"></script>
 3 <script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/common/simplePagination/jquery.simplePagination.js"></script>
 4     <script type="text/javascript">
 5         var pageIndex = ${pageIndex};
 6         var pageSize = ${pageSize};
 7         var totalPages = ${totalPages};
 8         var totalCounts = ${totalCounts};
 9
10         $(document).ready(function() {
11
12             $("#page-box").pagination({
13                     items: totalCounts,
14                     itemsOnPage: pageSize,
15                     currentPage:pageIndex,
16                     cssStyle: ‘light-theme‘,
17                     prevText:‘<‘,
18                     nextText:‘>‘,
19                     onPageClick:function(page){
20                         gotoPage(page);
21                     }
22             });
23             showPageInfo();
24
25         });
26
27         function gotoPage(page) {
28             window.location = "${pageContext.request.contextPath}/fsu?pageIndex=" + page;
29         }
30
31         function showPageInfo(){
32             $("#page-info").html(pageSize + "条/页,共" + totalCounts + "条,第" + pageIndex + "页,共" + totalPages + "页");
33         }
34     </script>
35
36
37 <table class="tableE">
38     <thead>
39         <tr>
40             <th>运单号</th>
41             <th>起始站</th>
42             ...
43         </tr>
44     </thead>
45
46     <tbody>
47         <s:iterator value="list">
48             <tr>
49                 <td>${waybillNumber}</td>
50                 <td>${origin}</td>
51                 ...
52             </tr>
53         </s:iterator>
54     </tbody>
55 </table>
56
57
58 <div id="page-box"></div>

解释:jquery的分页插件,网上一搜索一大堆,我用的是jquery.simplePagination,${pageIndex}、${pageSize}...包括list,这些属性都是后台Action中的model属性

时间: 2024-10-08 19:56:43

mybatis的物理分页:mybatis-paginator的相关文章

《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项

0.写在前面 MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上.MyBatis提供了一级缓存.二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能.本文的目的则是向读者详细介绍MyBatis的一级缓存,深入源码,解析MyBatis一级缓存的实现原理,并且针对一级缓存的特点提出了在实际使用过程中应该注意的事项. 读完本文,你将会学到: 1.什么是一级缓存?为什么使用一级缓存? 2.MyBatis的一级缓存是怎样组织的?(即SqlSes

mybatis实战教程(mybatis in action),mybatis入门到精通

转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加一条,其实大家可以看官方的教程更好些:http://mybatis.github.io/mybatis-3/,而且如果英文不是很好的那就看中文的:http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html) 写在这个系列前面的话: 以前曾经用过ibat

mybatis实战教程(mybatis in action),mybatis入门到精通(转)

转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加一条,其实大家可以看官方的教程更好些:http://mybatis.github.io/mybatis-3/,而且如果英文不是很好的那就看中文的:http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html) 写在这个系列前面的话: 以前曾经用过ibat

MyBatis动态SQL————MyBatis动态SQL标签的用法

1.MyBatis动态SQL MyBatis 的强大特性之一便是它的动态 SQL,即拼接SQL字符串.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中. 动态 SQL 元素和

mybatis实战教程(mybatis in action)之一:开发环境搭建

文章转载自http://www.yihaomen.com/article/java/302.htm 什么是mybatisMyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想无论是用过的hibernate,myb

MyBatis MapperScannerConfigurer配置――MyBatis学习笔记之八

MyBatis MapperScannerConfigurer配置——MyBatis学习笔记之八 2012-09-02 20:01:42 标签:Spring MyBatis MapperScannerConfigurer bean默认命名 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://legend2011.blog.51cto.com/3018495/980150 在上一篇博文的示例中,我们在beans.xml中配置了stu

《深入理解mybatis原理》 MyBatis事务管理机制

MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面.本文将讲述MyBatis的事务管理的实现机制.首先介绍MyBatis的事务Transaction的接口设计以及其不同实现JdbcTransaction 和 ManagedTransaction:接着,从MyBatis的XML配置文件入手,讲解MyBatis事务工厂的创建和维护,进而阐述了MyBatis事务的创建和使用:最后分析JdbcTransaction和ManagedTransaction的实现和二者的不同

《深入理解mybatis原理》 Mybatis数据源与连接池

对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文将通过对MyBatis框架的数据源结构进行详尽的分析,并且深入解析MyBatis的连接池. 本文首先会讲述MyBatis的数据源的分类,然后会介绍数据源是如何加载和使用的.紧接着将分类介绍UNPOOLED.POOLED和JNDI类型的数据源组织:期间我们会重点讲解POOLED类型的数据源和其实现的连接池原理. 以下是本章的组织结构: 一.MyBatis数据源DataSource分类 二.数据源DataSour

Mybatis分页-利用Mybatis Generator插件生成基于数据库方言的分页语句,统计记录总数 (转)

众所周知,Mybatis本身没有提供基于数据库方言的分页功能,而是基于JDBC的游标分页,很容易出现性能问题.网上有很多分页的解决方案,不外乎是基于Mybatis本机的插件机制,通过拦截Sql做分页.但是在像Oracle这样的数据库上,拦截器生成的Sql语句没有变量绑定,而且每次语句的都要去拦截,感觉有点浪费性能. Mybatis Generator是Mybatis的代码生成工具,可以生成大部分的查询语句. 本文提供的分页解决方案是新增Mybatis Generator插件,在用Mybatis