📄 pagesqlserver.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 + -