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

环境:struts2 + spring + mybatis

一、pom.xml中添加依赖项

   <dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>1.2.15</version>
</dependency>

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

     <select id="getFsuList" resultType="N_CA_FSU">
Select t.RECID recId,
t.GROSSWEIGHT grossWeight,
t.TOTALGROSSWEIGHT totalGrossWeight, t.GROSSWEIGHTUNITCODE grossWeightUnitCode,
... From N_CA_FSU t
Where ...
</select>

如果使用mybatis-spring来整合mybatis,sqlSessionFactory参考下面修改(主要是加载分页插件)

     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="typeAliasesPackage" value="acc.entity"></property>
<property name="mapperLocations" value="classpath:mybatis/**/*.xml"></property>
<property name="plugins">
<list>
<bean
class="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
<property name="dialectClass"
value="com.github.miemiedev.mybatis.paginator.dialect.OracleDialect"></property>
</bean>
</list>
</property>
</bean>

三、服务层基类

 package acc.service.support;

 import java.io.Serializable;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import com.github.miemiedev.mybatis.paginator.domain.PageBounds; public class BaseServiceImpl implements Serializable { private static final long serialVersionUID = 1293567786956029903L; protected Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
protected SqlSessionFactoryBean sqlSessionFactory; /**
* 查询分页数据
*
* @param mapperClass
* @param sqlId
* @param sqlParameter
* @param pageIndex
* @param pageSize
* @return
* @throws Exception
*/
protected List<?> getPageList(Class<?> mapperClass, String sqlId,
Object sqlParameter, int pageIndex, int pageSize) throws Exception {
SqlSession session = null;
try {
SqlSessionFactory sessionFactory = sqlSessionFactory.getObject();
session = SqlSessionUtils.getSqlSession(sessionFactory);
if (pageIndex <= 0) {
pageIndex = 1;
}
if (pageSize <= 0) {
pageSize = 10;
}
PageBounds pageBounds = new PageBounds(pageIndex, pageSize);
return session.selectList(mapperClass.getName() + "." + sqlId,
sqlParameter, pageBounds);
} finally {
session.close();
} } }

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

 package acc.service.support;

 ...

 @Service
public class FsuServiceImpl extends BaseServiceImpl implements FsuService { private static final long serialVersionUID = 6560424159072027262L; @Autowired
FsuMapper fsuMapper; ... @SuppressWarnings("unchecked")
@Override
public PageList<N_CA_FSU> getAll(int pageIndex, int pageSize)
throws Exception {
return (PageList<N_CA_FSU>) getPageList(FsuMapper.class, "getFsuList",
null, pageIndex, pageSize);
} ... }

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

五、Action基类

 package acc.action;

 import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import acc.lms.invoker.utils.StringUtils; import com.opensymphony.xwork2.ActionSupport; @ParentPackage("default")
public class BaseController extends ActionSupport { protected Logger logger = LoggerFactory.getLogger(this.getClass()); private static final long serialVersionUID = -8955001188163866079L; private int pageSize = 15; private int pageIndex = 1; private int totalCounts = 0;
private int totalPages = 0; public int getPageSize() {
return pageSize;
} public void setPageSize(int pageSize) {
this.pageSize = pageSize;
} public int getPageIndex() {
String t = ServletActionContext.getRequest().getParameter("pageIndex");
if (!StringUtils.isEmpty(t)) {
pageIndex = Integer.parseInt(t);
}
return pageIndex;
} public int getTotalCounts() {
return totalCounts;
} public void setTotalCounts(int totalCounts) {
this.totalCounts = totalCounts;
} public int getTotalPages() {
return totalPages;
} public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
} }

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

六、具体的Action子类调用

 package acc.action;

 ...

 @Results({ @Result(name = "success", type = "redirectAction", params = {
"actionName", "fsu" }) })
public class FsuController extends BaseController implements
ModelDriven<Object> { ...
@Autowired
FsuService fsuService; ... // GET /fsu
public HttpHeaders index() throws Exception {
list = fsuService.getAll(getPageIndex(), getPageSize()); setPageSize(list.getPaginator().getLimit());
setTotalCounts(list.getPaginator().getTotalCount());
setTotalPages(list.getPaginator().getTotalPages()); return new DefaultHttpHeaders("index").disableCaching();
} ... }

七、前端页面

 <link href="${pageContext.request.contextPath}/resources/css/simplePagination/simplePagination.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/common/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/common/simplePagination/jquery.simplePagination.js"></script>
<script type="text/javascript">
var pageIndex = ${pageIndex};
var pageSize = ${pageSize};
var totalPages = ${totalPages};
var totalCounts = ${totalCounts}; $(document).ready(function() { $("#page-box").pagination({
items: totalCounts,
itemsOnPage: pageSize,
currentPage:pageIndex,
cssStyle: 'light-theme',
prevText:'<',
nextText:'>',
onPageClick:function(page){
gotoPage(page);
}
});
showPageInfo(); }); function gotoPage(page) {
window.location = "${pageContext.request.contextPath}/fsu?pageIndex=" + page;
} function showPageInfo(){
$("#page-info").html(pageSize + "条/页,共" + totalCounts + "条,第" + pageIndex + "页,共" + totalPages + "页");
}
</script> <table class="tableE">
<thead>
<tr>
<th>运单号</th>
<th>起始站</th>
...
</tr>
</thead> <tbody>
<s:iterator value="list">
<tr>
<td>${waybillNumber}</td>
<td>${origin}</td>
...
</tr>
</s:iterator>
</tbody>
</table> <div id="page-box"></div>

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

