package com.walker.jdbc.dao;
import com.walker.common.SplitPageInfo;
import com.walker.db.DatabaseType;
import com.walker.db.Sorts;
import com.walker.db.page.GenericPager;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.jdbc.Constants;
import com.walker.jdbc.SqlAndParameters;
import org.apache.commons.lang3.ArrayUtils;
import java.util.HashMap;
import java.util.Map;
/**
* 分页工具类
*
* @author 时克英
*/
public class PaginationHelper {
/**
* 数据库类型
*/
private String type;
/**
* 获取数据库类型
*
* @return 数据库类型
* @author 时克英
*/
public String getType() {
return type;
}
/**
* 设置数据库类型
*
* @param type 数据库类型
* @author 时克英
*/
public void setType(String type) {
this.type = type;
}
public String getOrderBySql(String sql, Sorts.Sort sort){
if(sort == null){
return sql;
}
return new StringBuilder(sql).append(Constants.SQL_ORDER_BY)
.append(sort.getField()).append(StringUtils.CHAR_SPACE).append(sort.getValue()).toString();
}
public String getSqlPagingQuery(String sql, Sorts.Sort sort){
// if(sort != null){
// sql = new StringBuilder(sql).append(Constants.SQL_ORDER_BY)
// .append(sort.getField()).append(StringUtils.CHAR_SPACE).append(sort.getValue()).toString();
// }
sql = this.getOrderBySql(sql, sort);
if (DatabaseType.NAME_ORACLE.equalsIgnoreCase(type) || DatabaseType.NAME_DAMENG.equalsIgnoreCase(type)) {
return "select * from (select row_.*, rownum rownum_ from (" + sql + ") row_ where rownum <= ?) where rownum_ >= ?";
} else if(DatabaseType.NAME_MYSQL.equalsIgnoreCase(type)
|| DatabaseType.NAME_SQLITE.equalsIgnoreCase(type)){
return sql + " limit ?, ?";
} else if(DatabaseType.NAME_POSTGRES.equalsIgnoreCase(type)){
return sql + " limit ? offset ?";
} else {
return sql + " limit ?, ?";
}
}
/**
* 返回带分页信息的SQL信息对象。
*
* 1)使用GenericPager重写分页查询。
* 2)后续都是使用该方法,废弃:SplitPageInfo
*
* @param sql 原始SQL语句
* @param parameters 参数集合
* @param pager 分页对象,由调用方传递
* @return
* @auth 时克英
* @date 2022-09-18
* @date 2023-07-24 oracle分页索引值+1
*/
public SqlAndParameters