ee57a5b2b33969137d1abbd7d6b82be12745f961.svn-base 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package org.jeecg.common.util.dynamic.db;
  2. import org.apache.commons.lang.StringUtils;
  3. import org.jeecg.common.constant.DataBaseConstant;
  4. import org.jeecg.common.system.vo.DynamicDataSourceModel;
  5. import java.text.MessageFormat;
  6. import java.util.Map;
  7. /**
  8. * 根据不同的数据库,动态生成SQL,例如分页
  9. */
  10. public class SqlUtils {
  11. public static final String DATABSE_TYPE_MYSQL = "mysql";
  12. public static final String DATABSE_TYPE_POSTGRE = "postgresql";
  13. public static final String DATABSE_TYPE_ORACLE = "oracle";
  14. public static final String DATABSE_TYPE_SQLSERVER = "sqlserver";
  15. /**
  16. * 分页SQL
  17. */
  18. public static final String MYSQL_SQL = "select * from ( {0}) sel_tab00 limit {1},{2}";
  19. public static final String POSTGRE_SQL = "select * from ( {0}) sel_tab00 limit {2} offset {1}";
  20. public static final String ORACLE_SQL = "select * from (select row_.*,rownum rownum_ from ({0}) row_ where rownum <= {1}) where rownum_>{2}";
  21. 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}";
  22. /**
  23. * 获取所有表的SQL
  24. */
  25. public static final String MYSQL_ALLTABLES_SQL = "select distinct table_name from information_schema.columns where table_schema = {0}";
  26. public static final String POSTGRE__ALLTABLES_SQL = "SELECT distinct c.relname AS table_name FROM pg_class c";
  27. public static final String ORACLE__ALLTABLES_SQL = "select distinct colstable.table_name as table_name from user_tab_cols colstable";
  28. public static final String SQLSERVER__ALLTABLES_SQL = "select distinct c.name as table_name from sys.objects c";
  29. /**
  30. * 获取指定表的所有列名
  31. */
  32. public static final String MYSQL_ALLCOLUMNS_SQL = "select column_name from information_schema.columns where table_name = {0} and table_schema = {1}";
  33. public static final String POSTGRE_ALLCOLUMNS_SQL = "select table_name from information_schema.columns where table_name = {0}";
  34. public static final String ORACLE_ALLCOLUMNS_SQL = "select column_name from all_tab_columns where table_name ={0}";
  35. public static final String SQLSERVER_ALLCOLUMNS_SQL = "select name from syscolumns where id={0}";
  36. /*
  37. * 判断数据库类型
  38. */
  39. public static boolean dbTypeIsMySQL(String dbType) {
  40. return dbTypeIf(dbType, DATABSE_TYPE_MYSQL, DataBaseConstant.DB_TYPE_MYSQL);
  41. }
  42. public static boolean dbTypeIsOracle(String dbType) {
  43. return dbTypeIf(dbType, DATABSE_TYPE_ORACLE, DataBaseConstant.DB_TYPE_ORACLE);
  44. }
  45. public static boolean dbTypeIsSQLServer(String dbType) {
  46. return dbTypeIf(dbType, DATABSE_TYPE_SQLSERVER, DataBaseConstant.DB_TYPE_SQLSERVER);
  47. }
  48. public static boolean dbTypeIsPostgre(String dbType) {
  49. return dbTypeIf(dbType, DATABSE_TYPE_POSTGRE, DataBaseConstant.DB_TYPE_POSTGRESQL);
  50. }
  51. /**
  52. * 判断数据库类型
  53. */
  54. public static boolean dbTypeIf(String dbType, String... correctTypes) {
  55. for (String type : correctTypes) {
  56. if (type.equalsIgnoreCase(dbType)) {
  57. return true;
  58. }
  59. }
  60. return false;
  61. }
  62. /**
  63. * 获取全 SQL
  64. * 拼接 where 条件
  65. *
  66. * @param sql
  67. * @param params
  68. * @return
  69. */
  70. public static String getFullSql(String sql, Map params) {
  71. return getFullSql(sql, params, null, null);
  72. }
  73. /**
  74. * 获取全 SQL
  75. * 拼接 where 条件
  76. * 拼接 order 排序
  77. *
  78. * @param sql
  79. * @param params
  80. * @param orderColumn 排序字段
  81. * @param orderBy 排序方式,只能是 DESC 或 ASC
  82. * @return
  83. */
  84. public static String getFullSql(String sql, Map params, String orderColumn, String orderBy) {
  85. StringBuilder sqlBuilder = new StringBuilder();
  86. sqlBuilder.append("SELECT t.* FROM ( ").append(sql).append(" ) t ");
  87. if (params != null && params.size() >= 1) {
  88. sqlBuilder.append("WHERE 1=1 ");
  89. for (Object key : params.keySet()) {
  90. String value = String.valueOf(params.get(key));
  91. if (StringUtils.isNotBlank(value)) {
  92. sqlBuilder.append(" AND (").append(key).append(" = N'").append(value).append("')");
  93. }
  94. }
  95. if (StringUtils.isNotBlank(orderColumn) && StringUtils.isNotBlank(orderBy)) {
  96. sqlBuilder.append("ORDER BY ").append(orderColumn).append(" ").append("DESC".equalsIgnoreCase(orderBy) ? "DESC" : "ASC");
  97. }
  98. }
  99. return sqlBuilder.toString();
  100. }
  101. /**
  102. * 获取求数量 SQL
  103. *
  104. * @param sql
  105. * @return
  106. */
  107. public static String getCountSql(String sql) {
  108. return String.format("SELECT COUNT(1) \"total\" FROM ( %s ) temp_count", sql);
  109. }
  110. /**
  111. * 生成分页查询 SQL
  112. *
  113. * @param dbType 数据库类型
  114. * @param sql
  115. * @param page
  116. * @param rows
  117. * @return
  118. */
  119. public static String createPageSqlByDBType(String dbType, String sql, int page, int rows) {
  120. int beginNum = (page - 1) * rows;
  121. Object[] sqlParam = new Object[3];
  122. sqlParam[0] = sql;
  123. sqlParam[1] = String.valueOf(beginNum);
  124. sqlParam[2] = String.valueOf(rows);
  125. if (dbTypeIsMySQL(dbType)) {
  126. sql = MessageFormat.format(MYSQL_SQL, sqlParam);
  127. } else if (dbTypeIsPostgre(dbType)) {
  128. sql = MessageFormat.format(POSTGRE_SQL, sqlParam);
  129. } else {
  130. int beginIndex = (page - 1) * rows;
  131. int endIndex = beginIndex + rows;
  132. sqlParam[2] = Integer.toString(beginIndex);
  133. sqlParam[1] = Integer.toString(endIndex);
  134. if (dbTypeIsOracle(dbType)) {
  135. sql = MessageFormat.format(ORACLE_SQL, sqlParam);
  136. } else if (dbTypeIsSQLServer(dbType)) {
  137. sqlParam[0] = sql.substring(getAfterSelectInsertPoint(sql));
  138. sql = MessageFormat.format(SQLSERVER_SQL, sqlParam);
  139. }
  140. }
  141. return sql;
  142. }
  143. /**
  144. * 生成分页查询 SQL
  145. *
  146. * @param sql
  147. * @param page
  148. * @param rows
  149. * @return
  150. */
  151. public static String createPageSqlByDBKey(String dbKey, String sql, int page, int rows) {
  152. DynamicDataSourceModel dynamicSourceEntity = DataSourceCachePool.getCacheDynamicDataSourceModel(dbKey);
  153. String dbType = dynamicSourceEntity.getDbType();
  154. return createPageSqlByDBType(dbType, sql, page, rows);
  155. }
  156. private static int getAfterSelectInsertPoint(String sql) {
  157. int selectIndex = sql.toLowerCase().indexOf("select");
  158. int selectDistinctIndex = sql.toLowerCase().indexOf("select distinct");
  159. return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6);
  160. }
  161. public static String getAllTableSql(String dbType, Object... params) {
  162. if (StringUtils.isNotEmpty(dbType)) {
  163. if (dbTypeIsMySQL(dbType)) {
  164. return MessageFormat.format(MYSQL_ALLTABLES_SQL, params);
  165. } else if (dbTypeIsOracle(dbType)) {
  166. return ORACLE__ALLTABLES_SQL;
  167. } else if (dbTypeIsPostgre(dbType)) {
  168. return POSTGRE__ALLTABLES_SQL;
  169. } else if (dbTypeIsSQLServer(dbType)) {
  170. return SQLSERVER__ALLTABLES_SQL;
  171. }
  172. }
  173. return null;
  174. }
  175. public static String getAllColumnSQL(String dbType, Object... params) {
  176. if (StringUtils.isNotEmpty(dbType)) {
  177. if (dbTypeIsMySQL(dbType)) {
  178. return MessageFormat.format(MYSQL_ALLCOLUMNS_SQL, params);
  179. } else if (dbTypeIsOracle(dbType)) {
  180. return MessageFormat.format(ORACLE_ALLCOLUMNS_SQL, params);
  181. } else if (dbTypeIsPostgre(dbType)) {
  182. return MessageFormat.format(POSTGRE_ALLCOLUMNS_SQL, params);
  183. } else if (dbTypeIsSQLServer(dbType)) {
  184. return MessageFormat.format(SQLSERVER_ALLCOLUMNS_SQL, params);
  185. }
  186. }
  187. return null;
  188. }
  189. }