/*
* 描 述: 数据库方言接口类
*/
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;
}
}