- MyBaties的一款分页插件
- 使用步骤
- 在pom文件中导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
- 在Spring的配置文件的sqlSessionFactoryBean中传入该插件
<!-- 传入PageHelper的插件 -->
<property name="plugins">
<array>
<!-- 传入插件的对象 -->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!--相对应的参数-->
<prop key="helperDialect">mysql</prop>
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
- Controller层
PageInfo是该插件提供的一个分页Bean,把查询出的数据list传入该对象
PageInfo p = new PageInfo(sysLogList);
@Controller
@RequestMapping("/sysLog")
public class ISysLogController {
@Autowired
private ISysLogService sysLogService;
@RequestMapping("/findAll.do")
public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") Integer page, @RequestParam(name = "size", required = true, defaultValue = "5") Integer size) throws Exception {
ModelAndView mv = new ModelAndView();
List<SysLog> sysLogList = sysLogService.findAll(page, size);
PageInfo相当于一个分页的Bean
PageInfo p = new PageInfo(sysLogList);
mv.addObject("pageInfo", p);
mv.setViewName("syslog-page-list");
return mv;
}
}
- 在相关service层执行调用
在调用dao的查询方法前调用方法
PageHelper.startPage(page,size);传入当前第几页以及展示几条数据
@Service
@Transactional
public class ISysLogServiceImpl implements ISysLogService {
@Autowired
ISysLogDao iSysLogDao;
@Override
public List<SysLog> findAll(int page,int size) throws Exception {
PageHelper.startPage(page,size);
return iSysLogDao.findAll();
}
}
- jsp页面
- 请求页面
需要传入请求路径以及分页参数
<li id="system-setting"><a
href="${pageContext.request.contextPath}/sysLog/findAll.do?page=1&size=7"> <i
class="fa fa-circle-o"></i> 访问日志
</a></li>
- 数据展示页面:
实时数据展示
<div class="box-footer">
<div class="pull-left">
<div class="form-group form-inline">
总共${pageInfo.pages} 页,共${pageInfo.total} 条数据。 每页
<select class="form-control"id="changePageSize" οnchange="changePageSize()" >
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
</select> 条
</div>
</div>
换页功能
<div class="box-tools pull-right">
<ul class="pagination">
<li>
<a href="${pageContext.request.contextPath}/sysLog/findAll.do?page=${pageInfo.firstPage}&size=${pageInfo.pageSize }" aria-label="Previous">首页</a>
</li>
<li><a href="${pageContext.request.contextPath}/sysLog/findAll.do?page=${pageInfo.pageNum-1}&size=${pageInfo.pageSize}">上一页</a></li>
<c:forEach begin="1" end="${pageInfo.lastPage}" var="pages">
<li><a href="${pageContext.request.contextPath}/sysLog/findAll.do?page=${pages}&size=${pageInfo.pageSize}">${pages}</a></li>
</c:forEach>
<%--<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>--%>
<li><a href="${pageContext.request.contextPath}/sysLog/findAll.do?page=${pageInfo.pageNum+1}&size=${pageInfo.pageSize}">下一页</a></li>
<li>
<a href="${pageContext.request.contextPath}/sysLog/findAll.do?page=${pageInfo.pages }&size=${pageInfo.pageSize}" aria-label="Next">尾页</a>
</li>
</ul>
</div>
</div>
<!-- /.box-footer-->
第二种实现方式
Service中声明方法返回类型为Page类型
/**品牌列表分页查询*/
public Page<Brand> findPage(int page,int size);
@Override
public Page<Brand> findPage(int page, int size) {
PageHelper.startPage(page,size);
Page<Brand> p= (Page<Brand>) brandMapper.selectAll();
return p;
}
Controller直接调用Page对象的get方法获取数据
@GetMapping(value="/search/{page}/{size}")
public Result findPage(@PathVariable("page")int page,@PathVariable("size")int size){
Page<Brand> pageList= brandService.findPage(page, size);
//将分页插件分页后数据封装到自定义得PageResult中
PageResult pageResult=new PageResult(pageList.getTotal(),pageList.getResult());
return new Result<>(true, StatusCode.OK,"分页查询成功",pageResult);
}
PageResult
package com.changgou.entity;
import java.util.List;
/**分页结果类
* 承载PageHelper分页的数据结果*/
public class PageResult<T> {
private Long total;//总记录数
private List<T> rows;//记录
public PageResult(Long total, List<T> rows) {
this.total = total;
this.rows = rows;
}
public PageResult() {
}
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public List<T> getRows() {
return rows;
}
public void setRows(List<T> rows) {
this.rows = rows;
}
}
PageInfo对象
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;
错误分析
Cause: java.sql.SQLException: ORA-00933: SQL 命令未正确结束
配置问件复制,未更改数据库
<!-- 传入PageHelper的插件 -->
<property name="plugins">
<array>
<!-- 传入插件的对象 -->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!--相对应的参数-->
<prop key="helperDialect">oracle</prop>
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>