oracle 与mysql分页查询

/*
 * 描       述:  数据库方言接口类
 */
package com.xxxxxx.dhm.portalMS.base.dao;

/**
 *
 * 数据库方言接口类
 * 用于根据各种数据库的差异生成不同的SQL语句
 *
 */
public interface IDialect
{
    /**
     * 返回数据库是否支持分页
     * @return boolean [true--支持分页,false--不支持分页]
     */
    public boolean isLimit();
    
    /**
     * 得到分页语句
     * 根据不同数据库返回不同的分页代码
     * @param sql sql标准语句
     * @param hasOffset 是否有终止参数true-有,false-没有
     * @return String [返回组装好的分页SQL语句]
     */
    public String getLimitString(String sql, boolean hasOffset);
    
    /**
     * 得到具体的分页语句
     * 根据传入的参数不同拼装不同的数据库分页语句
     * @param sql [类型:String]数据库的原始SQL语句
     * @param skipResults [类型:int]起始的记录数
     * @param maxResults [类型:int]结束的记录数
     * @return String [返回组装好的分页SQL语句]
     */
    public String getLimitString(String sql, int skipResults, int maxResults);
}



/*

 * 描       述:  oracle方言的具体实现类
 */
package com.xxxxxx.dhm.portalMS.base.dialect;

import com.xxxxxx.dhm.portalMS.base.dao.IDialect;

/**
 *
 * oracle实现的方言接口
 * 实现了IDialect,对oracle进行了特殊化处理
 *
 */
public class OracleDialect implements IDialect
{
    /**
     * SQL语句结束的符号
     */
    protected static final String SQL_END_DELIMITER = ";";
    
    /**
     * 是否支持分页true-是,false-不支持
     */
    private boolean limit;
    
    /**
     * 返回是否支持分页
     * @return true-支持,false-不支持
     */
    public boolean isLimit()
    {
        return limit;
    }
    
    /**
     * 设置是否支持分页
     * @param  limit true-支持,false-不支持
     */
    public void setLimit(boolean limit)
    {
        this.limit = limit;
    }
    
    /**
     * 得到ORACLE的分页SQL语句
     * @param sql 待分页的SQL语句
     * @param hasOffset 是否有最大页
     * @return [类型:String]返回带分页的SQL语句
     */
    public String getLimitString(String sql, boolean hasOffset)
    {
        StringBuffer bufsql = new StringBuffer(
                "SELECT * FROM (SELECT r.*, ROWNUM rn FROM (");
        bufsql.append(sql);
        bufsql.append(") r WHERE ROWNUM <= ? ");
        bufsql.append(")");
        if (hasOffset)
        {
            bufsql.append("where rn >=?");
            
        }
        return bufsql.toString();
    }
    
    /**
     * 根据起始记录数和终止记录数得到分页的SQL语句
     * @param sql [类型:String]待分页的SQL语句
     * @param skipResults [类型:int]分页的起点记录
     * @param maxResults [类型:int]分页的终止点记录
     * @return [类型:String]具体的分页SQL语句
     */
    
    public String getLimitString(String sql, int skipResults, int maxResults)
    {
        
        StringBuffer bufsql = new StringBuffer(
                "select * from (select r.*, rownum rn from (");
        bufsql.append(sql);
        bufsql.append(") r where rownum <= ");
        bufsql.append(maxResults);
        bufsql.append(") where rn >= ");
        bufsql.append(skipResults);
        return bufsql.toString();
    }
    
}




public class MySQLDialect implements IDialect
{

    protected static final String SQL_END_DELIMITER = ";";

    /**
     * 是否支持分页true-是,false-不支持
     */
    private boolean limit;

    /**
     * 设置是否支持分页
     * @param  limit true-支持,false-不支持
     */
    public void setLimit(boolean limit)
    {
        this.limit = limit;
    }

    /**
     *
     * @param sql 查询的SQL
     * @param hasOffset 是否有分页
     * @return String 分页后的SQL语句
     */
    public String getLimitString(String sql, boolean hasOffset)
    {
        return new StringBuilder(sql.length() + 20).append(trim(sql)).append(hasOffset ? " limit ?,?" : " limit ?")
                .append(SQL_END_DELIMITER).toString();
    }

    /**
     *
     * @param sql 查询参数
     * @param offset 分页起始点
     * @param limit  分页终止点
     * @return String 组装后的SQL
     */
    public String getLimitString(String sql, int offset, int maxResults)
    {
        sql = trim(sql);
        StringBuilder sb = new StringBuilder(sql.length() + 20);
        sb.append(sql);
        if (offset > 0)
        {
            sb.append(" limit ").append(offset - 1).append(',').append(maxResults - offset + 1).append(
                    SQL_END_DELIMITER);
        }
        else
        {
            sb.append(" limit ").append(limit).append(SQL_END_DELIMITER);
        }
        return sb.toString();
    }

    /**
     * @return boolean 是否支持分页
     */
    public boolean isLimit()
    {
        return limit;
    }

    /**
     * 去掉SQL语句中的分号(;)
     * @param sql SQL语句
     * @return String [去掉分号后的SQL语句]
     */
    private String trim(String sql)
    {
        sql = sql.trim();
        if (sql.endsWith(SQL_END_DELIMITER))
        {
            sql = sql.substring(0, sql.length() - 1 - SQL_END_DELIMITER.length());
        }
        return sql;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值