package com.renrendai.pmes; public class PaginationContext { private PaginationContext() {} private static final ThreadLocal<Integer> pageNoThreadLocal = new ThreadLocal<Integer>(); private static final ThreadLocal<Integer> pageSizeThreadLocal = new ThreadLocal<Integer>(); public static void setPageNo(int pageNo) { pageNoThreadLocal.set(pageNo); } public static void setPageSize(int pageSize) { pageSizeThreadLocal.set(pageSize); } public static int getPageNo() { return pageNoThreadLocal.get(); } public static int getPageSize() { return pageSizeThreadLocal.get(); } public static void removePageNo() { pageNoThreadLocal.remove(); } public static void removePageSize() { pageSizeThreadLocal.remove(); } }
package com.renrendai.pmes; import java.util.List; public class PaginationVO<T> { private int total; private List<T> list; public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } }
package com.renrendai.pmes.web; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * 缺省适配器 * @author Administrator * */ public abstract class FilterAdapter implements Filter { @Override public void destroy() { } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public abstract void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; }
package com.renrendai.pmes.web; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import com.renrendai.pmes.PaginationContext; //public class PaginationFilter implements Filter { public class PaginationFilter extends FilterAdapter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request; int pageNo = 1; if (req.getParameter("pageNo") != null) { pageNo = Integer.parseInt(req.getParameter("pageNo")); } int pageSize = Integer.parseInt(req.getSession().getServletContext().getInitParameter("pageSize")); //将分页数据设置到threadlocal中 PaginationContext.setPageNo(pageNo); PaginationContext.setPageSize(pageSize); try { //继续执行 chain.doFilter(req, response); }finally { PaginationContext.removePageNo(); PaginationContext.removePageSize(); } } }
使用
package com.renrendai.pmes.dao.impl; import java.sql.SQLException; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.renrendai.pmes.PaginationContext; import com.renrendai.pmes.PaginationVO; public class BaseDao extends HibernateDaoSupport { @SuppressWarnings("unchecked") protected PaginationVO pagination(String queryString) { return pagination(queryString, (Object[]) null); } @SuppressWarnings("unchecked") protected PaginationVO pagination(String queryString, Object value) { return pagination(queryString, new Object[]{value}); } @SuppressWarnings("unchecked") protected PaginationVO pagination(final String queryString, final Object[] values) { List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(queryString); if (values != null) { for (int i=0; i<values.length; i++) { query.setParameter(i, values[i]); } } query.setFirstResult((PaginationContext.getPageNo()-1) * PaginationContext.getPageSize()); query.setMaxResults(PaginationContext.getPageSize()); return query.list(); } }); Long total = (Long)getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { String countHql = "select count(*) " + queryString.substring(queryString.indexOf("from"), queryString.length()); countHql = countHql.replaceAll("fetch", ""); Query query = session.createQuery(countHql); if (values != null) { for (int i=0; i<values.length; i++) { query.setParameter(i, values[i]); } } return query.uniqueResult(); } }); PaginationVO paginationVO = new PaginationVO(); paginationVO.setList(list); paginationVO.setTotal(total.intValue()); return paginationVO; } }
相关推荐
`在mysql中,分页的sql是使用limit来做的。...PageHelper会在mybatis执行sql前进行拦截,从ThreadLocal中取出分页参数,修改当前执行的sql语句,添加分页sql,最后执行了添加了分页的sql语句,实现分页查询
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
正确理解ThreadLocal.pdf
DbUTils中用ThreadLocal类
主要介绍ThreadLocal的原理,实例分析以及注意事项
java 简单的ThreadLocal示例
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
Synchronized与ThreadLocal
本例以序列号生成的程序为例,展示ThreadLocal的使用
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
设计模式及ThreadLocal详细讲解资料,想要学习java或者提升自己技术的同学可以下载观看
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053
ThreadLocal源码分析,主要有ThreadLocal源码以及ThreadLocal的内部结构在jdk8前后的变化
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。