All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gitee.qdbp.jdbc.plugins.SqlDialect Maven / Gradle / Ivy

package com.gitee.qdbp.jdbc.plugins;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.gitee.qdbp.able.jdbc.model.LikeValue;
import com.gitee.qdbp.able.jdbc.paging.Paging;
import com.gitee.qdbp.jdbc.model.DbVersion;
import com.gitee.qdbp.jdbc.sql.SqlBuffer;

/**
 * 数据库方言处理接口
 *
 * @author zhaohuihua
 * @version 190606
 */
public interface SqlDialect {

    /** 获取数据库版本信息 **/
    DbVersion dbVersion();

    /**
     * IN语句最多支持多少项
* oracle的IN语句最多只支持1000项, 其他数据库无限制 * * @return 数量限制, 0表示无限制 */ int getInItemLimit(); /** 生成新的分页SQL对象, 原对象不受影响 **/ SqlBuffer buildPagingSql(SqlBuffer buffer, Paging paging); /** 处理分页, 在原SQL前后追加分页语句 **/ void processPagingSql(SqlBuffer buffer, Paging paging); /** 转换为按拼音排序的表达式 **/ String toPinyinOrderByExpression(String columnName); /** 当前时间的数据库原生写法 **/ String rawCurrentTimestamp(); /** * Boolean类型的变量转换为字符串(用于拼接SQL) * * @param variable 变量 * @return 转换后的值, true=1, false=0 */ String variableToString(Boolean variable); /** * 字符串类型的变量转换为字符串(用于拼接SQL)
* 需要替换特殊字符, 并在两侧加单引号 * * @param variable 变量, 如: Let's go. * @return 转换后的值, 如: 'Let''s go.' */ String variableToString(String variable); /** * 日期类型的变量转换为字符串(用于拼接SQL)
* 一般需要生成TO_TIMESTAMP SQL语句(MYSQL例外,支持字符串)
* * @param variable 指定日期 * @return TO_TIMESTAMP SQL语句
* ORACLE: TO_TIMESTAMP('2019-06-01 12:34:56.789', 'YYYY-MM-DD HH24:MI:SS.FF')
* MYSQL : '2019-06-01 12:34:56.789'
*/ String variableToString(Date variable); /** * 生成LIKE SQL语句
* 如果fieldValue中包含%等特殊字符, 会当作普通字符处理, 就表示查找带有%的数据, 将会自动生成带ESCAPE的SQL
* 如: buildLikeSql("xxx"); 表示查找包含xxx的数据, 生成SQL: LIKE ('%'|| 'xxx' ||'%')
* 如: buildLikeSql("10%"); 表示查找包含10%的数据, 生成SQL: LIKE ('%'|| '10#%' ||'%') ESCAPE '#'
* 如果希望自己处理ESCAPE逻辑, 可传入LikeValue对象:
* 如: buildLikeSql(new LikeValue('#', "%10#%")); 表示查找以10%结尾的数据, 生成SQL: LIKE '%10#%' ESCAPE '#'
* 如: buildLikeSql(new LikeValue("%HOT%COOL%")); 表示查找含有HOT和COOL的数据, 生成SQL: LIKE '%HOT%COOL%'
* * @param fieldValue 字段值, String或LikeValue * @return LIKE SQL语句
* ORACLE: LIKE ('%'|| ? ||'%')
* MYSQL : LIKE CONCAT('%', ?, '%')
*/ SqlBuffer buildLikeSql(String fieldValue); /** * 生成LIKE SQL语句
* 如: buildLikeSql(new LikeValue('#', "%10#%")); 表示查找以10%结尾的数据, 生成SQL: LIKE '%10#%' ESCAPE '#'
* 如: buildLikeSql(new LikeValue("%HOT%COOL%")); 表示查找含有HOT和COOL的数据, 生成SQL: LIKE '%HOT%COOL%'
* * @param fieldValue 字段值, String或LikeValue * @return LIKE SQL语句
* ORACLE: LIKE ? ESCAPE ?
* MYSQL : LIKE ? ESCAPE ?
*/ SqlBuffer buildLikeSql(LikeValue fieldValue); /** * 生成LIKE SQL语句 * * @param fieldValue 字段值, 不支持LikeValue * @return LIKE SQL语句
* ORACLE: LIKE ( ? ||'%')
* MYSQL : LIKE CONCAT( ?, '%')
*/ SqlBuffer buildStartsWithSql(String fieldValue); /** * 生成LIKE SQL语句 * * @param fieldValue 字段值, 不支持LikeValue * @return LIKE SQL语句
* ORACLE: LIKE ('%'|| ? )
* MYSQL : LIKE CONCAT('%', ? )
*/ SqlBuffer buildEndsWithSql(String fieldValue); /** * SqlDialect创建接口 * * @author zhaohuihua * @version 20201018 */ interface Creator { /** * 根据数据库版本创建SQL方言处理对象 * * @param version 数据库版本 * @return SQL方言处理对象 */ SqlDialect create(DbVersion version); } /** * SqlDialect创建接口的SimpleSqlDialect实现类 * * @author zhaohuihua * @version 20201018 */ abstract class CacheCreator implements SqlDialect.Creator { // key=DbVersionCode private final Map sqlDialectMaps = new HashMap<>(); @Override public SqlDialect create(DbVersion version) { String versionCode = version.toVersionString(); if (sqlDialectMaps.containsKey(versionCode)) { return sqlDialectMaps.get(versionCode); } else { SqlDialect dialect = newSqlDialect(version); sqlDialectMaps.put(versionCode, dialect); return dialect; } } /** 根据DbVersion生成SqlDialect **/ protected abstract SqlDialect newSqlDialect(DbVersion version); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy