mybatis的物理分页:mybatis-paginator
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的更多相关文章
- 【转】mybatis实战教程(mybatis in action),mybatis入门到精通
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis ...
- mybatis实战教程(mybatis in action),mybatis入门到精通
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...
- mybatis实战教程(mybatis in action),mybatis入门到精通(转)
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...
- 《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项
MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上.MyBatis提供了一级缓存.二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能.本 ...
- mybatis 教程(mybatis in action)
目录简介: 一:开发环境搭建二:以接口的方式编程 三:实现数据的增删改查 四:实现关联数据的查询 五:与spring3集成(附源码) 六:与Spring MVC 的集成 七:实现mybatis分页(源 ...
- mybatis实战教程(mybatis in action)之九:mybatis 代码生成工具的使用
mybatis 应用程序,需要大量的配置文件,对于一个成百上千的数据库表来说,完全手工配置,这是一个很恐怖的工作量. 所以mybatis 官方也推出了一个mybatis代码生成工具的jar包. 今天花 ...
- mybatis实战教程(mybatis in action)之九:mybatis 代码生成工具的使用
mybatis 应用程序,需要大量的配置文件,对于一个成百上千的数据库表来说,完全手工配置,这是一个很恐怖的工作量. 所以mybatis 官方也推出了一个mybatis代码生成工具的jar包. 今天花 ...
- mybatis0212 mybatis逆向工程 (MyBatis Generator)
1mybatis逆向工程 (MyBatis Generator) .1什么是mybatis的逆向工程 mybatis官方为了提高开发效率,提高自动对单表生成sql,包括生成 :mapper.xml.m ...
- 《深入理解mybatis原理》 MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...
随机推荐
- 自动化部署教程(一) redhat安装jenkins
自动化部署教程(一) redhat安装jenkins 源配置: sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.or ...
- EMC Documentum DQL整理(三)
1.Get Content Size in folder SELECT SUM(r_full_content_size/1024.0) FROM dm_sysobject WHERE FOLDER(' ...
- spring中的bean
环境准备 Eclipse上新建一个简单的maven工程,Artifact Id选择maven-archetype-quickstart: 添加spring-context依赖: <depende ...
- js平滑返回顶部代码
随便找的一个,使用时直接调用gotoTop就行了,至于调速度之类的我没试,有兴趣的自己试试吧 注意:如果你想改变这个函数的名称千万不要忘了要同时改变第37行的那个gotoTop /** * JavaS ...
- 5个示例带你学习AngularJS
直到现在,你或许已经听说过AngularJS了,一个改变你对web应用思考方式,由谷歌开发的令人兴奋的开源框架.关于它的文章已经写得非常之多,但我发现还是要写些给那些更喜欢快速且实际例子的开发者.当今 ...
- mapreduce流程中的几个关键点
MapReduce中数据流动 (1)最简单的过程: map - reduce (2)定制了partitioner以将map的结果送往指定reducer的过程: map - partiti ...
- Java并发之CountDownLatch 多功能同步工具类
package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * CountD ...
- 【JSP】JSP基础学习记录(一)—— 基础介绍以及3个编译指令
序: 从实现到现在一直是以.net为主,但偶尔也会参与一些其他语言的项目.最近需要对一个Java Web项目进行二次开发,一直没学习过JSP所以买了几本书自学试试.参考资料为<轻量级Java E ...
- 今天说一下 Group by 这个东西
group by 这个关键字,这个语句太平凡了~基本上只要有报表的地方,就会有它的身影. 常规用法就是 INSERT INTO #TypeValue ( TypeID, Col2 ) , N , N ...
- SVN Unable to connect to a repository at UR
背景: 1. SVN服务器:VisualSVN-Server-2.5.5: 2. SVN客户端:TortoiseSVN-1.7.6.22632-x64-svn-1.7. ...