`
only1
  • 浏览: 21806 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

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的时候太慢了。

相关推荐

    ibatis sql生成工具

    在Ibatis SQL生成器的压缩包中,"orm"可能是生成的ORM对象相关的文件夹,其中可能包含生成的Java实体类(Entity)、SQL映射文件(Mapper XML)以及对应的Dao接口和实现类。这些文件通常会按照Maven或Gradle等构建...

    MyBatis通过 JDBC连接 PostgreSQL数据库 最小例子

    在本文中,我们将深入探讨如何使用MyBatis框架通过...在实际项目中,你可能需要处理更多复杂的操作,如插入、更新和删除数据,以及分页查询等。MyBatis提供了丰富的功能来满足这些需求,使得数据库操作更加便捷和灵活。

    图书管理系统EXT+ibatis

    【图书管理系统EXT+ibatis】是一个基于Java技术构建的图书管理软件,主要采用了EXT作为前端框架,结合ibatis作为持久层框架,实现了高效、便捷的图书数据管理功能。EXT是一个强大的JavaScript库,提供了丰富的组件和...

    JAVA WEB典型模块与项目实战大全

    18.5 关于hibernate分页系统的具体实现  18.6 关于hibernate分页系统的表示层  18.7 多学两招——分页标签  18.8 小结  第19章 生成报表(struts 2.x+hibernate+jxl)  19.1 生成报表原理  19.2 下载jxl...

    spring-boot-mybatis-plus数据层框架

    - **多数据库支持**:分页插件支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、PostgreSQL等多种数据库。 #### 二、环境搭建与配置 为了在Spring Boot项目中集成MyBatis-Plus,需要进行以下步骤: 1. **导入...

    DBKING使用指南

     这类工具已经很多了,比如大家耳熟能详的Hibernate、iBatis,包括Apache的DBUtils、Spring的JdbcTemplate。为什么我们还要推出db-unifier这样一个功能类似的东西呢?  这些工具的主要目的都是对JDBC进行包装...

Global site tag (gtag.js) - Google Analytics