⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagesqlserver.java

📁 适合各种数据库的分页程序
💻 JAVA
字号:
package com.ztes.commons.dbo.pagination.impl;

import com.ztes.commons.dbo.pagination.Page;
import com.ztes.commons.dbo.pagination.AbstractPage;

/**
 * sqlserver和access分页的实现,主要借助top函数。
 * 如果要达到用sql语句分页的效果,则sql语句不能是联合查询,必须指定排序字段,并且是唯一的,
 * 而且排序字段不能有重复数据,否则不能达到你想要的分页效果。
 * 典型的支持sql分页的语句如同:select userId,userName from users order by userId。
 * 特别注意的是,当指定的一个排序字段不是唯一值(即有重复值),则不能使用SQL语句分页,并且需要手动指定采用JDBC功能分页,
 * 请调用{@link com.ztes.commons.dbo.pagination.Page#setUseCommonPage(boolean)}方法,设置参数为true。
 * 
 * @author tiannet(曾次清)
 */ 
public class PageSqlServer extends AbstractPage implements Page {

	
	
	/**
	 * 返回分页sql语句。
	 * sqlserver分页的sql语句型如:
	 * <pre>
	 * select top 页大小 *
			from table1 
			where id>
			    (select max (id) from 
			      (select top ((页码-1)*页大小) id from table1 order by id) as T)     
			order by id
	 *</pre>
	 * @param start 获取记录的开始位置,从零开始计。
	 * @param size 获取记录的大小。
	 * @return 分页sql语句。
	 */
	public  String getPageSql(int start, int size) {
		//如果是第一页
		if( start <= 0 ) {
			return "select top " + size + " " + super.getSqlParser().getSqlAfterSelect();
		}
		//除了第一页,判断SQL是否支持分页
		if( !isSupportPageSql() ) {
			return null;
		}
		
		StringBuffer sql = new StringBuffer();
		String temp = "";
		if( super.getSqlParser().isOrderAsc() ) {
			//升序处理
			temp = " >(select max(" + super.getSqlParser().getOrderField() + ") from ";
		} else {
			//降序处理
			temp = " <(select min(" + super.getSqlParser().getOrderField() + ") from ";
		}
		sql.append("select top " + size + " " + super.getSqlParser().getSqlBetweenSelectAndFrom()  + " from ");
		sql.append( super.getSqlParser().getSqlBetweenFromAndWhere() );
		sql.append(" where " + super.getSqlParser().getOrderField() + temp);
		sql.append( getTopOrderFieldSql(start) + ")" );
		if( super.getSqlParser().hasWhere() ) {
			sql.append(" and ");
		}
		sql.append( " " + super.getSqlParser().getSqlAfterWhere() );
		return sql.toString();
	}
	
	/**
	 * 得到获取排序字段最前的指定大小记录
	 * @param top
	 * @return
	 */
	private String getTopOrderFieldSql(int top) {
		return "(select top " + top + " " + super.getSqlParser().getOrderField() + " from " 
				+ super.getSqlParser().getSqlAfterFrom() + ") as pageTblTemp" ;
	}
	
	/**
	 * 是否支持sql语句分页,需要对sql语句具体分析。
	 * @return 如果支持sql语句分页返回true,否则返回false。
	 */
	private  boolean isSupportPageSql() {
		//联合查询不能直接使用sql语句分页
		if( super.getSqlParser().isUnionQuery() ) {
			logger.debug("联合查询,无法使用sql语句分页");
			return false;
		}
		//未指定order by的sql语句不支持
		if( !super.getSqlParser().hasOrderBy() ) {
			logger.debug("查询语句中不含order by,无法使用sql语句分页");
			return false;
		}
		String orderField = super.getSqlParser().getOrderField();
		//排序字段必须指定并且唯一
		if( orderField == null || orderField.indexOf(",") > 0 ) {
			logger.debug("未指定排序字段或者排序字段不唯一,无法使用sql语句分页");
			return false;
		}
		return true;
	}//~ isSupportPageSql
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -