Skip to content

Commit 38678bd

Browse files
committed
Server: APIJSONORM 支持在 column 的 SQL 函数里传非字段参数,可用于时间格式化等;解决对 SQL Server 生成的性能分析语句错误导致拿不到正确的结果
1 parent 9ebc0bd commit 38678bd

File tree

3 files changed

+85
-8
lines changed

3 files changed

+85
-8
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
4+
<output url="file://$MODULE_DIR$/target/classes" />
5+
<output-test url="file://$MODULE_DIR$/target/test-classes" />
6+
<content url="file://$MODULE_DIR$">
7+
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
8+
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
9+
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
10+
<excludeFolder url="file://$MODULE_DIR$/target" />
11+
</content>
12+
<orderEntry type="inheritedJdk" />
13+
<orderEntry type="sourceFolder" forTests="false" />
14+
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.58" level="project" />
15+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:1.4.1.RELEASE" level="project" />
16+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:1.4.1.RELEASE" level="project" />
17+
<orderEntry type="library" name="Maven: org.springframework:spring-context:4.3.3.RELEASE" level="project" />
18+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:1.4.1.RELEASE" level="project" />
19+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:1.4.1.RELEASE" level="project" />
20+
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.1.7" level="project" />
21+
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.1.7" level="project" />
22+
<orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.21" level="project" />
23+
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.21" level="project" />
24+
<orderEntry type="library" name="Maven: org.slf4j:log4j-over-slf4j:1.7.21" level="project" />
25+
<orderEntry type="library" name="Maven: org.springframework:spring-core:4.3.3.RELEASE" level="project" />
26+
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.17" level="project" />
27+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:1.4.1.RELEASE" level="project" />
28+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:1.4.1.RELEASE" level="project" />
29+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:1.4.1.RELEASE" level="project" />
30+
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.2.0" level="project" />
31+
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.2.1" level="project" />
32+
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.1" level="project" />
33+
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.3" level="project" />
34+
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.21" level="project" />
35+
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
36+
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:2.5.0" level="project" />
37+
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:1.10.19" level="project" />
38+
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.1" level="project" />
39+
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
40+
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
41+
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.3.0" level="project" />
42+
<orderEntry type="library" scope="TEST" name="Maven: org.json:json:20140107" level="project" />
43+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:4.3.3.RELEASE" level="project" />
44+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:1.4.1.RELEASE" level="project" />
45+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:1.4.1.RELEASE" level="project" />
46+
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.5" level="project" />
47+
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.5" level="project" />
48+
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.5" level="project" />
49+
<orderEntry type="library" name="Maven: org.hibernate:hibernate-validator:5.2.4.Final" level="project" />
50+
<orderEntry type="library" name="Maven: javax.validation:validation-api:1.1.0.Final" level="project" />
51+
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.0.Final" level="project" />
52+
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.1" level="project" />
53+
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.8.3" level="project" />
54+
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.8.3" level="project" />
55+
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.8.3" level="project" />
56+
<orderEntry type="library" name="Maven: org.springframework:spring-web:4.3.3.RELEASE" level="project" />
57+
<orderEntry type="library" name="Maven: org.springframework:spring-aop:4.3.3.RELEASE" level="project" />
58+
<orderEntry type="library" name="Maven: org.springframework:spring-beans:4.3.3.RELEASE" level="project" />
59+
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:4.3.3.RELEASE" level="project" />
60+
<orderEntry type="library" name="Maven: org.springframework:spring-expression:4.3.3.RELEASE" level="project" />
61+
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.11" level="project" />
62+
<orderEntry type="library" scope="RUNTIME" name="Maven: com.google.protobuf:protobuf-java:2.6.0" level="project" />
63+
<orderEntry type="library" name="Maven: org.postgresql:postgresql:42.2.5" level="project" />
64+
<orderEntry type="library" name="Maven: net.sourceforge.jtds:jtds:1.3.1" level="project" />
65+
</component>
66+
</module>

APIJSON-Java-Server/APIJSONORM/src/main/java/zuo/biao/apijson/server/AbstractSQLConfig.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -856,16 +856,26 @@ public String getColumnString(boolean inSQLJoin) throws Exception {
856856
}
857857
}
858858
else {
859-
if ((StringUtil.isName(origin) == false || origin.startsWith("_"))) {
859+
// if ((StringUtil.isName(origin) == false || origin.startsWith("_"))) {
860+
if (origin.startsWith("_") || PATTERN_FUNCTION.matcher(origin).matches() == false) {
860861
throw new IllegalArgumentException("字符 " + ckeys[j] + " 不合法!"
861862
+ "预编译模式下 @column:\"column0,column1:alias;function0(arg0,arg1,...);function1(...):alias...\""
862-
+ " 中所有 arg 都必须是1个不以 _ 开头的单词!DISTINCT 必须全大写,且后面必须有且只有 1 个空格!其它情况不允许空格!");
863+
+ " 中所有 arg 都必须是1个不以 _ 开头的单词 或者符合正则表达式 " + PATTERN_FUNCTION + " !DISTINCT 必须全大写,且后面必须有且只有 1 个空格!其它情况不允许空格!");
863864
}
864865
}
865866
}
866867

