| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 | package org.jeecg.common.util.dynamic.db;import org.apache.commons.lang.StringUtils;import org.jeecg.common.constant.DataBaseConstant;import org.jeecg.common.system.vo.DynamicDataSourceModel;import java.text.MessageFormat;import java.util.Map;/** * 根据不同的数据库,动态生成SQL,例如分页 */public class SqlUtils {    public static final String DATABSE_TYPE_MYSQL = "mysql";    public static final String DATABSE_TYPE_POSTGRE = "postgresql";    public static final String DATABSE_TYPE_ORACLE = "oracle";    public static final String DATABSE_TYPE_SQLSERVER = "sqlserver";    /**     * 分页SQL     */    public static final String MYSQL_SQL = "select * from ( {0}) sel_tab00 limit {1},{2}";    public static final String POSTGRE_SQL = "select * from ( {0}) sel_tab00 limit {2} offset {1}";    public static final String ORACLE_SQL = "select * from (select row_.*,rownum rownum_ from ({0}) row_ where rownum <= {1}) where rownum_>{2}";    public static final String SQLSERVER_SQL = "select * from ( select row_number() over(order by tempColumn) tempRowNumber, * from (select top {1} tempColumn = 0, {0}) t ) tt where tempRowNumber > {2}";    /**     * 获取所有表的SQL     */    public static final String MYSQL_ALLTABLES_SQL = "select distinct table_name from information_schema.columns where table_schema = {0}";    public static final String POSTGRE__ALLTABLES_SQL = "SELECT distinct c.relname AS  table_name FROM pg_class c";    public static final String ORACLE__ALLTABLES_SQL = "select distinct colstable.table_name as  table_name from user_tab_cols colstable";    public static final String SQLSERVER__ALLTABLES_SQL = "select distinct c.name as  table_name from sys.objects c";    /**     * 获取指定表的所有列名     */    public static final String MYSQL_ALLCOLUMNS_SQL = "select column_name from information_schema.columns where table_name = {0} and table_schema = {1}";    public static final String POSTGRE_ALLCOLUMNS_SQL = "select table_name from information_schema.columns where table_name = {0}";    public static final String ORACLE_ALLCOLUMNS_SQL = "select column_name from all_tab_columns where table_name ={0}";    public static final String SQLSERVER_ALLCOLUMNS_SQL = "select name from syscolumns where id={0}";    /*     * 判断数据库类型     */    public static boolean dbTypeIsMySQL(String dbType) {        return dbTypeIf(dbType, DATABSE_TYPE_MYSQL, DataBaseConstant.DB_TYPE_MYSQL);    }    public static boolean dbTypeIsOracle(String dbType) {        return dbTypeIf(dbType, DATABSE_TYPE_ORACLE, DataBaseConstant.DB_TYPE_ORACLE);    }    public static boolean dbTypeIsSQLServer(String dbType) {        return dbTypeIf(dbType, DATABSE_TYPE_SQLSERVER, DataBaseConstant.DB_TYPE_SQLSERVER);    }    public static boolean dbTypeIsPostgre(String dbType) {        return dbTypeIf(dbType, DATABSE_TYPE_POSTGRE, DataBaseConstant.DB_TYPE_POSTGRESQL);    }    /**     * 判断数据库类型     */    public static boolean dbTypeIf(String dbType, String... correctTypes) {        for (String type : correctTypes) {            if (type.equalsIgnoreCase(dbType)) {                return true;            }        }        return false;    }    /**     * 获取全 SQL     * 拼接 where 条件     *     * @param sql     * @param params     * @return     */    public static String getFullSql(String sql, Map params) {        return getFullSql(sql, params, null, null);    }    /**     * 获取全 SQL     * 拼接 where 条件     * 拼接 order 排序     *     * @param sql     * @param params     * @param orderColumn 排序字段     * @param orderBy     排序方式,只能是 DESC 或 ASC     * @return     */    public static String getFullSql(String sql, Map params, String orderColumn, String orderBy) {        StringBuilder sqlBuilder = new StringBuilder();        sqlBuilder.append("SELECT t.* FROM ( ").append(sql).append(" ) t ");        if (params != null && params.size() >= 1) {            sqlBuilder.append("WHERE 1=1 ");            for (Object key : params.keySet()) {                String value = String.valueOf(params.get(key));                if (StringUtils.isNotBlank(value)) {                    sqlBuilder.append(" AND (").append(key).append(" = N'").append(value).append("')");                }            }            if (StringUtils.isNotBlank(orderColumn) && StringUtils.isNotBlank(orderBy)) {                sqlBuilder.append("ORDER BY ").append(orderColumn).append(" ").append("DESC".equalsIgnoreCase(orderBy) ? "DESC" : "ASC");            }        }        return sqlBuilder.toString();    }    /**     * 获取求数量 SQL     *     * @param sql     * @return     */    public static String getCountSql(String sql) {        return String.format("SELECT COUNT(1) \"total\" FROM ( %s ) temp_count", sql);    }    /**     * 生成分页查询 SQL     *     * @param dbType 数据库类型     * @param sql     * @param page     * @param rows     * @return     */    public static String createPageSqlByDBType(String dbType, String sql, int page, int rows) {        int beginNum = (page - 1) * rows;        Object[] sqlParam = new Object[3];        sqlParam[0] = sql;        sqlParam[1] = String.valueOf(beginNum);        sqlParam[2] = String.valueOf(rows);        if (dbTypeIsMySQL(dbType)) {            sql = MessageFormat.format(MYSQL_SQL, sqlParam);        } else if (dbTypeIsPostgre(dbType)) {            sql = MessageFormat.format(POSTGRE_SQL, sqlParam);        } else {            int beginIndex = (page - 1) * rows;            int endIndex = beginIndex + rows;            sqlParam[2] = Integer.toString(beginIndex);            sqlParam[1] = Integer.toString(endIndex);            if (dbTypeIsOracle(dbType)) {                sql = MessageFormat.format(ORACLE_SQL, sqlParam);            } else if (dbTypeIsSQLServer(dbType)) {                sqlParam[0] = sql.substring(getAfterSelectInsertPoint(sql));                sql = MessageFormat.format(SQLSERVER_SQL, sqlParam);            }        }        return sql;    }    /**     * 生成分页查询 SQL     *     * @param sql     * @param page     * @param rows     * @return     */    public static String createPageSqlByDBKey(String dbKey, String sql, int page, int rows) {        DynamicDataSourceModel dynamicSourceEntity = DataSourceCachePool.getCacheDynamicDataSourceModel(dbKey);        String dbType = dynamicSourceEntity.getDbType();        return createPageSqlByDBType(dbType, sql, page, rows);    }    private static int getAfterSelectInsertPoint(String sql) {        int selectIndex = sql.toLowerCase().indexOf("select");        int selectDistinctIndex = sql.toLowerCase().indexOf("select distinct");        return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6);    }    public static String getAllTableSql(String dbType, Object... params) {        if (StringUtils.isNotEmpty(dbType)) {            if (dbTypeIsMySQL(dbType)) {                return MessageFormat.format(MYSQL_ALLTABLES_SQL, params);            } else if (dbTypeIsOracle(dbType)) {                return ORACLE__ALLTABLES_SQL;            } else if (dbTypeIsPostgre(dbType)) {                return POSTGRE__ALLTABLES_SQL;            } else if (dbTypeIsSQLServer(dbType)) {                return SQLSERVER__ALLTABLES_SQL;            }        }        return null;    }    public static String getAllColumnSQL(String dbType, Object... params) {        if (StringUtils.isNotEmpty(dbType)) {            if (dbTypeIsMySQL(dbType)) {                return MessageFormat.format(MYSQL_ALLCOLUMNS_SQL, params);            } else if (dbTypeIsOracle(dbType)) {                return MessageFormat.format(ORACLE_ALLCOLUMNS_SQL, params);            } else if (dbTypeIsPostgre(dbType)) {                return MessageFormat.format(POSTGRE_ALLCOLUMNS_SQL, params);            } else if (dbTypeIsSQLServer(dbType)) {                return MessageFormat.format(SQLSERVER_ALLCOLUMNS_SQL, params);            }        }        return null;    }}
 |