20
20
import static apijson .framework .APIJSONConstant .USER_ID ;
21
21
22
22
import java .text .SimpleDateFormat ;
23
+ import java .util .Arrays ;
24
+ import java .util .HashMap ;
23
25
import java .util .List ;
26
+ import java .util .Map ;
24
27
25
28
import apijson .Log ;
26
29
import com .alibaba .fastjson .annotation .JSONField ;
27
30
28
31
import apijson .RequestMethod ;
32
+ import apijson .StringUtil ;
33
+ import apijson .column .ColumnUtil ;
29
34
import apijson .framework .APIJSONSQLConfig ;
30
35
import apijson .orm .AbstractSQLConfig ;
31
36
import apijson .orm .Join ;
34
39
35
40
/**SQL配置
36
41
* TiDB 用法和 MySQL 一致
37
- * 具体见详细的说明文档 C.开发说明 C-1-1.修改数据库链接
42
+ * 具体见详细的说明文档 C.开发说明 C-1-1.修改数据库链接
38
43
* https://github.com/Tencent/APIJSON/blob/master/%E8%AF%A6%E7%BB%86%E7%9A%84%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md#c-1-1%E4%BF%AE%E6%94%B9%E6%95%B0%E6%8D%AE%E5%BA%93%E9%93%BE%E6%8E%A5
39
44
* @author Lemon
40
45
*/
@@ -49,19 +54,19 @@ public DemoSQLConfig(RequestMethod method, String table) {
49
54
50
55
static {
51
56
DEFAULT_DATABASE = DATABASE_MYSQL ; //TODO 默认数据库类型,改成你自己的。TiDB, MariaDB, OceanBase 这类兼容 MySQL 的可当做 MySQL 使用
52
- DEFAULT_SCHEMA = "sys" ; //TODO 默认数据库名/模式,改成你自己的,默认情况是 MySQL: sys, PostgreSQL: public , SQL Server: dbo, Oracle:
57
+ DEFAULT_SCHEMA = "sys" ; //TODO 默认数据库名/模式,改成你自己的,默认情况是 MySQL: sys, PostgreSQL: sys , SQL Server: dbo, Oracle:
53
58
54
59
// 表名和数据库不一致的,需要配置映射关系。只使用 APIJSONORM 时才需要;
55
- // 这个 Demo 用了 apijson-framework 且调用了 APIJSONApplication.init 则不需要
60
+ // 如果用了 apijson-framework 且调用了 APIJSONApplication.init 则不需要
56
61
// (间接调用 DemoVerifier.init 方法读取数据库 Access 表来替代手动输入配置)。
57
62
// 但如果 Access 这张表的对外表名与数据库实际表名不一致,仍然需要这里注册。例如
58
63
// TABLE_KEY_MAP.put(Access.class.getSimpleName(), "access");
59
64
60
- //表名映射,隐藏真实表名,对安全要求很高的表可以这么做
65
+ // 表名映射,隐藏真实表名,对安全要求很高的表可以这么做
61
66
// TABLE_KEY_MAP.put(User.class.getSimpleName(), "apijson_user");
62
67
// TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy");
63
68
64
- //主键名映射
69
+ // 主键名映射
65
70
SIMPLE_CALLBACK = new SimpleCallback <Long >() {
66
71
67
72
@ Override
@@ -82,7 +87,7 @@ public String getUserIdKey(String database, String schema, String datasource, St
82
87
return USER_ .equals (table ) || PRIVACY_ .equals (table ) ? ID : USER_ID ; // id / userId
83
88
}
84
89
85
- //取消注释来实现数据库自增 id
90
+ // 取消注释来实现数据库自增 id
86
91
// @Override
87
92
// public Long newId(RequestMethod method, String database, String schema, String datasource, String table) {
88
93
// return null; // return null 则不生成 id,一般用于数据库自增 id
@@ -96,15 +101,16 @@ public String getUserIdKey(String database, String schema, String datasource, St
96
101
97
102
// 自定义原始 SQL 片段,其它功能满足不了时才用它,只有 RAW_MAP 配置了的 key 才允许前端传
98
103
RAW_MAP .put ("`to`.`id`" , "" ); // 空字符串 "" 表示用 key 的值 `to`.`id`
104
+ RAW_MAP .put ("toDate" , "" ); // "@column": "date;date_format('2020-01-01','%Y-%m-%d'):toDate", "@having": "(date > toDate)", "@raw": "@column,@having"
99
105
RAW_MAP .put ("to.momentId" , "`to`.`momentId`" ); // 最终以 `to`.`userId` 拼接 SQL,相比以上写法可以让前端写起来更简单
100
106
RAW_MAP .put ("(`Comment`.`userId`=`to`.`userId`)" , "" ); // 已经是一个条件表达式了,用 () 包裹是为了避免 JSON 中的 key 拼接在前面导致 SQL 出错
101
107
RAW_MAP .put ("sum(if(userId%2=0,1,0))" , "" ); // 超过单个函数的 SQL 表达式
102
108
RAW_MAP .put ("sumUserIdIsEven" , "sum(if(`userId`%2=0,1,0)) AS sumUserIdIsEven" ); // 简化前端传参
103
109
RAW_MAP .put ("substring_index(substring_index(content,',',1),',',-1)" , "" ); // APIAuto 不支持 ',可以用 Postman 测
104
110
RAW_MAP .put ("substring_index(substring_index(content,'.',1),'.',-1) AS subContent" , "" ); // APIAuto 不支持 ',可以用 Postman 测
105
111
RAW_MAP .put ("commentWhereItem1" ,"(`Comment`.`userId` = 38710 AND `Comment`.`momentId` = 470)" );
106
- RAW_MAP .put ("to_days(now())-to_days(`date`)<=7" ,"" ); // 给 @having 使用
107
- RAW_MAP .put ("sexShowStr" ,"CASE sex WHEN 0 THEN '男' WHEN 1 THEN '女' ELSE '其它' END" ); // 给 @having 使用
112
+ RAW_MAP .put ("to_days(now())-to_days(`date`)<=7" , "" ); // 给 @having 使用
113
+ RAW_MAP .put ("sexShowStr" , "CASE sex WHEN 0 THEN '男' WHEN 1 THEN '女' ELSE '其它' END" ); // 给 @having 使用
108
114
109
115
}
110
116
@@ -128,6 +134,9 @@ public String getDBVersion() {
128
134
if (isDb2 ()) {
129
135
return "11.5" ; //TODO 改成你自己的
130
136
}
137
+ if (isTDengine ()) {
138
+ return "2.6.0.8" ; //TODO 改成你自己的
139
+ }
131
140
return null ;
132
141
}
133
142
@@ -151,6 +160,10 @@ public String getDBUri() {
151
160
if (isDb2 ()) {
152
161
return "jdbc:db2://localhost:50000/BLUDB" ; //TODO 改成你自己的
153
162
}
163
+ if (isTDengine ()) {
164
+ // return "jdbc:TAOS://localhost:6030"; //TODO 改成你自己的
165
+ return "jdbc:TAOS-RS://localhost:6041" ; //TODO 改成你自己的
166
+ }
154
167
return null ;
155
168
}
156
169
@@ -172,6 +185,9 @@ public String getDBAccount() {
172
185
if (isDb2 ()) {
173
186
return "db2admin" ; //TODO 改成你自己的
174
187
}
188
+ if (isTDengine ()) {
189
+ return "root" ; //TODO 改成你自己的
190
+ }
175
191
return null ;
176
192
}
177
193
@@ -193,10 +209,13 @@ public String getDBPassword() {
193
209
if (isDb2 ()) {
194
210
return "123" ; //TODO 改成你自己的
195
211
}
212
+ if (isTDengine ()) {
213
+ return "taosdata" ; //TODO 改成你自己的
214
+ }
196
215
return null ;
197
216
}
198
217
199
- //取消注释后,默认的 APIJSON 配置表会由业务表所在 数据库类型 database 和 数据库模式 schema 改为自定义的
218
+ // 取消注释后,默认的 APIJSON 配置表会由业务表所在 数据库类型 database 和 数据库模式 schema 改为自定义的
200
219
// @Override
201
220
// public String getConfigDatabase() {
202
221
// return DATABASE_POSTGRESQL;
@@ -206,14 +225,14 @@ public String getDBPassword() {
206
225
// return "apijson";
207
226
// }
208
227
209
- //取消注释后,默认的数据库类型会由 MySQL 改为 PostgreSQL
228
+ // 取消注释后,默认的数据库类型会由 MySQL 改为 PostgreSQL
210
229
// @Override
211
230
// public String getDatabase() {
212
231
// String db = super.getDatabase();
213
232
// return db == null ? DATABASE_POSTGRESQL : db;
214
233
// }
215
234
216
- //如果确定只用一种数据库,可以重写方法,这种数据库直接 return true,其它数据库直接 return false,来减少判断,提高性能
235
+ // 如果确定只用一种数据库,可以重写方法,这种数据库直接 return true,其它数据库直接 return false,来减少判断,提高性能
217
236
// @Override
218
237
// public boolean isMySQL() {
219
238
// return true;
@@ -247,27 +266,27 @@ public String getDBPassword() {
247
266
// }
248
267
249
268
// 取消注释来兼容 Oracle DATETIME, TIMESTAMP 等日期时间类型的值来写库。5.0.0+ 重写以下方法,4.9.1 及以下改为重写 getValue(String)
250
- // @Override
251
- // protected Object getValue(String key, String column, Object value) {
252
- // if (isOracle() && RequestMethod.isQueryMethod(getMethod()) == false && value instanceof String) {
253
- // try {
254
- // SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
255
- // parser.parse((String) value);
256
- // if (isPrepared()) {
257
- // preparedValueList.add(value);
258
- // }
259
- // return "to_date(" + (isPrepared() ? "?" : getSQLValue(value)) + ",'yyyy-mm-dd hh24:mi:ss')";
269
+ // @Override // 如果是查询,可以把 if 内 isQueryMethod 的判断去掉或者 boolean 值取反。
270
+ // protected Object getValue(String key, String column, Object value) {
271
+ // if (isOracle() && RequestMethod.isQueryMethod(getMethod()) == false && value instanceof String) {
272
+ // try {
273
+ // SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
274
+ // parser.parse((String) value);
275
+ // if (isPrepared()) {
276
+ // preparedValueList.add(value);
260
277
// }
261
- // catch (Throwable e) {
262
- // if (Log.DEBUG) {
263
- // e.printStackTrace();
264
- // }
278
+ // return "to_date(" + (isPrepared() ? "?" : getSQLValue(value)) + ",'yyyy-mm-dd hh24:mi:ss')";
279
+ // }
280
+ // catch (Throwable e) {
281
+ // if (Log.DEBUG) {
282
+ // e.printStackTrace();
265
283
// }
266
284
// }
267
- // return super.getValue(key, column, value);
268
285
// }
269
-
270
-
286
+ // return super.getValue(key, column, value);
287
+ // }
288
+
289
+
271
290
@ Override
272
291
protected void onGetCrossJoinString (Join j ) throws UnsupportedOperationException {
273
292
// 开启 CROSS JOIN 笛卡尔积联表 super.onGetCrossJoinString(j);
0 commit comments