2020import static apijson .framework .APIJSONConstant .USER_ID ;
2121
2222import java .text .SimpleDateFormat ;
23+ import java .util .Arrays ;
24+ import java .util .HashMap ;
2325import java .util .List ;
26+ import java .util .Map ;
2427
2528import apijson .Log ;
2629import com .alibaba .fastjson .annotation .JSONField ;
2730
2831import apijson .RequestMethod ;
32+ import apijson .StringUtil ;
33+ import apijson .column .ColumnUtil ;
2934import apijson .framework .APIJSONSQLConfig ;
3035import apijson .orm .AbstractSQLConfig ;
3136import apijson .orm .Join ;
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