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. WCF学习资料汇总

    微软官方讲解教程: 跟我一起从零开始学WCF系列课程 http://msdnwebcast.net/webcast/1/2692/ 构建WCF面向服务的应用程序系列课程 http://msdnwebc ...

  2. @在php中的作用

    @是PHP提供的错误信息屏蔽的专用符号. 使用@mysql_query 不会出现Warning,而原来mysql_query 在遇到错误时会在页面上访提示Warning. 看PHP的代码,总有些行前边 ...

  3. #VSTS 日志# VSTS 所有功能,看这个页面就够了!

    随着Connect();//2015大会的结束,一大波的好消息随之而来.今天小编刚刚发现了Visual Studio Team Services / Team Foundation Server 的完 ...

  4. (视频) 《快速创建网站》1. 网站管理平台WordPress & 微软Azure 云计算简介

    网站并不神秘,过节了,在家闲的没事的,自己建个网站玩玩吧.每段视频不超过15分钟,地铁/公交/睡前/醒来看一段,几天之后变身建站专家,找老板加薪去! 在普通人眼里,创建网站是专业开发人员和IT工程师才 ...

  5. 【译】Java中的枚举

    前言 译文链接:http://www.programcreek.com/2014/01/java-enum-examples/ Java中的枚举跟其它普通类很像,在其内部包含了一堆预先定义好的对象集合 ...

  6. Git的常用操作,记录下

    首先生成密钥 ssh-keygen -t rsa -C "your_email@youremail.com" 然后打开workdir,敲 git init 设置一个远端库 git ...

  7. Java Se:Java Security

    Java API中有很多都使用了SecurityManager,这到底是什么玩意?最近看公司的产品的源码,也有不少SecurityManager.AccessControlContext等相关的代码, ...

  8. itextpd f生成 pdf 文件

    一.简介 itextpdf 是一个开源的允许你去创建和操作PDF文档的库.它使的开发者可以提高web和其他应用来动态地生成或操作PDF文档.通过iText 中的Document和PdfWriter类, ...

  9. read

    从标准输入读入一行内容并以空格为分隔符赋值给变量,如果输入的内容过多,则把剩下的所有内容都赋值给最后一个变量 $read A B C 123 456 789 101 $echo "$A&qu ...

  10. x01.Excel: 合计件数

    由于 VBA 与 Excel 是耦合的,所以还是先看表: 件数的计算,用 Mod 即可.但考虑到要求码洋.数量等多种需求,就该 VBA 登场了.代码如下: '===================== ...