package com.lizard.fastdb.dialect; import com.lizard.fastdb.util.ReflectUtils; /** * 特定关系型数据库实现的SQL方言 * * @author SHEN.GANG */ public abstract class Dialect { /** * MySQL数据库方言 */ public static final String MYSQL = MySQLDialect.class.getName(); /** * Oracle数据库方言 */ public static final String ORACLE = OracleDialect.class.getName(); /** * 特定关系型数据库查询结果的数量限制原则 * * @param sql * 要限制结果数量的查询语句 * @param offset * 查询结果的开始位置 * @param limit * 限制的结果数量 * @return 追加上限制原则的query语句 */ public abstract String getLimitSQL(String sql, int offset, int limit); /** * 根据数据库特性获取新增的主键值 * * @param params * @return 可以获取主键值的SQL */ public abstract String getGeneratedKeySQL(Object... params); /** * 定义一个sql语句,用来检测数据库连接是否有效 * 该语句应该被快速的执行. * MySQL: SELECT 1 * Oracle: SELECT 1 FROM dual * * @return test sql */ public abstract String getTestSQL(); /** * 组装完整的分页语句 * * @param db_dialect * 数据库方言 * @param sql * sql语句片段 * @param page * 页码 * @param pagesize * 页面数据量大小 * @return 完整的分页语句 */ public static String createPageSQL(String db_dialect, String sql, int page, int pagesize) { String pageSql = ""; // 计算查询开始位置 当page<1 时统一设置为 0 int offset = page < 1 ? 0 : ((page - 1) * pagesize); int limit = pagesize <= 0 ? 10 : pagesize; try { // 实例化Dialect为子类db_dialect,用于获得不同数据库对应sql分页语句 Dialect dialect = (Dialect) ReflectUtils.newInstanceFromCache(db_dialect); pageSql = dialect.getLimitSQL(sql, offset, limit); } catch (Exception e) { throw new UnknownDialectException(e); } return pageSql; } /** * 根据驱动获取对应的数据库方言 * * @param driverClass * @return */ public static Dialect getDialect( String driverClass ) { if( null == driverClass ) { return null; } if( driverClass.indexOf("mysql") != -1 ) { return new MySQLDialect(); } else if( driverClass.indexOf("oracle") != -1 ) { return new OracleDialect(); } return null; } }