`

ThreadLocal消除分页参数

 
阅读更多

 

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;		
	}	
	
}

 

分享到:
评论

相关推荐

    Mybatis PageHelper分页插件是一个应用于Mybatis中的分页插件系统.rar

    `在mysql中,分页的sql是使用limit来做的。...PageHelper会在mybatis执行sql前进行拦截,从ThreadLocal中取出分页参数,修改当前执行的sql语句,添加分页sql,最后执行了添加了分页的sql语句,实现分页查询

    ThreadLocal应用示例及理解

    创建ThreadLocal实例时,通常会定义一个泛型参数,代表该线程局部变量的类型。例如: ```java ThreadLocal&lt;String&gt; threadLocal = new ThreadLocal(); ``` ### 设置和获取值 在ThreadLocal中,`set()`方法用于...

    ThreadLocal

    ThreadLocal是Java编程语言中的一个类,用于在多线程环境中提供线程局部变量。它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能...

    理解ThreadLocal

    理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal

    ThreadLocal 内存泄露的实例分析1

    在 `LeakingServlet` 的 `doGet` 方法中,如果 `ThreadLocal` 没有设置值,那么会创建一个新的 `MyCounter` 并设置到 `ThreadLocal` 中。关键在于,一旦 `MyCounter` 被设置到 `ThreadLocal`,那么它将与当前线程...

    ThreadLocal的几种误区

    2. 存放上下文变量:如WebWork的ActionContext,它可以保存请求处理过程中的各种上下文信息,如动作对象、请求参数等。 3. 存储数据库会话:在Spring Hibernate ORM中,ThreadLocal常用来保存数据库连接的Session,...

    ThreadLocal整理.docx

    ThreadLocal 整理 ThreadLocal 是 Java 中的一个重要组件,它能够在每个线程中保持独立的副本。这个功能是通过 Thread 类中的 threadLocals 属性来实现的,这个属性实际上是一个 Entry 数组,其中的每个 Entry 都...

    正确理解ThreadLocal.pdf

    ### 正确理解ThreadLocal:深入解析其工作原理与应用场景 #### 一、ThreadLocal的基本概念 `ThreadLocal`是Java平台提供的一种线程局部变量的解决方案,它为每一个使用该变量的线程都提供了独立的变量副本,使得每...

    java 简单的ThreadLocal示例

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...

    java事务 - threadlocal

    Java事务和ThreadLocal是两种在Java编程中至关重要的概念,它们分别用于处理多线程环境下的数据一致性问题和提供线程局部变量。 首先,我们来深入理解Java事务。在数据库操作中,事务是一系列操作的集合,这些操作...

    ThreadLocal原理及在多层架构中的应用

    - **HTTP请求上下文**:在Web应用中,可以利用ThreadLocal传递请求相关的数据,如用户会话信息、请求参数等。 - **线程本地缓存**:为每个线程提供独立的缓存,避免并发访问引起的同步问题。 - **日志记录器**:在...

    分页技术实现

    在`AbstractManager`中,可以通过`ThreadLocal`来存储和传递分页参数,如偏移量(offset)和每页大小(pagesize)。 5. **定义SystemContext**: `SystemContext`是一个全局上下文类,可以用来存储系统级别的共享...

    threadLocal

    - `用HttpClient来模拟浏览器GET_POST.doc`: 展示了如何利用HttpClient库模拟浏览器发送GET和POST请求,包括参数传递、Cookie管理等。 - `java多态.doc`和`java多态.ppt`: 这两份文档可能详细讲解了Java的多态特性,...

    java中ThreadLocal详解

    ### Java中ThreadLocal详解 #### 一、ThreadLocal概述 在Java多线程编程中,`ThreadLocal`是一个非常重要的工具类,它提供了一种在每个线程内部存储线程私有实例的方法。通常情况下,当多个线程共享某个变量时,...

    ThreadLocal详解.md

    学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!

    设计模式及ThreadLocal资料

    本资料主要聚焦于两种设计模式以及Java中的ThreadLocal特性。 首先,我们来探讨单例模式。单例模式是一种确保一个类只有一个实例,并提供全局访问点的设计模式。在Java中,通常通过私有构造函数、静态工厂方法或...

Global site tag (gtag.js) - Google Analytics