后记:

github上还有另一款mybatis的分页插件:Mybatis-PageHelper 也十分好用,使用说明参考:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown

使用示例:

     @Test
public void testPagination() {
HUserMapper userMapper = context.getBean(HUserMapper.class);
Map<String, Object> param = new HashMap<>();
param.put("city", "上海");
//startPage后紧接的第1个mybatis查询方法被会分页
PageHelper.startPage(3, 10);//第3页开始,每页10条
PageInfo<HUser> pageInfo = new PageInfo<>(userMapper.queryByMap(param));
for (HUser u : pageInfo.getList()) {
log.info("userId:{}", u.getUserId());
}
log.info("pageIndex:{},pageSize:{},pageCount:{},recordCount:{}",
pageInfo.getPageNum(), pageInfo.getPageSize(),
pageInfo.getPages(), pageInfo.getTotal()); }

mybatis-config.xml中的配置:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="LOG4J2"/>
</settings> <plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!--下面的参数详解见http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown-->
<property name="dialect" value="mysql"/>
<property name="reasonable" value="true"/>
<property name="offsetAsPageNum" value="true"/>
<property name="rowBoundsWithCount" value="true"/>
<property name="pageSizeZero" value="true"/>
</plugin> <plugin interceptor="tk.mybatis.mapper.mapperhelper.MapperInterceptor">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="IDENTITY" value="MYSQL"/>
<property name="notEmpty" value="true"/>
</plugin>
</plugins> </configuration>

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

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

    MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis ...

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

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...

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

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...

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

    MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上.MyBatis提供了一级缓存.二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能.本 ...

  5. mybatis 教程(mybatis in action)

    目录简介: 一:开发环境搭建二:以接口的方式编程 三:实现数据的增删改查 四:实现关联数据的查询 五:与spring3集成(附源码) 六:与Spring MVC 的集成 七:实现mybatis分页(源 ...

  6. mybatis实战教程(mybatis in action)之九:mybatis 代码生成工具的使用

    mybatis 应用程序,需要大量的配置文件,对于一个成百上千的数据库表来说,完全手工配置,这是一个很恐怖的工作量. 所以mybatis 官方也推出了一个mybatis代码生成工具的jar包. 今天花 ...

  7. mybatis实战教程(mybatis in action)之九:mybatis 代码生成工具的使用

    mybatis 应用程序,需要大量的配置文件,对于一个成百上千的数据库表来说,完全手工配置,这是一个很恐怖的工作量. 所以mybatis 官方也推出了一个mybatis代码生成工具的jar包. 今天花 ...

  8. mybatis0212 mybatis逆向工程 (MyBatis Generator)

    1mybatis逆向工程 (MyBatis Generator) .1什么是mybatis的逆向工程 mybatis官方为了提高开发效率,提高自动对单表生成sql,包括生成 :mapper.xml.m ...

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

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

随机推荐

  1. C# MVC模式 404 500页面设置方法

    <customErrors mode="On" defaultRedirect="Controllers/Action"> <error st ...

  2. 服务器磁盘扩展卷时遭遇“There is not enough space available on the disk(s) to complete this operation.”错误

    在ESX VM的一台服务器由于磁盘空间告警,打算决定给E盘扩展空间,增加20G的空间,在操作过程遭遇了Expanding Disk Volume gives error "There is ...

  3. [Linux 性能检测工具]VMSTAT

    VMSTAT NAME:          Vmstat: 报告虚拟内存统计 语法 :        vmstat [-a] [-n] [-t] [-S unit] [delay [ count]] ...

  4. SQL Server 2012实施与管理实战指南(笔记)——Ch6连接的建立和问题排查

    6.连接的建立和问题排查 会话的建立分成2个部分: 1.连接,即找到这个实例 2.认证,告诉sql server谁要连接 目录 6.连接的建立和问题排查 6.1协议选择和别名 6.1.1 服务器网络配 ...

  5. VMWare克隆之后设置eth0

    [root@hadoop001 ~]# cd /etc/udev/rules.d/ [root@hadoop001 rules.d]# vim 70-persistent-net.rules 将eth ...

  6. 《CLR via C#》读书笔记--基元类型、引用类型和值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...

  7. n枚硬币问题(找假币)

    问题描述: 在n枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币. 解题思路: ...

  8. 烂泥:yum的使用及配置

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近由于服务器需求,需要在公司内网搭建内网yum源. 搭建内网yum源需要分以下几个步骤,如下: 1. yum是什么 2. repo文件是什么 3. r ...

  9. android Java instanceof关键字

    instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boo ...

  10. 树莓派搭建安装mysql

    最近刚入手了一枚树莓派,突发奇想打算做一个小型的家用服务器,在家7*24小时一直挂着. 真的是非常小,只有巴掌大,给树莓派买了一些配件,外壳.小风扇.2片散热片.32G SD卡.HDMI线,组装之后的 ...