写代码,真是个耗时间的活,尤其在出现bug的时候,简直了,找不到问题,问了百度,问谷歌,最后知道真相以后,发现自己给自己挖的坑,自己跳到坑里,就是找不到坑在拿,身在其中不知其意,记录一下。
PageHelper.startPage();这个方法说的是我要开始分页了哈,全部数据听我号令,没错,这个东东就是干这个的,并且还很挑位置,他就喜欢在最开始的位置,你放错位置你的结果就不是你想要的了,我要说的重点是假如你确定要使用这个方法了,那就善始善终,用完它,不然的话,哼哼,你会发现你代码里所有的查询方法都会出现问题,不管是有分页还是没分页,都会出现数据要么正常,要么就少了,然后就和我一样,还不知道哪里出问题了,心累
划重点:在你使用PageHelper.startPage(),但是在执行完.startPage()后,没有查询数据库操作,并且此次查询请求响应结束,线程空闲时,又有新的别的查询请求进来,此时线程复用,myBaits通过自身的拦截器拦截,导致给新的查询自动添加了Limit?,?,从而报错,没错就是这个问题,用我的话说就是,你既然选择我了,就要对我有始有终,不然后果自负。
当然我们都是对待人和事物有始有终的好男儿,出现这种问题是因为想用人家myBaits的分页功能,还要自己去实现,问题就出现了,想要自己去分页,不使用PageHelper.startPage(),我们自己去分,我自己封装了分页工具类,拿去。
/**
* 分页
*
* @param pageSize 当前页面大小
* @param pageNo 当前页码
* @param list 需要分页的集合
* @param page
* @return
*/
public static List<Map<String, Object>> subListPager(int pageSize, int pageNo, List list, PageBean page)
throws IndexOutOfBoundsException {
// 使用list 中的sublist方法分页
List<Map<String, Object>> dataList = null;
// 每页显示多少条记录
int currentPage; // 当前第几页数据
int totalRecord = list.size(); // 一共多少条记录
int totalPage = totalRecord % pageSize; // 一共多少页
if (totalPage > 0) {
totalPage = totalRecord / pageSize + 1;
} else {
totalPage = totalRecord / pageSize;
}
page.setTotalPage(totalPage);
// 当前第几页数据
currentPage = totalPage < pageNo ? pageNo : totalPage;
// 起始索引
int fromIndex = pageSize * (currentPage - 1);
// 结束索引
int toIndex = pageSize * currentPage > totalRecord ? totalRecord : pageSize * currentPage;
if (fromIndex == 0 && toIndex == 0) {
return dataList;
}
try {
dataList = list.subList(fromIndex, toIndex);
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
return dataList;
}