使用方法:
PageHelper.startPage(page, rows);//第一句
Query(params);//第二句
问题一:
看似第一句和第二句没有任何关系,为何第一句会影响第二句?
答案:通过ThreadLocal传递pageNum、pageSize变量
ThreadLocal把分页变量pageNum和pageSize传给mybatis拦截器(一条判断是否存在ThreadLocal变量的判断语句),如果mybatis拦截到ThreadLocal中的变量,会将page和rows变量取出,重新拼接到sql上。
问题二:
ThreadLocal有没有自动销毁机制,如果存在两条sql,第二题sql会不会用第一条sql的ThreadLocal,即两次请求会不会互相影响?
答案:两次请求不会互相影响
第一种情况:如果两次sql请求在线程池里面不同的线程中,则ThreadLocal里面存的page和rows变量必然不会互相影响,因为ThreadLocal是线程内变量。
第二种情况:如果两次sql请求在线程池里面的同一个线程中,则两次sql请求是并发的,即有先后顺序,第二次sql请求不会受到第一次sql请求的ThreadLocal的影响,在源码中可以发现:
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();
因此每有一次sql请求,都会new一个ThreadLocal,两次sql请求是两个完全不同的ThreadLocal对象。第二次sql请求不会受第一次sql请求所产生的的ThreadLocal的影响。
参考:https://blog.csdn.net/qq_21996541/article/details/79796117
https://my.oschina.net/zudajun/blog/745232