EnumStrategy策略枚举-对不同类型的数据库数据源进行分页

public enum DBTypeEnumPager {
	
	MYSQL("MySQL") {
		@Override
		public String doPage(String sql, int rowPerPage, int page, DBETLOptional optional) {
			int offset = (page - 1) * rowPerPage;
			sql = sql + " LIMIT " + offset + "," + rowPerPage;
			return sql;
		}
	},MSSQL("MsSql") {
		@Override
		public String doPage(String sql, int rowPerPage, int page, DBETLOptional optional) {
			if(StringUtils.isEmpty(optional.fromTableName())
					|| StringUtils.isEmpty(optional.inputPk())){
				throw new DBETLException("sqlserver数据库使用分页,必须指定inputPk和fromTableName");
			}
			String pageSql = "SELECT TOP " + rowPerPage + " * FROM " + optional.fromTableName() 
					+ " WHERE " + optional.inputPk() + " NOT IN(SELECT TOP " 
					+ (page - 1)*rowPerPage + " " + optional.inputPk() + " FROM " + optional.fromTableName() + ")";
			return pageSql;
		}
	},ORACLE("Oracle") {
		@Override
		public String doPage(String sql, int rowPerPage, int page, DBETLOptional optional) {
			return toOraclePageSql(sql, page, rowPerPage);
		}
	},DM("DM DBMS") {
		@Override
		public String doPage(String sql, int rowPerPage, int page, DBETLOptional optional) {
			return toOraclePageSql(sql, page, rowPerPage);
		}
	};
	
	private static String toOraclePageSql(String sql, int page, int rowPerPage){
		int startRowNum = (page - 1) * rowPerPage + 1;
		int endRowNum = startRowNum + rowPerPage - 1;
		String pageSql = 
		"SELECT * FROM ( "
		+ "		SELECT rownum r_,a.* "
		+ "		FROM ( "
		+ 			sql
		+ "			) a "
		+ "		) b "
		+ "WHERE b.r_>=" + startRowNum + " AND b.r_<=" + endRowNum;
		return pageSql;
	}
	
	public abstract String doPage(String sql, int rowPerPage, int page, DBETLOptional optional);
	
	public static DBTypeEnumPager convert(String desc){
		for (DBTypeEnumPager em : DBTypeEnumPager.values()) {
			if(em.desc.equals(desc)){
				return em;
			}
		}
		return null;
	}
	
	private String desc;
	
	private DBTypeEnumPager(String desc){
		this.desc = desc;
	}
	
	public String toString(){
		return this.desc;
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值