一、说明
什么是分页
针对分页,使用的是PageHelper分页插件,版本使用的是5.1.8
。
参考文档
PageHelper介绍
PageHelper是适用于MyBatis框架的一个分页插件,它支持基本主流与常用的数据库,如MySQL、Oracle、MariaDB、SQLite、Hsqldb等。
特性
使用步骤
PageHelper的使用方式非常便捷,可以在原始SQL查询语句之前添加PageHelper.startPage(pageNum, pageSize);来启动分页。在查询结束后,通过PageInfo对象可以获取分页信息,如总记录数、总页数、每页大小等。
PageHelper的实现原理基于拦截器(Interceptor),在执行相关SQL之前会拦截并做分页处理。通过ThreadLocal机制,将分页参数保存在当前线程中,确保了分页参数的安全性和准确性。
PageHelper还提供了丰富的配置选项和自定义功能,可以根据实际需求进行灵活配置和使用。例如,可以配置是否支持带有“for update”的查询语句,是否支持嵌套查询等。
总的来说,PageHelper是一款功能强大且易于使用的分页插件,适用于MyBatis框架的分页处理,可以大大简化开发人员的工作量,提高开发效率。
二、导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.8</version>
</dependency>
三、集成Spring框架中
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mappers/*.xml"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
reasonable=true
pageSizeZero=true
</value>
</property>
</bean>
</array>
</property>
</bean>
四、编写Service
个人习惯:我的习惯是把分页功能定义到业务层,也就是Service层中,当然你也把分页功能实现在Controller层中。
public interface AccountService {
// 带分页查询
public PageInfo<Account> queryAllByPage(Integer currentPage,Integer pageSize);
}
@Service
public class AccountServiceImpl implements AccountService {
@Override
public PageInfo<Account> queryAllByPage(Integer currentPage, Integer pageSize) {
PageHelper.startPage(currentPage,pageSize);
List<Account> accounts = accountMapper.selectAll();
PageInfo<Account> pageInfo = new PageInfo<Account>(accounts);
return pageInfo;
}
}
五、编写Controller
@Controller
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping(value = "/queryAllByPage")
public String queryAllByPage(@RequestParam(name = "currentPage",
required = true,
defaultValue = "1")
Integer currentPage, Model model){
PageInfo<Account> pageInfo = accountService.queryAllByPage(currentPage , 10);
model.addAttribute("pageInfo",pageInfo);
return "queryAllByPage";
}
}
六、编写queryAllByPage页面展示数据
<%@ page pageEncoding="UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<c:forEach items="${pageInfo.list}" var="account">
${account.name} <br/>
</c:forEach>
<c:forEach begin="1" end="${pageInfo.pages}" step="1" var="currentPage">
<a href="">第${currentPage}页</a>
</c:forEach>
<br/>
当前页:${pageInfo.pageNum} <br/>
总记录数:${pageInfo.total} <br/>
总页数:${pageInfo.pages} <br/>
导航页码数:${pageInfo.navigatePages} <br/>
<c:forEach items="${pageInfo.navigatepageNums}" var="currentPage">
<a href="${pageContext.request.contextPath}/queryAllByPage?currentPage=${currentPage}">第${currentPage}页</a>
</c:forEach>
</body>
</html>