6363import zuo .biao .apijson .StringUtil ;
6464import zuo .biao .apijson .server .exception .NotExistException ;
6565import zuo .biao .apijson .server .model .Column ;
66+ import zuo .biao .apijson .server .model .ExtendedProperty ;
6667import zuo .biao .apijson .server .model .PgAttribute ;
6768import zuo .biao .apijson .server .model .PgClass ;
69+ import zuo .biao .apijson .server .model .SysColumn ;
70+ import zuo .biao .apijson .server .model .SysTable ;
6871import zuo .biao .apijson .server .model .Table ;
6972
7073/**config sql for JSON Request
7376public abstract class AbstractSQLConfig implements SQLConfig {
7477 private static final String TAG = "AbstractSQLConfig" ;
7578
79+ public static String DEFAULT_DATABASE = DATABASE_MYSQL ;
7680 public static String DEFAULT_SCHEMA = "sys" ;
7781 public static String PREFFIX_DISTINCT = "DISTINCT " ;
7882
@@ -85,16 +89,20 @@ public abstract class AbstractSQLConfig implements SQLConfig {
8589 TABLE_KEY_MAP = new HashMap <String , String >();
8690 TABLE_KEY_MAP .put (Table .class .getSimpleName (), Table .TABLE_NAME );
8791 TABLE_KEY_MAP .put (Column .class .getSimpleName (), Column .TABLE_NAME );
88- TABLE_KEY_MAP .put (PgAttribute .class .getSimpleName (), PgAttribute .TABLE_NAME );
8992 TABLE_KEY_MAP .put (PgClass .class .getSimpleName (), PgClass .TABLE_NAME );
93+ TABLE_KEY_MAP .put (PgAttribute .class .getSimpleName (), PgAttribute .TABLE_NAME );
94+ TABLE_KEY_MAP .put (SysTable .class .getSimpleName (), SysTable .TABLE_NAME );
95+ TABLE_KEY_MAP .put (SysColumn .class .getSimpleName (), SysColumn .TABLE_NAME );
96+ TABLE_KEY_MAP .put (ExtendedProperty .class .getSimpleName (), ExtendedProperty .TABLE_NAME );
9097
9198 DATABASE_LIST = new ArrayList <>();
9299 DATABASE_LIST .add (DATABASE_MYSQL );
93100 DATABASE_LIST .add (DATABASE_POSTGRESQL );
94101 DATABASE_LIST .add (DATABASE_SQLSERVER );
95102 DATABASE_LIST .add (DATABASE_ORACLE );
96103 }
97-
104+
105+
98106 @ NotNull
99107 @ Override
100108 public String getIdKey () {
@@ -243,30 +251,75 @@ public SQLConfig setDatabase(String database) {
243251 this .database = database ;
244252 return this ;
245253 }
246-
254+ /**
255+ * @return db == null ? DEFAULT_DATABASE : db
256+ */
257+ @ NotNull
258+ public String getSQLDatabase () {
259+ String db = getDatabase ();
260+ return db == null ? DEFAULT_DATABASE : db ; // "" 表示已设置,不需要用全局默认的 StringUtil.isEmpty(db, false)) {
261+ }
262+
263+ @ Override
264+ public boolean isMySQL () {
265+ return isMySQL (getSQLDatabase ());
266+ }
267+ public static boolean isMySQL (String db ) {
268+ return DATABASE_MYSQL .equals (db );
269+ }
270+ @ Override
271+ public boolean isPostgreSQL () {
272+ return isPostgreSQL (getSQLDatabase ());
273+ }
274+ public static boolean isPostgreSQL (String db ) {
275+ return DATABASE_POSTGRESQL .equals (db );
276+ }
277+ @ Override
278+ public boolean isSQLServer () {
279+ return isSQLServer (getSQLDatabase ());
280+ }
281+ public static boolean isSQLServer (String db ) {
282+ return DATABASE_SQLSERVER .equals (db );
283+ }
284+ @ Override
285+ public boolean isOracle () {
286+ return isOracle (getSQLDatabase ());
287+ }
288+ public static boolean isOracle (String db ) {
289+ return DATABASE_ORACLE .equals (db );
290+ }
291+
247292 @ Override
248293 public String getQuote () {
249- String db = getDatabase ();
250- return StringUtil .isEmpty (db , true ) || DATABASE_MYSQL .equals (db ) ? "`" : "\" " ;
294+ return isMySQL () ? "`" : "\" " ;
251295 }
252296
253297 @ Override
254298 public String getSchema () {
255299 return schema ;
256300 }
257- public String getSQLSchema (String sqlTable ) {
258- //强制,避免因为全局默认的 @schema 自动填充进来,导致这几个类的 schema 为 sys 等其它值
259- if ((Table .TABLE_NAME .equals (sqlTable ) || Column .TABLE_NAME .equals (sqlTable )) ) {
260- return SCHEMA_INFORMATION ;
261- }
262- if ((PgAttribute .TABLE_NAME .equals (sqlTable ) || PgClass .TABLE_NAME .equals (sqlTable )) ) {
263- return "" ;
264- }
265-
301+ /**
302+ * @param sqlTable
303+ * @return
304+ */
305+ @ NotNull
306+ public String getSQLSchema (String table ) {
266307 String sch = getSchema ();
267308 if (sch == null ) { //PostgreSQL 的 pg_class 和 pg_attribute 表好像不属于任何 Schema StringUtil.isEmpty(sch, true)) {
268- sch = DEFAULT_SCHEMA ;
309+ //不能强制,SQL Server 在 information_schema 和 sys 中都有 tables 和 columns //强制,避免因为全局默认的 @schema 自动填充进来,导致这几个类的 schema 为 sys 等其它值
310+ if (Table .TAG .equals (table ) || Column .TAG .equals (table )) {
311+ return SCHEMA_INFORMATION ; //MySQL, PostgreSQL, SQL Server 都有的
312+ }
313+ if (SysTable .TAG .equals (table ) || SysColumn .TAG .equals (table )) {
314+ return SCHEMA_SYS ; //SQL Server 在 sys 中的属性比 information_schema 中的要全,能拿到注释
315+ }
316+ if ((PgAttribute .TAG .equals (table ) || PgClass .TAG .equals (table )) ) {
317+ return "" ; //PostgreSQL 的 pg_class 和 pg_attribute 表好像不属于任何 Schema
318+ }
319+
320+ return DEFAULT_SCHEMA ;
269321 }
322+
270323 return sch ;
271324 }
272325 @ Override
@@ -549,15 +602,14 @@ public String getOrderString(boolean hasPrefix) {
549602
550603
551604 String order = StringUtil .getTrimedString (getOrder ());
552- String db = getDatabase ();
553605
554- if (DATABASE_ORACLE . equals ( db ) || DATABASE_SQLSERVER . equals ( db )) { // Oracle 和 SQL Server 的 OFFSET 必须加 ORDER BY
606+ if (isOracle ( ) || isSQLServer ( )) { // Oracle 和 SQL Server 的 OFFSET 必须加 ORDER BY
555607
556608 // String[] ss = StringUtil.split(order);
557609 if (StringUtil .isEmpty (order , true )) {
558610 String idKey = getIdKey ();
559611 if (StringUtil .isEmpty (idKey , true )) {
560- idKey = "id" ;
612+ idKey = "id" ; //ORDER BY NULL 不行,SQL Server 会报错,必须要有排序,才能使用 OFFSET FETCH,如果没有 idKey,请求中指定 @order 即可
561613 }
562614 order = idKey ; //让数据库调控默认升序还是降序 + "+";
563615 }
@@ -1052,16 +1104,16 @@ public String getLimitString() {
10521104 if (count <= 0 || RequestMethod .isHeadMethod (getMethod (), true )) {
10531105 return "" ;
10541106 }
1055- return getLimitString (getPage (), getCount (), getDatabase ());
1107+ return getLimitString (getPage (), getCount (), isOracle () || isSQLServer ());
10561108 }
10571109 /**获取限制数量
10581110 * @param limit
10591111 * @return
10601112 */
1061- public static String getLimitString (int page , int count , String db ) {
1113+ public static String getLimitString (int page , int count , boolean isTSQL ) {
10621114 int offset = getOffset (page , count );
10631115
1064- if (DATABASE_ORACLE . equals ( db ) || DATABASE_SQLSERVER . equals ( db ) ) {
1116+ if (isTSQL ) {
10651117 return " OFFSET " + offset + " ROWS FETCH FIRST " + count + " ROWS ONLY" ;
10661118 }
10671119
@@ -1605,7 +1657,7 @@ public String getRegExpString(String key, Object[] values, int type, boolean ign
16051657 */
16061658 @ JSONField (serialize = false )
16071659 public String getRegExpString (String key , String value , boolean ignoreCase ) {
1608- if (DATABASE_POSTGRESQL . equals ( getDatabase () )) {
1660+ if (isPostgreSQL ( )) {
16091661 return getKey (key ) + " ~" + (ignoreCase ? "* " : " " ) + getValue (value );
16101662 }
16111663 return getKey (key ) + " REGEXP " + (ignoreCase ? "" : "BINARY " ) + getValue (value );
@@ -1840,7 +1892,7 @@ public String getContainString(String key, Object[] childs, int type) throws Ill
18401892 throw new IllegalArgumentException (key + "<>:value 中value类型不能为JSON!" );
18411893 }
18421894
1843- if (DATABASE_POSTGRESQL . equals ( getDatabase () )) {
1895+ if (isPostgreSQL ( )) {
18441896 condition += (i <= 0 ? "" : (Logic .isAnd (type ) ? AND : OR ))
18451897 + getKey (key ) + " @> " + getValue (newJSONArray (childs [i ])); //operator does not exist: jsonb @> character varying "[" + childs[i] + "]");
18461898 } else {
0 commit comments