867868
//JOIN 副表不再在外层加副表名前缀 userId AS `Commet.userId`, 而是直接 userId AS `userId`
868-
origin = quote + origin + quote;
869+
if (StringUtil.isNumer(origin)) {
870+
//do nothing
871+
}
872+
else if (StringUtil.isName(origin)) {
873+
origin = quote + origin + quote;
874+
}
875+
else {
876+
origin = getValue(origin).toString();
877+
}
878+
869879
if (isKeyPrefix()) {
870880
ckeys[j] = tableAlias + "." + origin;
871881
// if (isColumn) {
@@ -1764,10 +1774,12 @@ public String getBetweenString(String key, Object start, Object end) throws Ille
17641774

17651775
// * 和 / 不能同时出现,防止 /* */ 段注释! # 和 -- 不能出现,防止行注释! ; 不能出现,防止隔断SQL语句!空格不能出现,防止 CRUD,DROP,SHOW TABLES等语句!
17661776
private static final Pattern PATTERN_RANGE;
1777+
private static final Pattern PATTERN_FUNCTION;
17671778
private static final Pattern PATTERN_HAVING;
17681779
private static final Pattern PATTERN_HAVING_SUFFIX;
17691780
static {
17701781
PATTERN_RANGE = Pattern.compile("^[0-9%!=<>,]+$"); // ^[a-zA-Z0-9_*%!=<>(),"]+$ 导致 exists(select*from(Comment)) 通过!
1782+
PATTERN_FUNCTION = Pattern.compile("^[A-Za-z0-9%-_:!=<> ]+$"); //TODO 改成更好的正则,校验前面为单词,中间为操作符,后面为值
17711783
PATTERN_HAVING = Pattern.compile("^[A-Za-z0-9%!=<>]+$"); //TODO 改成更好的正则,校验前面为单词,中间为操作符,后面为值
17721784
PATTERN_HAVING_SUFFIX = Pattern.compile("^[0-9%!=<>]+$"); // ^[a-zA-Z0-9_*%!=<>(),"]+$ 导致 exists(select*from(Comment)) 通过!
17731785
}
@@ -2137,7 +2149,7 @@ public static String getSQL(AbstractSQLConfig config) throws Exception {
21372149
default:
21382150
config.setPreparedValueList(new ArrayList<Object>());
21392151
String column = config.getColumnString();
2140-
return (config.isExplain() ? (config.isSQLServer() || config.isOracle() ? "SET STATISTICS PROFILE ON;\n" : "EXPLAIN ") : "") + "SELECT " + (config.getCache() == JSONRequest.CACHE_RAM ? "SQL_NO_CACHE " : "") + column + " FROM " + getConditionString(column, tablePath, config);
2152+
return (config.isExplain() ? (config.isSQLServer() || config.isOracle() ? "SET STATISTICS PROFILE ON " : "EXPLAIN ") : "") + "SELECT " + (config.getCache() == JSONRequest.CACHE_RAM ? "SQL_NO_CACHE " : "") + column + " FROM " + getConditionString(column, tablePath, config);
21412153
}
21422154
}
21432155

APIJSON-Java-Server/APIJSONORM/src/main/java/zuo/biao/apijson/server/AbstractSQLExecutor.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ public JSONObject execute(@NotNull SQLConfig config, boolean unknowType) throws
240240
return result;
241241
}
242242

243-
rs = executeQuery(config);
243+
rs = executeQuery(config); //FIXME SQL Server 是一次返回两个结果集,包括查询结果和执行计划,需要 moreResults
244244

245245
if (config.isExplain() == false) { //只有 SELECT 才能 EXPLAIN
246246
executedSQLCount ++;
@@ -660,9 +660,8 @@ public PreparedStatement setArgument(@NotNull SQLConfig config, @NotNull Prepare
660660
return statement;
661661
}
662662

663-
//TODO String 改为 enum Database 解决大小写不一致(MySQL, mysql等)导致创建多余的 Connection
664-
private Map<String, Connection> connectionMap = new HashMap<>();
665-
private Connection connection;
663+
protected Map<String, Connection> connectionMap = new HashMap<>();
664+
protected Connection connection;
666665
@NotNull
667666
@Override
668667
public Connection getConnection(@NotNull SQLConfig config) throws Exception {

0 commit comments

Comments
 (0)