全网几乎没有Cache数据库和IRIS数据库的分页查询(指定起始页),因此排了不少坑总结了可实行的方案。
一、Cache数据库分页查询(指定起始页)
/**
* (只有2011.1版本以后的cache数据库支持%VID分页查询)(2011版本之前的cache数据库建议直接放弃指定起始页分页查询)
* 采用分页查询升序方式,获取指定表的主键或索引字段下的数据
* @param dataBaseName 数据库名称
* @param schemaName schema名称
* @param tableName 表名称
* @param sortingField 排序字段,主键或者索引字段
* @param connection 数据库连接
* @param startPosition 每一页的起始查询位置
* @param singlePageLength 每页获取多少条数据
* @return
* @throws Exception
*/
@Override
public Map<String, JSONObject> pagingQuerySample(String dataBaseName, String schemaName, String tableName,
String sortingField, Object connection, long startPosition, Integer singlePageLength) throws Exception{
String sql = "";
ResultSet rs = null;
PreparedStatement preStmt = null;
Map<String, JSONObject> resultMap;
try{
if(StringUtil.isNotEmpty(sortingField)){
// 构造查询sql
sql = String.format("SELECT *, %VID FROM (SELECT TOP ALL * FROM %s.%s ORDER BY %s) WHERE %VID BETWEEN %s AND %s",schemaName,
tableName, sortingField, startPosition+1, singlePageLength + startPosition + 1);
}else {
sql = String.format("SELECT *, %VID FROM (SELECT TOP ALL * FROM %s.%s ) WHERE %VID BETWEEN %s AND %s",schemaName,
tableName, startPosition+1, singlePageLength + startPosition + 1);
}
preStmt = ((Connection)connection).prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = preStmt.executeQuery();
resultMap = ResultSetUtil.getMapResultSet(rs, 0);
return resultMap;
}catch (Exception e){
e.printStackTrace();
LOGGER.error("分页查询数据失败,失败原因是:", e);
return null;
}finally {
// 关闭资源
try {
if (rs != null) {
rs.close();
}
if (preStmt != null) {
preStmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
二、IRIS数据库分页查询(指定起始页)
/***
* 分页查询数据
* @param dataBaseName 数据库名称
* @param schemaName schema名称
* @param tableName 表名称
* @param sortingField 排序字段,主键或者索引字段
* @param connection 数据库连接
* @param startPosition 每一页的起始查询位置
* @param singlePageLength 每页获取多少条数据
* @return
*/
@Override
public Map<String, JSONObject> pagingQuerySample(String dataBaseName, String schemaName, String tableName,
String sortingField, Object connection, long startPosition ,Integer singlePageLength) throws Exception{
PreparedStatement preStmt = null;
ResultSet rs = null;
// 封装结果集
Map<String, JSONObject> resultMap = new HashMap<>(16);
// 查询sql
String sql = String.format("select *, %s from (select top all * from %s.%s ", "%VID", schemaName, tableName);
if(StringUtil.isNotEmpty(sortingField)){
sql = sql + String.format("order by %s ASC ", sortingField);
}
sql = sql + String.format(") where %s between %d and %d", "%VID", startPosition, startPosition + singlePageLength);
try {
if (StringUtil.isNotEmpty(sql)) {
preStmt = ((Connection)connection).prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = preStmt.executeQuery();
resultMap = ResultSetUtil.getMapResultSetTeredata(rs, singlePageLength);
}
return resultMap;
} catch (SQLException e) {
e.printStackTrace();
throw e;
}
finally {
try{
if(rs != null) {
rs.close();
}
if(preStmt != null) {
preStmt.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}