mybatis的物理分页:mybatis-paginator

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

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

 

目录
相关文章
|
1月前
|
SQL Java 数据库连接
微服务——MyBatis分页
本文介绍了分页的多种实现方式,包括自带RowBounds分页、第三方插件PageHelper分页、SQL分页、数组分页及拦截器分页。其中,RowBounds是先查询全部结果再内存分页;PageHelper通过修改SQL动态添加分页关键字;SQL分页依赖数据库自身的分页功能如`LIMIT`;数组分页则是查询全量数据后用`subList`方法截取;拦截器分页则统一在SQL后添加分页语句。最后总结逻辑分页适合小数据量,但大数据量易内存溢出;物理分页虽小数据量效率较低,但更适合大数据场景,优先推荐使用。
42 0
|
1月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
|
1月前
|
SQL Java 关系型数据库
MyBatis篇-分页
本文介绍了多种分页方式,包括自带rowbound内存分页、第三方插件pagehelper(通过修改SQL实现分页)、SQL分页(依赖limit或rownum等关键字)、数组分页(先查询全部数据再用subList分页)、拦截器分页(自定义拦截器为SQL添加分页语句)。最后总结了逻辑分页(内存分页,适合小数据量)和物理分页(直接在数据库层面分页,适合大数据量)的优缺点,强调物理分页优先于逻辑分页。
|
2月前
|
监控 安全 数据库
【YashanDB 知识库】Mybatis-Plus 调用 YashanDB 怎么设置分页
数据库状态分为正常与异常两种情况。当出现异常时,首先查看告警列表确认问题(如实例无法连接),并尝试用数据库用户名和密码登录。若能登录,说明主实例故障已切换至备库;若无法登录或为单节点,则需进一步排查。接着检查监控项,若有数据表明主实例故障,无数据则可能是通信中断。随后检查主机上的服务是否存在,若存在但通信受限,需排查安全设置或网络;若服务不存在,可能因重启或断电导致,需手动启动相关服务。最终在YashanDB列表中确认状态恢复。
|
1月前
|
SQL Java 数据库连接
MyBatis 实现分页的机制
MyBatis 的分页机制主要依赖于 `RowBounds` 对象和分页插件。`RowBounds` 实现内存分页,适合小数据量场景,通过设定偏移量和限制条数对结果集进行筛选。而针对大数据量,则推荐使用分页插件(如 PageHelper),实现物理分页。插件通过拦截 SQL 执行,动态修改语句添加分页逻辑,支持多种数据库方言。配置插件后,无需手动调整查询方法即可完成分页操作,提升性能与灵活性。
|
2月前
|
XML SQL Java
十二、MyBatis分页插件
十二、MyBatis分页插件
102 17
|
1月前
|
Oracle 关系型数据库 Java
|
8月前
|
SQL XML Java
8、Mybatis-Plus 分页插件、自定义分页
这篇文章介绍了Mybatis-Plus的分页功能,包括如何配置分页插件、使用Mybatis-Plus提供的Page对象进行分页查询,以及如何在XML中自定义分页SQL。文章通过具体的代码示例和测试结果,展示了分页插件的使用和自定义分页的方法。
8、Mybatis-Plus 分页插件、自定义分页
|
2月前
|
Oracle 关系型数据库 MySQL
【YashanDB 知识库】Mybatis-Plus 调用 YashanDB 怎么设置分页
**Mybatis-Plus 自动分页配置问题简介** Mybatis-Plus 是 Mybatis 的增强工具,简化 CRUD 操作并适配多种数据库,包括 YashanDB。自动分页配置错误会导致应用开发受影响。解决方法:1. 配置 pagehelper 为 oracle 或 mysql;2. 设置分页拦截器为 oracle 或 mysql。确保返回设置后的对象。正确配置后可在 service 层使用 page 方法实现自动分页。
|
5月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
下一篇
oss创建bucket