∵ 很容易忘记PageHelper的使用,以及使用方法很奇怪。∴下定决心记住以及弄清楚其背后的原理
先上代码,很简单的分页查询
public ServerResponse<PageInfo> getProductList(int pageNumber, int pageSize){
/**
* 1.pageHelper.startPage
* 2.sql查询逻辑
* 3.处理查询到的结果(进行结果筛选->vo对象)
* 4.pageHelper收尾(aop)
*/
//debug时传入pageNumber为1;pageSize为10
PageHelper.startPage(pageNumber, pageSize);
List<Product> productList = productmMapper.selectList();
List<ProductListVo> productListVoList = Lists.newArrayList();
for(Product product : productList){
ProductListVo productListVo = assembleProductListVo(product);
productListVoList.add(productListVo);
}
//先用默认的结果
PageInfo pageResult = new PageInfo(productList);
//传给前端的用筛选后结果
pageResult.setList(productListVoList);
return ServerResponse.createBySuccess(pageResult);
}
①Page.startPage(int pageNum, int pageSize)
public static <E> Page<E> startPage(int pageNum, int pageSize) {
//默认传入的count为true
return startPage(pageNum, pageSize, true);
}
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {
//默认传入的reasonable为null
return startPage(pageNum, pageSize, count, (Boolean)null);
}
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable) {
//默认传入的pageSizeZero为null
return startPage(pageNum, pageSize, count, reasonable, (Boolean)null);
}
当前的参数数据
可以看到,基本都是在增加一些参数的默认值
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
Page<E> page = new Page(pageNum, pageSize, count);
page.setReasonable(reasonable);
page.setPageSizeZero(pageSizeZero);
Page<E> oldPage = SqlUtil.getLocalPage();
if (oldPage != null && oldPage.isOrderByOnly()) {
page.setOrderBy(oldPage.getOrderBy());
}
SqlUtil.setLocalPage(page);
return page;
}
真正开始存储参数的值到Page类中
计算从第几行开始、第几行结束存储到Page的属性中
又回到startPage(),再次设置了一次reasonable;还设置了PageSizeZero
后面几步是尝试从线程的共享变量中(不同线程之间无法共享,自己和自己共享)尝试设置以前Page的OrderBy的值
private static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();
public static <T> Page<T> getLocalPage() {
return (Page)LOCAL_PAGE.get();
}
通过当前线程来获取对应的ThreadLocalMap(也就是每个线程自己所对应的变量表、副本之类的东西)
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
后续待更