ibatis分页兑现(postgresql版)

ibatis分页实现(postgresql版)

PagerModel类(通过传递一个查询实体进行查询)

/**
 * 
 */
package com.audit.util;

import java.util.List;

/**
 * @author      chenpeng
 * @file_name   PagerModel.java
 * @create_time 2010-7-27:下午05:21:16
 * @email       onlychenpeng@msn.com
 * TODO
 */
public class PagerModel {
	
	//总数
	private int total;
	
	//当前页码,默认为1
	private int currentPage=1;
	
	
	//总页数
	private int totalPage;
	
	//页面大小,默认为10
	private int pageSize;
	
	//开始,默认为0
	private int startCount=0;
	
	
	//当前页面的长度
	private int currentSize=0;
	
	
	//是否存在下一页
	private boolean hasNext;
	
	
	//是否存在上一页
	private boolean hasPre;

	
	//ibatis的example查询实体
	private Object obj;
	
	//查询出来的数据
	private List datas;
	
	
	
	
	/**
	 * 首页
	 */
	public void first(){
		this.init(1);
	}
	
	/**
	 * 首页,带页面大小
	 * */
	public void first(int pageSize){
		this.init(1, pageSize);
	}
	
	/**
	 * 下一页
	 * */
	public void next(){
		this.currentPage++;
		this.init(this.currentPage);
	}
	
	
	/**
	 * 上一页
	 * */
	public void pre(){
		this.currentPage--;
		this.init(this.currentPage);
	}
	
	/**
	 * 最后一页
	 * */
	public void last(){
		this.currentPage=this.totalPage;
		this.init(this.currentPage);
	}
	
	
	/***/
	
	
	

	/**
	 * 统一初始化所有参数
	 */
	public void init(int currentPage,int pageSize){
		//当传入的数不大于0时,把当前页面设为了1,页面大小设为10
		if(currentPage<1){
			this.currentPage=1;
		}else{
			this.currentPage=currentPage;
		}
		if(pageSize<1){
			this.pageSize=10;
		}else{
			this.pageSize=pageSize;
		}
		
		this.startCount=(this.currentPage-1)*this.pageSize;
		
	}
	
	/**
	 * 统一初始化所有参数
	 * @param currentPage
	 */
	public void init(int currentPage){
		//当传入的数不大于0时,把当前页面设为了1,页面大小设为10
		if(currentPage<1){
			this.currentPage=1;
		}else{
			this.currentPage=currentPage;
		}
		
		this.startCount=(this.currentPage-1)*this.pageSize;
		
	}
	
	public void setTotal(int total) {
		this.total = total;
		//计算出总页数
		int a=this.total/this.pageSize;  //商
		int b=this.total%this.pageSize;  //余
		if(0!=b){
			a++;
		}
		this.totalPage=a;
	}

		
	
	//相应的getter&&setter
	public int getStartCount() {
		return startCount;
	}


	public void setStartCount(int startCount) {
		this.startCount = startCount;
	}


	
	public int getCurrentPage() {
		return currentPage;
	}


	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}


	public int getPageSize() {
		return pageSize;
	}


	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getTotal() {
		return total;
	}

	public List getDatas() {
		return datas;
	}


	public void setDatas(List datas) {
		this.datas = datas;
		this.currentSize=datas.size();
	}
	
	
	
	
	public int getTotalPage() {
		return totalPage;
	}


	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	


	public Object getObj() {
		return obj;
	}


	public void setObj(Object obj) {
		this.obj = obj;
	}

	public int getCurrentSize() {
		return currentSize;
	}

	public void setCurrentSize(int currentSize) {
		this.currentSize = currentSize;
	}

	public boolean isHasNext() {
		if(this.currentPage<this.totalPage){
			return true;
		}else {
			return false;
		}
	}

	public void setHasNext(boolean hasNext) {
		this.hasNext = hasNext;
	}

	public boolean isHasPre() {
		if(this.currentPage>1){
			return true;
		}else{
			return false;
		}
	}

	public void setHasPre(boolean hasPre) {
		this.hasPre = hasPre;
	}

}

 

 xml文件(要进行两次查询,一个是查询记录总数,一个是返回所有记录)

<!-- 查找总数 -->
	<select id="findByExampleCount" parameterClass="PagerModel" resultClass="int">
		select count(*) from "fTest" 
		<dynamic prepend="WHERE">
			<isNotNull property="obj" prepend="AND" open="(" close=")" removeFirstPrepend="true">
				<isNotNull property="obj.test" prepend="AND">
					test like '$obj.test$%'
				</isNotNull>
			</isNotNull>
		</dynamic>
	</select>
	
	<!-- 查找记录 -->
	<select id="findByExample" parameterClass="PagerModel" resultClass="FTest" cacheModel="fTestCache">
		select * from "fTest" 
		<dynamic prepend="WHERE">
			<isNotNull property="obj" prepend="AND" open="(" close=")" removeFirstPrepend="true">
				<isNotNull property="obj.test" prepend="AND">
					test like '$obj.test$%'
				</isNotNull>
			</isNotNull>
		</dynamic>
		limit #pageSize# offset #startCount#
	</select>

 

   DAO类(返回一个PagerModel)

 

	public PagerModel findByExample(PagerModel pm) throws SQLException{
		Integer count=(Integer)sqlMapper.queryForObject("fTest.findByExampleCount",pm);
		List datas=sqlMapper.queryForList("fTest.findByExample",pm);
		pm.setDatas(datas);
		pm.setTotal(count);
		return pm;
		

	}

 

 

  单元测试代码

package com.audit.test;

import java.sql.SQLException;


import com.audit.model.dao.IFTestDAO;
import com.audit.model.dao.impl.FTestDAOImpl;
import com.audit.model.domain.FTest;
import com.audit.util.PagerModel;

import junit.framework.TestCase;

/**
 * @author      chenpeng
 * @file_name   TestPagerModel.java
 * @create_time 2010-7-28:下午04:55:43
 * @email       onlychenpeng@msn.com
 * 测试分页
 */
public class TestPagerModel extends TestCase {
	
	public void testPager(){
		PagerModel pm=new PagerModel();
		pm.init(3, 3);
		FTest test=new FTest();
		test.setTest("test");
		pm.setObj(test);
		IFTestDAO ftDAO=new FTestDAOImpl();
		try {
			pm=ftDAO.findByExample(pm);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if(null!=pm){
			System.out.println("总记录数:"+pm.getTotal());
			System.out.println("总页数:"+pm.getTotalPage());
			System.out.println("当前页:"+pm.getCurrentPage());
			System.out.println("当前页面长度:"+pm.getCurrentSize());
			System.out.println("是否存在上一页:"+pm.isHasPre());
			System.out.println("是否存在下一页:"+pm.isHasNext());
			
		}
	}

}

 

 

   测试结果:

   总记录数:21
   总页数:7
   当前页:1
   当前页面长度:3
  是否存在上一页:false
  是否存在下一页:true

  

 

1 楼 grandboy 2010-12-01  
postgresql的count的效率怎么解决的? 如果要计算页数一定得先知道总的记录数,我的记录有几千万,count的时候太慢了。