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. android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论

    GUI 是任何系统都很重要的一块. android GUI大体分为4大块. 1)SurfaceFlinger 2)WMS 3)View机制 4)InputMethod 这块内容非常之多,但是理解后,可 ...

  2. 区别和详解:js中call()和apply()的用法

    1.关于call()和apply()的疑点: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 2.语法和 ...

  3. Spring Boot项目使用Flyway

    Purpose 开发人员在合作的时候经常遇到以下场景: 1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码,然后将代码上传到svn或git等版本控制服务器上.此时 ...

  4. ORACLE 10g AWR报告设置总结

      1:查看.修改AWR报告快照数据的采样间隔.保存策略 SQL> COL DBID FOR 999999999999 SQL> COL SNAP_INTERVAL FOR A26 SQL ...

  5. [原]ubuntu14.04 网卡逻辑修改没有文件/etc/udev/rules.d/70-persistent-net.rules

    -----问题出现------ 在新装的ubuntu14.04系统中没有发现文件/etc/udev/rule.d/70-persistent-net.rules, 无法修改网络的逻辑名称(即把第一张网 ...

  6. (转)Yii的组件机制之一:组件基础类CComponent分析

    Yii的组件机制 组件机制,是Yii整个体系的思想精髓,在使用Yii之前,最应该先了解其组件机制,如果不了解这个机制,那么阅读Yii源代码会非常吃力.组件机制给Yii框架赋予了无穷的灵活性和可扩展性, ...

  7. Java enum的用法详解

    (转自:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html) 用法一:常量 在JDK1.5 之前,我们定义常量都是: ...

  8. android 滑动滚动条调节音量

    利用滚动条滑动控制音量: 定义: private SeekBar mseekBarvolume: 以下实现代码: //调节音量--begin------------------------- //音量 ...

  9. 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】

    一.选择排序 1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止. 2.实例 3.算法 ...

  10. hdu 4966 GGS-DDU (最小树形图)

    比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...