mybatis的物理分页:mybatis-paginator

时间:2022-03-03 23:03:15

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>