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