zoukankan      html  css  js  c++  java
  • mybatis的物理分页:mybatis-paginator

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

    环境:struts2 + spring + mybatis

    一、pom.xml中添加依赖项

    1   <dependency>
    2    <groupId>com.github.miemiedev</groupId>
    3    <artifactId>mybatis-paginator</artifactId>
    4    <version>1.2.15</version>
    5   </dependency>
    View Code

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

     1     <select id="getFsuList" resultType="N_CA_FSU">
     2         Select t.RECID                        recId,
     3                t.GROSSWEIGHT                  grossWeight,
     4                t.TOTALGROSSWEIGHT             totalGrossWeight,
    
     5                t.GROSSWEIGHTUNITCODE          grossWeightUnitCode,
     6               ...
     7               
     8           From N_CA_FSU t
     9          Where ...
    10     </select>
    View Code

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

     1     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
     2         <property name="dataSource" ref="dataSource" />
     3         <property name="configLocation" value="classpath:mybatis-config.xml"></property>
     4         <property name="typeAliasesPackage" value="acc.entity"></property>
     5         <property name="mapperLocations" value="classpath:mybatis/**/*.xml"></property>
     6         <property name="plugins">
     7             <list>
     8                 <bean
     9                     class="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
    10                     <property name="dialectClass"
    11                         value="com.github.miemiedev.mybatis.paginator.dialect.OracleDialect"></property>
    12                 </bean>
    13             </list>
    14         </property>
    15     </bean>
    View Code

    三、服务层基类

     1 package acc.service.support;
     2 
     3 import java.io.Serializable;
     4 import java.util.List;
     5 
     6 import org.apache.ibatis.session.SqlSession;
     7 import org.apache.ibatis.session.SqlSessionFactory;
     8 import org.mybatis.spring.SqlSessionFactoryBean;
     9 import org.mybatis.spring.SqlSessionUtils;
    10 import org.slf4j.Logger;
    11 import org.slf4j.LoggerFactory;
    12 import org.springframework.beans.factory.annotation.Autowired;
    13 
    14 import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
    15 
    16 public class BaseServiceImpl implements Serializable {
    17 
    18     private static final long serialVersionUID = 1293567786956029903L;
    19     
    20     protected Logger logger = LoggerFactory.getLogger(this.getClass());
    21 
    22     @Autowired
    23     protected SqlSessionFactoryBean sqlSessionFactory;
    24 
    25     /**
    26      * 查询分页数据
    27      * 
    28      * @param mapperClass
    29      * @param sqlId
    30      * @param sqlParameter
    31      * @param pageIndex
    32      * @param pageSize
    33      * @return
    34      * @throws Exception
    35      */
    36     protected List<?> getPageList(Class<?> mapperClass, String sqlId,
    37             Object sqlParameter, int pageIndex, int pageSize) throws Exception {
    38         SqlSession session = null;
    39         try {
    40             SqlSessionFactory sessionFactory = sqlSessionFactory.getObject();
    41             session = SqlSessionUtils.getSqlSession(sessionFactory);
    42             if (pageIndex <= 0) {
    43                 pageIndex = 1;
    44             }
    45             if (pageSize <= 0) {
    46                 pageSize = 10;
    47             }
    48             PageBounds pageBounds = new PageBounds(pageIndex, pageSize);
    49             return session.selectList(mapperClass.getName() + "." + sqlId,
    50                     sqlParameter, pageBounds);
    51         } finally {
    52             session.close();
    53         }
    54 
    55     }
    56 
    57 }
    View Code

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

     1 package acc.service.support;
     2 
     3 ...
     4 
     5 @Service
     6 public class FsuServiceImpl extends BaseServiceImpl implements FsuService {
     7 
     8     private static final long serialVersionUID = 6560424159072027262L;
     9 
    10     @Autowired
    11     FsuMapper fsuMapper;
    12 
    13     ...
    14     
    15 
    16     @SuppressWarnings("unchecked")
    17     @Override
    18     public PageList<N_CA_FSU> getAll(int pageIndex, int pageSize)
    19             throws Exception {
    20         return (PageList<N_CA_FSU>) getPageList(FsuMapper.class, "getFsuList",
    21                 null, pageIndex, pageSize);
    22     }
    23 
    24     ...
    25     
    26 
    27 }
    View Code

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

    五、Action基类

     1 package acc.action;
     2 
     3 import org.apache.struts2.ServletActionContext;
     4 import org.apache.struts2.convention.annotation.ParentPackage;
     5 import org.slf4j.Logger;
     6 import org.slf4j.LoggerFactory;
     7 
     8 import acc.lms.invoker.utils.StringUtils;
     9 
    10 import com.opensymphony.xwork2.ActionSupport;
    11 
    12 @ParentPackage("default")
    13 public class BaseController extends ActionSupport {
    14 
    15     protected Logger logger = LoggerFactory.getLogger(this.getClass());
    16 
    17     private static final long serialVersionUID = -8955001188163866079L;
    18 
    19     private int pageSize = 15;
    20 
    21     private int pageIndex = 1;
    22 
    23     private int totalCounts = 0;
    24     private int totalPages = 0;
    25 
    26     public int getPageSize() {
    27         return pageSize;
    28     }
    29 
    30     public void setPageSize(int pageSize) {
    31         this.pageSize = pageSize;
    32     }
    33 
    34     public int getPageIndex() {
    35         String t = ServletActionContext.getRequest().getParameter("pageIndex");
    36         if (!StringUtils.isEmpty(t)) {
    37             pageIndex = Integer.parseInt(t);
    38         }
    39         return pageIndex;
    40     }
    41 
    42     public int getTotalCounts() {
    43         return totalCounts;
    44     }
    45 
    46     public void setTotalCounts(int totalCounts) {
    47         this.totalCounts = totalCounts;
    48     }
    49 
    50     public int getTotalPages() {
    51         return totalPages;
    52     }
    53 
    54     public void setTotalPages(int totalPages) {
    55         this.totalPages = totalPages;
    56     }
    57 
    58 }
    View Code

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

    六、具体的Action子类调用

     1 package acc.action;
     2 
     3 ...
     4 
     5 @Results({ @Result(name = "success", type = "redirectAction", params = {
     6         "actionName", "fsu" }) })
     7 public class FsuController extends BaseController implements
     8         ModelDriven<Object> {
     9 
    10     ...
    11     @Autowired
    12     FsuService fsuService;
    13 
    14     ...
    15 
    16     
    17 
    18     // GET /fsu
    19     public HttpHeaders index() throws Exception {
    20         list = fsuService.getAll(getPageIndex(), getPageSize());
    21 
    22         setPageSize(list.getPaginator().getLimit());
    23         setTotalCounts(list.getPaginator().getTotalCount());
    24         setTotalPages(list.getPaginator().getTotalPages());
    25 
    26         return new DefaultHttpHeaders("index").disableCaching();
    27     }
    28 
    29     ...
    30 
    31 }
    View Code

    七、前端页面

     1 <link href="${pageContext.request.contextPath}/resources/css/simplePagination/simplePagination.css" rel="stylesheet" type="text/css"/>
     2 <script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/common/jquery-1.7.1.min.js"></script>
     3 <script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/common/simplePagination/jquery.simplePagination.js"></script>
     4     <script type="text/javascript">                
     5         var pageIndex = ${pageIndex};
     6         var pageSize = ${pageSize};
     7         var totalPages = ${totalPages};
     8         var totalCounts = ${totalCounts};
     9         
    10         $(document).ready(function() {
    11         
    12             $("#page-box").pagination({
    13                     items: totalCounts,
    14                     itemsOnPage: pageSize,
    15                     currentPage:pageIndex,
    16                     cssStyle: 'light-theme',
    17                     prevText:'<',    
    18                     nextText:'>',            
    19                     onPageClick:function(page){
    20                         gotoPage(page);
    21                     }
    22             });            
    23             showPageInfo();
    24             
    25         });
    26         
    27         function gotoPage(page) {
    28             window.location = "${pageContext.request.contextPath}/fsu?pageIndex=" + page;            
    29         }
    30         
    31         function showPageInfo(){
    32             $("#page-info").html(pageSize + "条/页,共" + totalCounts + "条,第" + pageIndex + "页,共" + totalPages + "");
    33         }
    34     </script>
    35 
    36 
    37 <table class="tableE">
    38     <thead>
    39         <tr>
    40             <th>运单号</th>
    41             <th>起始站</th>
    42             ...
    43         </tr>
    44     </thead>
    45 
    46     <tbody>
    47         <s:iterator value="list">
    48             <tr>
    49                 <td>${waybillNumber}</td>
    50                 <td>${origin}</td>
    51                 ...
    52             </tr>
    53         </s:iterator>
    54     </tbody>
    55 </table>
    56 
    57 
    58 <div id="page-box"></div>
    View Code

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

    后记:

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

    使用示例:

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

    mybatis-config.xml中的配置:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     3         "http://mybatis.org/dtd/mybatis-3-config.dtd">
     4 <configuration>
     5     <settings>
     6         <setting name="logImpl" value="LOG4J2"/>
     7     </settings>
     8 
     9     <plugins>
    10         <plugin interceptor="com.github.pagehelper.PageHelper">
    11             <!--下面的参数详解见http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown-->
    12             <property name="dialect" value="mysql"/>
    13             <property name="reasonable" value="true"/>
    14             <property name="offsetAsPageNum" value="true"/>
    15             <property name="rowBoundsWithCount" value="true"/>
    16             <property name="pageSizeZero" value="true"/>
    17         </plugin>
    18 
    19         <plugin interceptor="tk.mybatis.mapper.mapperhelper.MapperInterceptor">
    20             <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
    21             <property name="IDENTITY" value="MYSQL"/>
    22             <property name="notEmpty" value="true"/>
    23         </plugin>
    24     </plugins>
    25     
    26 </configuration>
    View Code
  • 相关阅读:
    单步调试理解webpack里通过require加载nodejs原生模块实现原理
    webpack打包过程如何调试?
    django-数据库之连接数据库
    django-模板之include标签(十五)
    django-模板之静态文件加载(十四)
    django-模板之过滤器Add(十三)
    django-模板之with标签(十二)
    django-模板之for empty(十一)
    django-模板之if语句(九)
    django-模板之自动转义autoescape(八)
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/mybatis-paginator-tutorial.html
Copyright © 2011-2022 走看看