Skip to content

Commit f305548

Browse files
committed
Java:完善兼容 APIJSON 5.0.0+ 对接 Oracle DATETIME, TIMESTAMP 等日期时间类型
1 parent 2172d4f commit f305548

File tree

4 files changed

+85
-63
lines changed

4 files changed

+85
-63
lines changed

APIJSON-Java-Server/APIJSONBoot-BigData/src/main/java/apijson/demo/DemoSQLConfig.java

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public String getUserIdKey(String database, String schema, String datasource, St
101101

102102
// 自定义原始 SQL 片段,其它功能满足不了时才用它,只有 RAW_MAP 配置了的 key 才允许前端传
103103
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"
104105
RAW_MAP.put("to.momentId", "`to`.`momentId`"); // 最终以 `to`.`userId` 拼接 SQL,相比以上写法可以让前端写起来更简单
105106
RAW_MAP.put("(`Comment`.`userId`=`to`.`userId`)", ""); // 已经是一个条件表达式了,用 () 包裹是为了避免 JSON 中的 key 拼接在前面导致 SQL 出错
106107
RAW_MAP.put("sum(if(userId%2=0,1,0))", ""); // 超过单个函数的 SQL 表达式
@@ -276,25 +277,25 @@ public String getDBPassword() {
276277
// }
277278

278279
// 取消注释来兼容 Oracle DATETIME, TIMESTAMP 等日期时间类型的值来写库。5.0.0+ 重写以下方法,4.9.1 及以下改为重写 getValue(String)
279-
// @Override
280-
// protected Object getValue(String key, String column, Object value) {
281-
// if (isOracle() && RequestMethod.isQueryMethod(getMethod()) == false && value instanceof String) {
282-
// try {
283-
// SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
284-
// parser.parse((String) value);
285-
// if (isPrepared()) {
286-
// preparedValueList.add(value);
287-
// }
288-
// return "to_date(" + (isPrepared() ? "?" : getSQLValue(value)) + ",'yyyy-mm-dd hh24:mi:ss')";
289-
// }
290-
// catch (Throwable e) {
291-
// if (Log.DEBUG) {
292-
// e.printStackTrace();
293-
// }
294-
// }
295-
// }
296-
// return super.getValue(key, column, value);
297-
// }
280+
// @Override // 如果是查询,可以把 if 内 isQueryMethod 的判断去掉或者 boolean 值取反。
281+
// protected Object getValue(String key, String column, Object value) {
282+
// if (isOracle() && RequestMethod.isQueryMethod(getMethod()) == false && value instanceof String) {
283+
// try {
284+
// SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
285+
// parser.parse((String) value);
286+
// if (isPrepared()) {
287+
// preparedValueList.add(value);
288+
// }
289+
// return "to_date(" + (isPrepared() ? "?" : getSQLValue(value)) + ",'yyyy-mm-dd hh24:mi:ss')";
290+
// }
291+
// catch (Throwable e) {
292+
// if (Log.DEBUG) {
293+
// e.printStackTrace();
294+
// }
295+
// }
296+
// }
297+
// return super.getValue(key, column, value);
298+
// }
298299

299300

300301
@Override

APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/demo/DemoSQLConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ public String getUserIdKey(String database, String schema, String datasource, St
102102

103103
// 自定义原始 SQL 片段,其它功能满足不了时才用它,只有 RAW_MAP 配置了的 key 才允许前端传
104104
RAW_MAP.put("`to`.`id`", ""); // 空字符串 "" 表示用 key 的值 `to`.`id`
105+
RAW_MAP.put("toDate", ""); // "@column": "date;date_format('2020-01-01','%Y-%m-%d'):toDate", "@having": "(date > toDate)", "@raw": "@column,@having"
105106
RAW_MAP.put("to.momentId", "`to`.`momentId`"); // 最终以 `to`.`userId` 拼接 SQL,相比以上写法可以让前端写起来更简单
106107
RAW_MAP.put("(`Comment`.`userId`=`to`.`userId`)", ""); // 已经是一个条件表达式了,用 () 包裹是为了避免 JSON 中的 key 拼接在前面导致 SQL 出错
107108
RAW_MAP.put("sum(if(userId%2=0,1,0))", ""); // 超过单个函数的 SQL 表达式
@@ -344,7 +345,7 @@ public String getDBPassword() {
344345
// }
345346

346347
// 取消注释来兼容 Oracle DATETIME, TIMESTAMP 等日期时间类型的值来写库。5.0.0+ 重写以下方法,4.9.1 及以下改为重写 getValue(String)
347-
// @Override
348+
// @Override // 如果是查询,可以把 if 内 isQueryMethod 的判断去掉或者 boolean 值取反。
348349
// protected Object getValue(String key, String column, Object value) {
349350
// if (isOracle() && RequestMethod.isQueryMethod(getMethod()) == false && value instanceof String) {
350351
// try {

APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public String getUserIdKey(String database, String schema, String datasource, St
101101

102102
// 自定义原始 SQL 片段,其它功能满足不了时才用它,只有 RAW_MAP 配置了的 key 才允许前端传
103103
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"
104105
RAW_MAP.put("to.momentId", "`to`.`momentId`"); // 最终以 `to`.`userId` 拼接 SQL,相比以上写法可以让前端写起来更简单
105106
RAW_MAP.put("(`Comment`.`userId`=`to`.`userId`)", ""); // 已经是一个条件表达式了,用 () 包裹是为了避免 JSON 中的 key 拼接在前面导致 SQL 出错
106107
RAW_MAP.put("sum(if(userId%2=0,1,0))", ""); // 超过单个函数的 SQL 表达式
@@ -291,25 +292,25 @@ public String getDBPassword() {
291292
// }
292293

293294
// 取消注释来兼容 Oracle DATETIME, TIMESTAMP 等日期时间类型的值来写库。5.0.0+ 重写以下方法,4.9.1 及以下改为重写 getValue(String)
294-
// @Override
295-
// protected Object getValue(String key, String column, Object value) {
296-
// if (isOracle() && RequestMethod.isQueryMethod(getMethod()) == false && value instanceof String) {
297-
// try {
298-
// SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
299-
// parser.parse((String) value);
300-
// if (isPrepared()) {
301-
// preparedValueList.add(value);
302-
// }
303-
// return "to_date(" + (isPrepared() ? "?" : getSQLValue(value)) + ",'yyyy-mm-dd hh24:mi:ss')";
295+
// @Override // 如果是查询,可以把 if 内 isQueryMethod 的判断去掉或者 boolean 值取反。
296+
// protected Object getValue(String key, String column, Object value) {
297+
// if (isOracle() && RequestMethod.isQueryMethod(getMethod()) == false && value instanceof String) {
298+
// try {
299+
// SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
300+
// parser.parse((String) value);
301+
// if (isPrepared()) {
302+
// preparedValueList.add(value);
304303
// }
305-
// catch (Throwable e) {
306-
// if (Log.DEBUG) {
307-
// e.printStackTrace();
308-
// }
304+
// return "to_date(" + (isPrepared() ? "?" : getSQLValue(value)) + ",'yyyy-mm-dd hh24:mi:ss')";
305+
// }
306+
// catch (Throwable e) {
307+
// if (Log.DEBUG) {
308+
// e.printStackTrace();
309309
// }
310310
// }
311-
// return super.getValue(key, column, value);
312311
// }
312+
// return super.getValue(key, column, value);
313+
// }
313314

314315

315316
@Override

APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoSQLConfig.java

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,17 @@
2020
import static apijson.framework.APIJSONConstant.USER_ID;
2121

2222
import java.text.SimpleDateFormat;
23+
import java.util.Arrays;
24+
import java.util.HashMap;
2325
import java.util.List;
26+
import java.util.Map;
2427

2528
import apijson.Log;
2629
import com.alibaba.fastjson.annotation.JSONField;
2730

2831
import apijson.RequestMethod;
32+
import apijson.StringUtil;
33+
import apijson.column.ColumnUtil;
2934
import apijson.framework.APIJSONSQLConfig;
3035
import apijson.orm.AbstractSQLConfig;
3136
import apijson.orm.Join;
@@ -34,7 +39,7 @@
3439

3540
/**SQL配置
3641
* TiDB 用法和 MySQL 一致
37-
* 具体见详细的说明文档 C.开发说明 C-1-1.修改数据库链接
42+
* 具体见详细的说明文档 C.开发说明 C-1-1.修改数据库链接
3843
* 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
3944
* @author Lemon
4045
*/
@@ -49,19 +54,19 @@ public DemoSQLConfig(RequestMethod method, String table) {
4954

5055
static {
5156
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:
5358

5459
// 表名和数据库不一致的,需要配置映射关系。只使用 APIJSONORM 时才需要;
55-
// 这个 Demo 用了 apijson-framework 且调用了 APIJSONApplication.init 则不需要
60+
// 如果用了 apijson-framework 且调用了 APIJSONApplication.init 则不需要
5661
// (间接调用 DemoVerifier.init 方法读取数据库 Access 表来替代手动输入配置)。
5762
// 但如果 Access 这张表的对外表名与数据库实际表名不一致,仍然需要这里注册。例如
5863
// TABLE_KEY_MAP.put(Access.class.getSimpleName(), "access");
5964

60-
//表名映射,隐藏真实表名,对安全要求很高的表可以这么做
65+
// 表名映射,隐藏真实表名,对安全要求很高的表可以这么做
6166
// TABLE_KEY_MAP.put(User.class.getSimpleName(), "apijson_user");
6267
// TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy");
6368

64-
//主键名映射
69+
// 主键名映射
6570
SIMPLE_CALLBACK = new SimpleCallback<Long>() {
6671

6772
@Override
@@ -82,7 +87,7 @@ public String getUserIdKey(String database, String schema, String datasource, St
8287
return USER_.equals(table) || PRIVACY_.equals(table) ? ID : USER_ID; // id / userId
8388
}
8489

85-
//取消注释来实现数据库自增 id
90+
// 取消注释来实现数据库自增 id
8691
// @Override
8792
// public Long newId(RequestMethod method, String database, String schema, String datasource, String table) {
8893
// return null; // return null 则不生成 id,一般用于数据库自增 id
@@ -96,15 +101,16 @@ public String getUserIdKey(String database, String schema, String datasource, St
96101

97102
// 自定义原始 SQL 片段,其它功能满足不了时才用它,只有 RAW_MAP 配置了的 key 才允许前端传
98103
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"
99105
RAW_MAP.put("to.momentId", "`to`.`momentId`"); // 最终以 `to`.`userId` 拼接 SQL,相比以上写法可以让前端写起来更简单
100106
RAW_MAP.put("(`Comment`.`userId`=`to`.`userId`)", ""); // 已经是一个条件表达式了,用 () 包裹是为了避免 JSON 中的 key 拼接在前面导致 SQL 出错
101107
RAW_MAP.put("sum(if(userId%2=0,1,0))", ""); // 超过单个函数的 SQL 表达式
102108
RAW_MAP.put("sumUserIdIsEven", "sum(if(`userId`%2=0,1,0)) AS sumUserIdIsEven"); // 简化前端传参
103109
RAW_MAP.put("substring_index(substring_index(content,',',1),',',-1)", ""); // APIAuto 不支持 ',可以用 Postman 测
104110
RAW_MAP.put("substring_index(substring_index(content,'.',1),'.',-1) AS subContent", ""); // APIAuto 不支持 ',可以用 Postman 测
105111
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 使用
108114

109115
}
110116

@@ -128,6 +134,9 @@ public String getDBVersion() {
128134
if (isDb2()) {
129135
return "11.5"; //TODO 改成你自己的
130136
}
137+
if (isTDengine()) {
138+
return "2.6.0.8"; //TODO 改成你自己的
139+
}
131140
return null;
132141
}
133142

@@ -151,6 +160,10 @@ public String getDBUri() {
151160
if (isDb2()) {
152161
return "jdbc:db2://localhost:50000/BLUDB"; //TODO 改成你自己的
153162
}
163+
if (isTDengine()) {
164+
// return "jdbc:TAOS://localhost:6030"; //TODO 改成你自己的
165+
return "jdbc:TAOS-RS://localhost:6041"; //TODO 改成你自己的
166+
}
154167
return null;
155168
}
156169

@@ -172,6 +185,9 @@ public String getDBAccount() {
172185
if (isDb2()) {
173186
return "db2admin"; //TODO 改成你自己的
174187
}
188+
if (isTDengine()) {
189+
return "root"; //TODO 改成你自己的
190+
}
175191
return null;
176192
}
177193

@@ -193,10 +209,13 @@ public String getDBPassword() {
193209
if (isDb2()) {
194210
return "123"; //TODO 改成你自己的
195211
}
212+
if (isTDengine()) {
213+
return "taosdata"; //TODO 改成你自己的
214+
}
196215
return null;
197216
}
198217

199-
//取消注释后,默认的 APIJSON 配置表会由业务表所在 数据库类型 database 和 数据库模式 schema 改为自定义的
218+
// 取消注释后,默认的 APIJSON 配置表会由业务表所在 数据库类型 database 和 数据库模式 schema 改为自定义的
200219
// @Override
201220
// public String getConfigDatabase() {
202221
// return DATABASE_POSTGRESQL;
@@ -206,14 +225,14 @@ public String getDBPassword() {
206225
// return "apijson";
207226
// }
208227

209-
//取消注释后,默认的数据库类型会由 MySQL 改为 PostgreSQL
228+
// 取消注释后,默认的数据库类型会由 MySQL 改为 PostgreSQL
210229
// @Override
211230
// public String getDatabase() {
212231
// String db = super.getDatabase();
213232
// return db == null ? DATABASE_POSTGRESQL : db;
214233
// }
215234

216-
//如果确定只用一种数据库,可以重写方法,这种数据库直接 return true,其它数据库直接 return false,来减少判断,提高性能
235+
// 如果确定只用一种数据库,可以重写方法,这种数据库直接 return true,其它数据库直接 return false,来减少判断,提高性能
217236
// @Override
218237
// public boolean isMySQL() {
219238
// return true;
@@ -247,27 +266,27 @@ public String getDBPassword() {
247266
// }
248267

249268
// 取消注释来兼容 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);
260277
// }
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();
265283
// }
266284
// }
267-
// return super.getValue(key, column, value);
268285
// }
269-
270-
286+
// return super.getValue(key, column, value);
287+
// }
288+
289+
271290
@Override
272291
protected void onGetCrossJoinString(Join j) throws UnsupportedOperationException {
273292
// 开启 CROSS JOIN 笛卡尔积联表 super.onGetCrossJoinString(j);

0 commit comments

Comments
 (0)