diff --git a/.classpath b/.classpath
deleted file mode 100644
index d390ea1..0000000
--- a/.classpath
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/.project b/.project
deleted file mode 100644
index 322cc59..0000000
--- a/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- APIJSONParser
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
- org.eclipse.m2e.core.maven2Nature
-
-
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 4c28b1a..0000000
--- a/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding//src/test/java=UTF-8
-encoding/=UTF-8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 1e9dd93..0000000
--- a/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.7
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index 14b697b..0000000
--- a/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/pom.xml b/pom.xml
index e6ffde5..54ebe2f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,30 +1,54 @@
- 4.0.0
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
- APIJSONParser
- APIJSONParser
- 0.0.1-SNAPSHOT
- jar
+ APIJSONParser
+ APIJSONParser
+ 0.0.1-SNAPSHOT
+ jar
- APIJSONParser
- http://maven.apache.org
+ APIJSONParser
+ http://maven.apache.org
-
- UTF-8
-
+
+ UTF-8
+ UTF-8
+ 1.8
+
-
-
- junit
- junit
- 3.8.1
- test
-
-
- com.alibaba
- fastjson
- 1.2.21
-
-
+
+
+ com.alibaba
+ fastjson
+ 1.2.21
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+
+
+
+ com.google.guava
+ guava
+ 19.0
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${java.version}
+ ${java.version}
+
+
+
+
diff --git a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java
index 83ed32e..99b56bc 100644
--- a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java
+++ b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java
@@ -1,26 +1,37 @@
package zuo.biao.apijson.parser;
import java.math.BigDecimal;
-import java.util.ArrayList;
import java.util.List;
import java.util.Set;
+
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zhangls
+ */
+public class APIJSONProvider extends BaseProvider {
+
+ private final String ALIAS_SPLIT = ":";
+ private static final String AND = " AND ";
+ private static final String OR = " OR ";
+
+ @Getter @Setter
+ private List tableWhiteList = Lists.newArrayList();
+ @Getter @Setter
+ private List tableBlackList = Lists.newArrayList();
+ @Getter @Setter
+ private List columnWhiteList = Lists.newArrayList();
+ @Getter @Setter
+ private List columnBlackList = Lists.newArrayList();
+
+ private JSONObject request;
+
+ private JSONObject join;
-public class APIJSONProvider extends AbstractProvider {
-
- private final String ALIAS_SPLIT = ":";
- private static final String AND = " AND ";
- private static final String OR = " OR ";
-
- private List tableWhiteList = new ArrayList();
- private List tableBlackList = new ArrayList();
- private List columnWhiteList = new ArrayList();
- private List columnBlackList = new ArrayList();
-
- private JSONObject request;
- private JSONObject join;
-
/*
* ==================================
* 通用逻辑
@@ -29,751 +40,751 @@ public class APIJSONProvider extends AbstractProvider {
* 所有操作都会涉及到的内容
*
*/
-
- /**
- * 传入的参数应该是一个通过验证的APIJSON请求
- * @param request
- */
- public APIJSONProvider(JSONObject obj) {
- if(obj == null) {
- error("APIJSONProvider传入的请求不能为空");
- }
- JSONObject tabs = obj.getJSONObject("[]");
- if(tabs == null) {
- this.request = obj;
- }else {
- this.request = tabs;
- this.join = obj.getJSONObject("join");
- }
- }
- /**
- * 解析请求中的表名
- * 表名必须符合:(\w+(:\w+)?)
- * 即:
- * 表名
- * 表名:表别名
- * 两种形式
- */
- @Override
- public List getTables() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- Set tableNames = request.keySet();
- String tableAliasName;
- String tableRealName;
- for(String tableName : tableNames) {
- if(!tableName.matches("(\\w+(:\\w+)?)")) {
- error("表" + tableName + "格式不符合" );
- return null;
- }
- //是否有自定义别名
- if(tableName.contains(ALIAS_SPLIT)) {
- String[] splitArray = tableName.split(ALIAS_SPLIT);
- tableRealName = splitArray[0];
- tableAliasName = splitArray[1];
- }else {
- tableRealName = tableAliasName = tableName;
- }
- validateTable(tableRealName);
- list.add(tableRealName + " " + tableAliasName);
- }
- return list;
- }
+
+ /**
+ * 传入的参数应该是一个通过验证的APIJSON请求
+ *
+ * @param obj
+ */
+ public APIJSONProvider(JSONObject obj) {
+ if (obj == null) {
+ error("APIJSONProvider传入的请求不能为空");
+ }
+
+ JSONObject tabs = obj.getJSONObject("[]");
+ if (tabs == null) {
+ this.request = obj;
+ } else {
+ this.request = tabs;
+ this.join = obj.getJSONObject("join");
+ }
+ }
+
+ /**
+ * 解析请求中的表名
+ * 表名必须符合:(\w+(:\w+)?)
+ * 即:
+ * 表名
+ * 表名:表别名
+ * 两种形式
+ */
+ @Override
+ public List getTables() {
+ List list = Lists.newArrayList();
+ Set tableNames = request.keySet();
+ String tableAliasName;
+ String tableRealName;
+ for (String tableName : tableNames) {
+ if (!tableName.matches("(\\w+(:\\w+)?)")) {
+ error("表" + tableName + "格式不符合");
+ return null;
+ }
+ //是否有自定义别名
+ if (tableName.contains(ALIAS_SPLIT)) {
+ String[] splitArray = tableName.split(ALIAS_SPLIT);
+ tableRealName = splitArray[0];
+ tableAliasName = splitArray[1];
+ } else {
+ tableRealName = tableAliasName = tableName;
+ }
+ validateTable(tableRealName);
+ list.add(tableRealName + " " + tableAliasName);
+ }
+ return list;
+ }
/*
* ==================================
* 查询逻辑
* ==================================
*/
-
- /**
- * 解析请求中的字段
- * 路径:/表名/@column
- * 同时为字段设置好引用的表别名,如: p.id
- * 表名必须符合:(\w+(:\w+)?)
- * 字段值必须符合:
- * 不支持函数的正则:(\w+(:\w+)?)+(\s?,\s?(\w+(:\w+)?)+)*
- * 支持函数的正则:((\w+\(\w+\):\w+|\w+)(:\w+)?)+(\s?,\s?((\w+\(\w+\):\w+|\w+)(:\w+)?)+)*
- * 例:a,b,c或a:a1,b:b1,c
- * 约束:必须要有表名
- * 目前支持函数
- */
- @Override
- public List getSelect() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.SELECT) {
- Set tableNames = request.keySet();
- String tableRealName;
- String tableAliasName;
- for(String tableName : tableNames) {
- //格式检查
- if(!tableName.matches("(\\w+(:\\w+)?)")) {
- error("表" + tableName + "格式不符合" );
- return null;
- }
- //是否有自定义别名
- if(tableName.contains(ALIAS_SPLIT)) {
- tableRealName = tableName.split(ALIAS_SPLIT)[0];
- //填写了表别名
- tableAliasName = tableName.split(ALIAS_SPLIT)[1];
- }else {
- tableRealName = tableAliasName = tableName;
- }
- // 获取请求@column的值
- JSONObject propertis = request.getJSONObject(tableName);
- String columnsValue = propertis.getString("@column");
-
- if(columnsValue == null) {
- validateColumn(tableRealName,"*");
- //没有填写@column字段,默认为全部
- list.add(tableAliasName + ".*");
- }else {
- if(!columnsValue.matches("((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+(\\s?,\\s?((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+)*")) {
- error("字段@column:" + columnsValue + "格式不符合,正确请求如:a,b,c:d或者a,max(d):d,c:e" );
- return null;
- }
- //填写了,则返回tableAliasName.colName或tableAliasName.columnName as columnAliasName
- String[] columnNames = columnsValue.replaceAll("\\s", "").split(",");
- for(String columnName : columnNames) {
- if(columnName.contains(ALIAS_SPLIT)) {
- //填写了字段别名,使用:tableAliasName.columnName as columnAliasName这种类型
- //这里columnRealName有两种情况,如:id或max(id)
- String functionOrColumn = columnName.split(ALIAS_SPLIT)[0];
- if(functionOrColumn.contains("(")) {
- //有函数的字段
- //去掉)
- functionOrColumn = functionOrColumn.replaceAll("\\)", "");
- String[] functionStrs = functionOrColumn.split("\\(");
- String funcitonName = functionStrs[0];
- //要对函数进行控制这这里进行
- //此处省略函数合法性检查的代码...
- String columnRealName = functionStrs[1];
- String columnAliasName = columnName.split(ALIAS_SPLIT)[1];
- validateColumn(tableRealName,columnRealName);
- list.add(funcitonName + "(" + tableAliasName + "." + columnRealName + ")" + " as " + columnAliasName);
- }else {
- //没函数的字段
- String columnRealName = functionOrColumn ;
- String columnAliasName = columnName.split(ALIAS_SPLIT)[1];
- validateColumn(tableRealName,columnRealName);
- list.add(tableAliasName + "." + columnRealName + " as " + columnAliasName);
- }
- }else {
- //使用tableAliasName.columnName类型
- validateColumn(tableRealName,columnName);
- list.add(tableAliasName + "." + columnName);
- }
- }
- }
-
- }
- }
- return list;
- }
- /**
- * 解析请求中的过滤条件
- * 支持以下模式:
- * 单值:"id" : "12" 即id=12
- * 多值:"id&{}" : ">12,<30" 即 id > 12 AND id < 30
- * 多值:"id|{}" : ">12,<30" 即 id > 12 OR id < 30
- * 多值:"id{}" : [1,2,3] 即 id IN (1,2,3)
- * 多值:"id!{}" : [1,2,3] 即 id NOT IN (1,2,3)
- * 模糊:"content~":"keyword" 即字段content包含字符串keyword
- * 模糊:"content$":"%keyword" 同样是模糊查询,%放出来自己操控
- * 正则:"content?":"^[0-9]+$" 后面填写正则即可
- * 外键:"id@":"/外键表/外键字段"
- */
- @Override
- public List getWhere() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- Set tableNames = request.keySet();
- String tableAliasName;
- for(String tableName : tableNames) {
- //是否有自定义别名
- if(tableName.contains(ALIAS_SPLIT)) {
- //填写了表别名
- tableAliasName = tableName.split(ALIAS_SPLIT)[1];
- }else {
- tableAliasName = tableName;
- }
- // 遍历过滤条件
- JSONObject propertis = request.getJSONObject(tableName);
- conditionLoop:for(String condition : propertis.keySet() ) {
- //关键字则跳过
- if(condition.startsWith("@")) {
- continue conditionLoop;
- }
- if(condition.matches("\\w+")) {
- //纯字段名
- if(propertis.get(condition) instanceof Integer ||
- propertis.get(condition) instanceof Float ||
- propertis.get(condition) instanceof Double ||
- propertis.get(condition) instanceof BigDecimal) {
- list.add(tableAliasName + "." + condition + " = " + propertis.get(condition) );
- }else if(propertis.get(condition) instanceof String) {
- list.add(tableAliasName + "." + condition + " = '" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'" );
- }
- }else if(condition.matches("(\\w+(!|&|\\|)?\\{\\})+")) {
-
- //表示这是一个多条件类型
- if(propertis.get(condition) instanceof String) {
- String exp = (String)propertis.get(condition);
- //是否匹配这种类型:<20.3,>3.3,=3.3
- if(!exp.matches("(\\s?(>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)+)+(\\s?,\\s?((>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)))*")) {
- error(condition + "的格式不正确,正确使用方式如: >10,<20");
- return null;
- }
- if(condition.endsWith("|{}")) {
- String[] terms = exp.replaceAll("\\s", "").split(",");
- String columnName = condition.replaceAll("\\|\\{\\}", "");
- String limit = "";
- for(int i = 0; i < terms.length; i++) {
- String term = terms[i];
- if(term.startsWith(">=")) {
- limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", "");
- }else if(term.startsWith("<=")) {
- limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", "");
- }else if(term.startsWith(">")) {
- limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", "");
- }else if(term.startsWith("<")) {
- limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", "");
- }else if(term.startsWith("<>") || term.startsWith("!=") ) {
- limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", "");
- }else if(term.startsWith("=")) {
- limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", "");
- }
- if(terms.length > 1 && (i != (terms.length - 1)))
- limit += OR;
- }
- list.add(limit);
- }else {
- getLastList().add(AND);
- String[] terms = exp.replaceAll("\\s", "").split(",");
- String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", "");
- String limit = "";
- for(int i = 0; i < terms.length; i++) {
- String term = terms[i];
- if(term.startsWith(">=")) {
- limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", "");
- }else if(term.startsWith("<=")) {
- limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", "");
- }else if(term.startsWith(">")) {
- limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", "");
- }else if(term.startsWith("<")) {
- limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", "");
- }else if(term.startsWith("<>") || term.startsWith("!=") ) {
- limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", "");
- }else if(term.startsWith("=")) {
- limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", "");
- }
- if(terms.length > 1 && (i != (terms.length - 1)))
- limit += AND;
- }
- list.add(limit);
-
- }
- }else if(propertis.get(condition) instanceof JSONArray) {
- JSONArray array = (JSONArray)propertis.get(condition);
- //分离出字段名
- String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", "");
- String limit = "";
- if(condition.endsWith("!{}")) {
- if(!array.isEmpty()) {
- for(int i = 0; i < array.size(); i++) {
- Object obj = array.get(i);
- if(i != 0) {
- limit += ", ";
- }
- if( obj instanceof Integer ||
- obj instanceof Float ||
- obj instanceof Double ||
- obj instanceof BigDecimal) {
- limit += obj;
- }else if(obj instanceof String) {
- limit += "'" + ((String)obj).replaceAll("'", "''") + "'";
- }
- }
- list.add(tableAliasName + "." + columnName + " NOT IN [" + limit + "]" );
- }
- }else {
- if(!array.isEmpty()) {
- for(int i = 0; i < array.size(); i++) {
- Object obj = array.get(i);
- if(i != 0) {
- limit += ", ";
- }
- if( obj instanceof Integer ||
- obj instanceof Float ||
- obj instanceof Double ||
- obj instanceof BigDecimal) {
- limit += obj;
- }else if(obj instanceof String) {
- limit += "'" + ((String)obj).replaceAll("'", "''") + "'";
- }
- }
- list.add(tableAliasName + "." + columnName + " IN [" + limit + "]" );
- }
- }
- }
- }else if(condition.matches("\\w+~")) {
- //字符串查询,包含
- if(propertis.get(condition) instanceof String) {
- String exp = (String)propertis.get(condition);
- String columnName = condition.replaceAll("~", "");
- list.add(tableAliasName + "." + columnName + " LIKE '%" + exp.replaceAll("'", "''") + "%'" );
- }else {
- error(condition +"的值必须要是字符串");
- return null;
- }
- }else if(condition.matches("\\w+\\$")) {
- //字符串查询,LIKE
- if(propertis.get(condition) instanceof String) {
- String exp = (String)propertis.get(condition);
- String columnName = condition.replaceAll("\\$", "");
- list.add(tableAliasName + "." + columnName + " LIKE '" + exp.replaceAll("'", "''") + "'" );
- }else {
- error(condition +"的值必须要是字符串");
- return null;
- }
- }else if(condition.matches("\\w+\\?")) {
- //字符串查询,正则
- if(propertis.get(condition) instanceof String) {
- String exp = (String)propertis.get(condition);
- String columnName = condition.replaceAll("\\?", "");
- list.add(" regexp_like(" + tableAliasName + "." + columnName + ",'" + exp.replaceAll("'", "''") + "')" );
- }else {
- error(condition +"的值必须要是字符串");
- return null;
- }
- }else if(condition.matches("\\w+@")) {
- //内连接
- if(propertis.get(condition) instanceof String) {
- String exp = (String)propertis.get(condition);
- String columnName = condition.replaceAll("@", "");
- if(exp.matches("/\\w+/\\w+")) {
- String[] args = exp.split("/");
- String refTable = args[1];
- String refColumn = args[2];
- list.add(refTable + "." + refColumn + " = " + tableAliasName + "." + columnName);
- }else {
- error(condition + "必须符合:\"/表名或别名/字段名\"的形式");
- return null;
- }
- }else {
- error(condition +"的值必须要是字符串");
- return null;
- }
- }
- }
-
-
- }
- return list;
- }
- /**
- * 内连接
- * 请求:"@innerJoin" : ["table1.column1 = table2.column2","table1.column1 = table2.column2"]
- * 编译之后:INNER JOIN table1 ON table1.column1=table2.column2
- */
- @Override
- public List getInnerJoin() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.SELECT) {
- if(join != null && join.get("@innerJoin")!=null) {
- JSONArray stms = join.getJSONArray("@innerJoin");
- for(int i = 0; i < stms.size(); i++) {
- Object obj = stms.get(i);
- if(obj instanceof String) {
- String joinStr = (String)obj;
- if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
- //table1.column1 = table2.column2
- String[] tcs = joinStr.replaceAll("\\s", "").split("=");
- String leftTable = tcs[0].split("\\.")[0];
- String rightTable = tcs[1].split("\\.")[0];
- validateTable(leftTable);
- list.add(leftTable + " ON " + joinStr);
- }else {
- error("@innerJoin的格式必须是:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2");
- return null;
- }
- }else {
- error("@innerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
- return null;
- }
- }
- }
- }
- return list;
- }
- /**
- * 左外连接
- *
- */
- @Override
- public List getLeftOuterJoin() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.SELECT) {
- if(join != null && join.get("@leftOuterJoin")!=null) {
- JSONArray stms = join.getJSONArray("@leftOuterJoin");
- for(int i = 0; i < stms.size(); i++) {
- Object obj = stms.get(i);
- if(obj instanceof String) {
- String joinStr = (String)obj;
- if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
- //table1.column1 = table2.column2
- String[] tcs = joinStr.replaceAll("\\s", "").split("=");
- String leftTable = tcs[0].split("\\.")[0];
- String rightTable = tcs[1].split("\\.")[0];
- validateTable(leftTable);
- list.add(leftTable + " ON " + joinStr);
- }else {
- error("@leftOuterJoin的格式必须是:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2");
- return null;
- }
- }else {
- error("@leftOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
- return null;
- }
- }
- }
- }
- return list;
- }
- /**
- * 右外链接
- */
- @Override
- public List getRightOuterJoin() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.SELECT) {
- if(join != null && join.get("@rightOuterJoin")!=null) {
- JSONArray stms = join.getJSONArray("@rightOuterJoin");
- for(int i = 0; i < stms.size(); i++) {
- Object obj = stms.get(i);
- if(obj instanceof String) {
- String joinStr = (String)obj;
- if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
- //table1.column1 = table2.column2
- String[] tcs = joinStr.replaceAll("\\s", "").split("=");
- String leftTable = tcs[0].split("\\.")[0];
- String rightTable = tcs[1].split("\\.")[0];
- validateTable(leftTable);
- list.add(leftTable + " ON " + joinStr);
- }else {
- error("@rightOuterJoin的格式必须是:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2");
- return null;
- }
- }else {
- error("@rightOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
- return null;
- }
- }
- }
- }
- return list;
- }
- /**
- * join连接
- */
- @Override
- public List getJoin() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.SELECT) {
- if(join != null && join.get("@join")!=null) {
- JSONArray stms = join.getJSONArray("@join");
- for(int i = 0; i < stms.size(); i++) {
- Object obj = stms.get(i);
- if(obj instanceof String) {
- String joinStr = (String)obj;
- if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
- //table1.column1 = table2.column2
- String[] tcs = joinStr.replaceAll("\\s", "").split("=");
- String leftTable = tcs[0].split("\\.")[0];
- String rightTable = tcs[1].split("\\.")[0];
- validateTable(leftTable);
- list.add(leftTable + " ON " + joinStr);
- }else {
- error("@join的格式必须是:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2");
- return null;
- }
- }else {
- error("@join的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
- return null;
- }
- }
- }
- }
- return list;
- }
- /**
- * 外连接
- */
- @Override
- public List getOuterJoin() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.SELECT) {
- if(join != null && join.get("@outerJoin")!=null) {
- JSONArray stms = join.getJSONArray("@join");
- for(int i = 0; i < stms.size(); i++) {
-
- Object obj = stms.get(i);
- if(obj instanceof String) {
- String joinStr = (String)obj;
- if(joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
- //table1.column1 = table2.column2
- String[] tcs = joinStr.replaceAll("\\s", "").split("=");
- String leftTable = tcs[0].split("\\.")[0];
- String rightTable = tcs[1].split("\\.")[0];
- validateTable(leftTable);
- list.add(leftTable + " ON " + joinStr);
- }else {
- error("@outerJoin的格式必须是:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2");
- return null;
- }
- }else {
- error("@outerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
- return null;
- }
- }
- }
- }
- return list;
- }
- /**
- * 解析分组
- * "@group":"store_id"
- */
- @Override
- public List getGroupBy() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.SELECT) {
- Set tableNames = request.keySet();
- String tableAliasName;
- for(String tableName : tableNames) {
- //格式检查
- if(!tableName.matches("(\\w+(:\\w+)?)")) {
- error("表" + tableName + "格式不符合" );
- return null;
- }
- //是否有自定义别名
- if(tableName.contains(ALIAS_SPLIT)) {
- //填写了表别名
- tableAliasName = tableName.split(ALIAS_SPLIT)[1];
- }else {
- tableAliasName = tableName;
- }
- // 获取请求@group的值
- JSONObject propertis = request.getJSONObject(tableName);
- String columnsValue = propertis.getString("@group");
- if(columnsValue != null) {
- if(!columnsValue.matches("\\w+(\\s?,\\s?\\w+)*")) {
- error("字段@group:" + columnsValue + "格式不符合,正确请求如:a,b,c" );
- return null;
- }
- String[] columnNames = columnsValue.replaceAll("\\s", "").split(",");
- for(String colmunName : columnNames) {
- list.add(tableAliasName + "." + colmunName);
- }
- }
-
- }
- }
- return list;
- }
-
- /**
- * 解析排序逻辑
- * column1+,column2-,+表示升序,-表示降序
- */
- @Override
- public List getOrderBy() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.SELECT) {
- Set tableNames = request.keySet();
- String tableAliasName;
- for(String tableName : tableNames) {
- //格式检查
- if(!tableName.matches("(\\w+(:\\w+)?)")) {
- error("表" + tableName + "格式不符合" );
- return null;
- }
- //是否有自定义别名
- if(tableName.contains(ALIAS_SPLIT)) {
- //填写了表别名
- tableAliasName = tableName.split(ALIAS_SPLIT)[1];
- }else {
- tableAliasName = tableName;
- }
- // 获取请求@column的值
- JSONObject propertis = request.getJSONObject(tableName);
- String columnsValue = propertis.getString("@orders");
- if(columnsValue != null) {
- if(!columnsValue.matches("(\\w+(\\+|\\-)?)+(\\s?,\\s?(\\w+(\\+|\\-)?)+)*")) {
- error("字段@orders:" + columnsValue + "格式不符合,正确格式如:column1+,column2-,+表示升序,-表示降序。" );
- return null;
- }
- //没有填写@orders字段,默认为全部
- String[] columnNames = columnsValue.replaceAll("\\s", "").split(",");
- for(String columnName : columnNames) {
- if(columnName.endsWith("+"))
- list.add(tableAliasName + "." + columnName.replaceAll("\\+", "") + " ASC");
- else if (columnName.endsWith("-"))
- list.add(tableAliasName + "." + columnName.replaceAll("\\-", "") + " DESC");
- }
- }
- }
- }
- return list;
- }
+
+ /**
+ * 解析请求中的字段
+ * 路径:/表名/@column
+ * 同时为字段设置好引用的表别名,如: p.id
+ * 表名必须符合:(\w+(:\w+)?)
+ * 字段值必须符合:
+ * 不支持函数的正则:(\w+(:\w+)?)+(\s?,\s?(\w+(:\w+)?)+)*
+ * 支持函数的正则:((\w+\(\w+\):\w+|\w+)(:\w+)?)+(\s?,\s?((\w+\(\w+\):\w+|\w+)(:\w+)?)+)*
+ * 例:a,b,c或a:a1,b:b1,c
+ * 约束:必须要有表名
+ * 目前支持函数
+ */
+ @Override
+ public List getSelect() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.SELECT) {
+ Set tableNames = request.keySet();
+ String tableRealName;
+ String tableAliasName;
+ for (String tableName : tableNames) {
+ //格式检查
+ if (!tableName.matches("(\\w+(:\\w+)?)")) {
+ error("表" + tableName + "格式不符合");
+ return null;
+ }
+ //是否有自定义别名
+ if (tableName.contains(ALIAS_SPLIT)) {
+ tableRealName = tableName.split(ALIAS_SPLIT)[0];
+ //填写了表别名
+ tableAliasName = tableName.split(ALIAS_SPLIT)[1];
+ } else {
+ tableRealName = tableAliasName = tableName;
+ }
+ // 获取请求@column的值
+ JSONObject propertis = request.getJSONObject(tableName);
+ String columnsValue = propertis.getString("@column");
+
+ if (columnsValue == null) {
+ validateColumn(tableRealName, "*");
+ //没有填写@column字段,默认为全部
+ list.add(tableAliasName + ".*");
+ } else {
+ if (!columnsValue.matches("((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+(\\s?,\\s?((\\w+\\(\\w+\\):\\w+|\\w+)(:\\w+)?)+)*")) {
+ error("字段@column:" + columnsValue + "格式不符合,正确请求如:a,b,c:d或者a,max(d):d,c:e");
+ return null;
+ }
+ //填写了,则返回tableAliasName.colName或tableAliasName.columnName as columnAliasName
+ String[] columnNames = columnsValue.replaceAll("\\s", "").split(",");
+ for (String columnName : columnNames) {
+ if (columnName.contains(ALIAS_SPLIT)) {
+ //填写了字段别名,使用:tableAliasName.columnName as columnAliasName这种类型
+ //这里columnRealName有两种情况,如:id或max(id)
+ String functionOrColumn = columnName.split(ALIAS_SPLIT)[0];
+ if (functionOrColumn.contains("(")) {
+ //有函数的字段
+ //去掉)
+ functionOrColumn = functionOrColumn.replaceAll("\\)", "");
+ String[] functionStrs = functionOrColumn.split("\\(");
+ String funcitonName = functionStrs[0];
+ //要对函数进行控制这这里进行
+ //此处省略函数合法性检查的代码...
+ String columnRealName = functionStrs[1];
+ String columnAliasName = columnName.split(ALIAS_SPLIT)[1];
+ validateColumn(tableRealName, columnRealName);
+ list.add(funcitonName + "(" + tableAliasName + "." + columnRealName + ")" + " as " + columnAliasName);
+ } else {
+ //没函数的字段
+ String columnRealName = functionOrColumn;
+ String columnAliasName = columnName.split(ALIAS_SPLIT)[1];
+ validateColumn(tableRealName, columnRealName);
+ list.add(tableAliasName + "." + columnRealName + " as " + columnAliasName);
+ }
+ } else {
+ //使用tableAliasName.columnName类型
+ validateColumn(tableRealName, columnName);
+ list.add(tableAliasName + "." + columnName);
+ }
+ }
+ }
+
+ }
+ }
+ return list;
+ }
+
+ /**
+ * 解析请求中的过滤条件
+ * 支持以下模式:
+ * 单值:"id" : "12" 即id=12
+ * 多值:"id&{}" : ">12,<30" 即 id > 12 AND id < 30
+ * 多值:"id|{}" : ">12,<30" 即 id > 12 OR id < 30
+ * 多值:"id{}" : [1,2,3] 即 id IN (1,2,3)
+ * 多值:"id!{}" : [1,2,3] 即 id NOT IN (1,2,3)
+ * 模糊:"content~":"keyword" 即字段content包含字符串keyword
+ * 模糊:"content$":"%keyword" 同样是模糊查询,%放出来自己操控
+ * 正则:"content?":"^[0-9]+$" 后面填写正则即可
+ * 外键:"id@":"/外键表/外键字段"
+ */
+ @Override
+ public List getWhere() {
+ List list = Lists.newArrayList();
+ Set tableNames = request.keySet();
+ String tableAliasName;
+ for (String tableName : tableNames) {
+ //是否有自定义别名
+ if (tableName.contains(ALIAS_SPLIT)) {
+ //填写了表别名
+ tableAliasName = tableName.split(ALIAS_SPLIT)[1];
+ } else {
+ tableAliasName = tableName;
+ }
+ // 遍历过滤条件
+ JSONObject propertis = request.getJSONObject(tableName);
+ conditionLoop:
+ for (String condition : propertis.keySet()) {
+ //关键字则跳过
+ if (condition.startsWith("@")) {
+ continue conditionLoop;
+ }
+ if (condition.matches("\\w+")) {
+ //纯字段名
+ if (propertis.get(condition) instanceof Integer ||
+ propertis.get(condition) instanceof Float ||
+ propertis.get(condition) instanceof Double ||
+ propertis.get(condition) instanceof BigDecimal) {
+ list.add(tableAliasName + "." + condition + " = " + propertis.get(condition));
+ } else if (propertis.get(condition) instanceof String) {
+ list.add(tableAliasName + "." + condition + " = '" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'");
+ }
+ } else if (condition.matches("(\\w+(!|&|\\|)?\\{\\})+")) {
+
+ //表示这是一个多条件类型
+ if (propertis.get(condition) instanceof String) {
+ String exp = (String) propertis.get(condition);
+ //是否匹配这种类型:<20.3,>3.3,=3.3
+ if (!exp.matches("(\\s?(>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)+)+(\\s?,\\s?((>|<|>=|<=|=|<>)+\\s?((\\-|\\+)?\\d+(\\.\\d+)?)))*")) {
+ error(condition + "的格式不正确,正确使用方式如: >10,<20");
+ return null;
+ }
+ if (condition.endsWith("|{}")) {
+ String[] terms = exp.replaceAll("\\s", "").split(",");
+ String columnName = condition.replaceAll("\\|\\{\\}", "");
+ String limit = "";
+ for (int i = 0; i < terms.length; i++) {
+ String term = terms[i];
+ if (term.startsWith(">=")) {
+ limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", "");
+ } else if (term.startsWith("<=")) {
+ limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", "");
+ } else if (term.startsWith(">")) {
+ limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", "");
+ } else if (term.startsWith("<")) {
+ limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", "");
+ } else if (term.startsWith("<>") || term.startsWith("!=")) {
+ limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", "");
+ } else if (term.startsWith("=")) {
+ limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", "");
+ }
+ if (terms.length > 1 && (i != (terms.length - 1)))
+ limit += OR;
+ }
+ list.add(limit);
+ } else {
+ getLastList().add(AND);
+ String[] terms = exp.replaceAll("\\s", "").split(",");
+ String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", "");
+ String limit = "";
+ for (int i = 0; i < terms.length; i++) {
+ String term = terms[i];
+ if (term.startsWith(">=")) {
+ limit += tableAliasName + "." + columnName + " >= " + term.replaceAll(">=", "");
+ } else if (term.startsWith("<=")) {
+ limit += tableAliasName + "." + columnName + " <= " + term.replaceAll("<=", "");
+ } else if (term.startsWith(">")) {
+ limit += tableAliasName + "." + columnName + " > " + term.replaceAll(">", "");
+ } else if (term.startsWith("<")) {
+ limit += tableAliasName + "." + columnName + " < " + term.replaceAll("<", "");
+ } else if (term.startsWith("<>") || term.startsWith("!=")) {
+ limit += tableAliasName + "." + columnName + " <> " + term.replaceAll("<>", "").replaceAll("!=", "");
+ } else if (term.startsWith("=")) {
+ limit += tableAliasName + "." + columnName + " = " + term.replaceAll("=", "");
+ }
+ if (terms.length > 1 && (i != (terms.length - 1)))
+ limit += AND;
+ }
+ list.add(limit);
+
+ }
+ } else if (propertis.get(condition) instanceof JSONArray) {
+ JSONArray array = (JSONArray) propertis.get(condition);
+ //分离出字段名
+ String columnName = condition.replaceAll("\\{\\}", "").replaceAll("&", "").replaceAll("!", "");
+ String limit = "";
+ if (condition.endsWith("!{}")) {
+ if (!array.isEmpty()) {
+ for (int i = 0; i < array.size(); i++) {
+ Object obj = array.get(i);
+ if (i != 0) {
+ limit += ", ";
+ }
+ if (obj instanceof Integer ||
+ obj instanceof Float ||
+ obj instanceof Double ||
+ obj instanceof BigDecimal) {
+ limit += obj;
+ } else if (obj instanceof String) {
+ limit += "'" + ((String) obj).replaceAll("'", "''") + "'";
+ }
+ }
+ list.add(tableAliasName + "." + columnName + " NOT IN [" + limit + "]");
+ }
+ } else {
+ if (!array.isEmpty()) {
+ for (int i = 0; i < array.size(); i++) {
+ Object obj = array.get(i);
+ if (i != 0) {
+ limit += ", ";
+ }
+ if (obj instanceof Integer ||
+ obj instanceof Float ||
+ obj instanceof Double ||
+ obj instanceof BigDecimal) {
+ limit += obj;
+ } else if (obj instanceof String) {
+ limit += "'" + ((String) obj).replaceAll("'", "''") + "'";
+ }
+ }
+ list.add(tableAliasName + "." + columnName + " IN [" + limit + "]");
+ }
+ }
+ }
+ } else if (condition.matches("\\w+~")) {
+ //字符串查询,包含
+ if (propertis.get(condition) instanceof String) {
+ String exp = (String) propertis.get(condition);
+ String columnName = condition.replaceAll("~", "");
+ list.add(tableAliasName + "." + columnName + " LIKE '%" + exp.replaceAll("'", "''") + "%'");
+ } else {
+ error(condition + "的值必须要是字符串");
+ return null;
+ }
+ } else if (condition.matches("\\w+\\$")) {
+ //字符串查询,LIKE
+ if (propertis.get(condition) instanceof String) {
+ String exp = (String) propertis.get(condition);
+ String columnName = condition.replaceAll("\\$", "");
+ list.add(tableAliasName + "." + columnName + " LIKE '" + exp.replaceAll("'", "''") + "'");
+ } else {
+ error(condition + "的值必须要是字符串");
+ return null;
+ }
+ } else if (condition.matches("\\w+\\?")) {
+ //字符串查询,正则
+ if (propertis.get(condition) instanceof String) {
+ String exp = (String) propertis.get(condition);
+ String columnName = condition.replaceAll("\\?", "");
+ list.add(" regexp_like(" + tableAliasName + "." + columnName + ",'" + exp.replaceAll("'", "''") + "')");
+ } else {
+ error(condition + "的值必须要是字符串");
+ return null;
+ }
+ } else if (condition.matches("\\w+@")) {
+ //内连接
+ if (propertis.get(condition) instanceof String) {
+ String exp = (String) propertis.get(condition);
+ String columnName = condition.replaceAll("@", "");
+ if (exp.matches("/\\w+/\\w+")) {
+ String[] args = exp.split("/");
+ String refTable = args[1];
+ String refColumn = args[2];
+ list.add(refTable + "." + refColumn + " = " + tableAliasName + "." + columnName);
+ } else {
+ error(condition + "必须符合:\"/表名或别名/字段名\"的形式");
+ return null;
+ }
+ } else {
+ error(condition + "的值必须要是字符串");
+ return null;
+ }
+ }
+ }
+
+
+ }
+ return list;
+ }
+
+ /**
+ * 内连接
+ * 请求:"@innerJoin" : ["table1.column1 = table2.column2","table1.column1 = table2.column2"]
+ * 编译之后:INNER JOIN table1 ON table1.column1=table2.column2
+ */
+ @Override
+ public List getInnerJoin() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.SELECT) {
+ if (join != null && join.get("@innerJoin") != null) {
+ JSONArray stms = join.getJSONArray("@innerJoin");
+ for (int i = 0; i < stms.size(); i++) {
+ Object obj = stms.get(i);
+ if (obj instanceof String) {
+ String joinStr = (String) obj;
+ if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
+ //table1.column1 = table2.column2
+ String[] tcs = joinStr.replaceAll("\\s", "").split("=");
+ String leftTable = tcs[0].split("\\.")[0];
+ String rightTable = tcs[1].split("\\.")[0];
+ validateTable(leftTable);
+ list.add(leftTable + " ON " + joinStr);
+ } else {
+ error("@innerJoin的格式必须是:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2");
+ return null;
+ }
+ } else {
+ error("@innerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于INNER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
+ return null;
+ }
+ }
+ }
+ }
+ return list;
+ }
+
+ /**
+ * 左外连接
+ */
+ @Override
+ public List getLeftOuterJoin() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.SELECT) {
+ if (join != null && join.get("@leftOuterJoin") != null) {
+ JSONArray stms = join.getJSONArray("@leftOuterJoin");
+ for (int i = 0; i < stms.size(); i++) {
+ Object obj = stms.get(i);
+ if (obj instanceof String) {
+ String joinStr = (String) obj;
+ if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
+ //table1.column1 = table2.column2
+ String[] tcs = joinStr.replaceAll("\\s", "").split("=");
+ String leftTable = tcs[0].split("\\.")[0];
+ String rightTable = tcs[1].split("\\.")[0];
+ validateTable(leftTable);
+ list.add(leftTable + " ON " + joinStr);
+ } else {
+ error("@leftOuterJoin的格式必须是:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2");
+ return null;
+ }
+ } else {
+ error("@leftOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于LEFT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
+ return null;
+ }
+ }
+ }
+ }
+ return list;
+ }
+
+ /**
+ * 右外链接
+ */
+ @Override
+ public List getRightOuterJoin() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.SELECT) {
+ if (join != null && join.get("@rightOuterJoin") != null) {
+ JSONArray stms = join.getJSONArray("@rightOuterJoin");
+ for (int i = 0; i < stms.size(); i++) {
+ Object obj = stms.get(i);
+ if (obj instanceof String) {
+ String joinStr = (String) obj;
+ if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
+ //table1.column1 = table2.column2
+ String[] tcs = joinStr.replaceAll("\\s", "").split("=");
+ String leftTable = tcs[0].split("\\.")[0];
+ String rightTable = tcs[1].split("\\.")[0];
+ validateTable(leftTable);
+ list.add(leftTable + " ON " + joinStr);
+ } else {
+ error("@rightOuterJoin的格式必须是:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2");
+ return null;
+ }
+ } else {
+ error("@rightOuterJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于RIGHT OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
+ return null;
+ }
+ }
+ }
+ }
+ return list;
+ }
+
+ /**
+ * join连接
+ */
+ @Override
+ public List getJoin() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.SELECT) {
+ if (join != null && join.get("@join") != null) {
+ JSONArray stms = join.getJSONArray("@join");
+ for (int i = 0; i < stms.size(); i++) {
+ Object obj = stms.get(i);
+ if (obj instanceof String) {
+ String joinStr = (String) obj;
+ if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
+ //table1.column1 = table2.column2
+ String[] tcs = joinStr.replaceAll("\\s", "").split("=");
+ String leftTable = tcs[0].split("\\.")[0];
+ String rightTable = tcs[1].split("\\.")[0];
+ validateTable(leftTable);
+ list.add(leftTable + " ON " + joinStr);
+ } else {
+ error("@join的格式必须是:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2");
+ return null;
+ }
+ } else {
+ error("@join的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
+ return null;
+ }
+ }
+ }
+ }
+ return list;
+ }
+
+ /**
+ * 外连接
+ */
+ @Override
+ public List getOuterJoin() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.SELECT) {
+ if (join != null && join.get("@outerJoin") != null) {
+ JSONArray stms = join.getJSONArray("@join");
+ for (int i = 0; i < stms.size(); i++) {
+
+ Object obj = stms.get(i);
+ if (obj instanceof String) {
+ String joinStr = (String) obj;
+ if (joinStr.matches("\\w+\\.\\w+\\s?=\\s?\\w+\\.\\w+")) {
+ //table1.column1 = table2.column2
+ String[] tcs = joinStr.replaceAll("\\s", "").split("=");
+ String leftTable = tcs[0].split("\\.")[0];
+ String rightTable = tcs[1].split("\\.")[0];
+ validateTable(leftTable);
+ list.add(leftTable + " ON " + joinStr);
+ } else {
+ error("@outerJoin的格式必须是:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2");
+ return null;
+ }
+ } else {
+ error("@outerJoin的类型必须是String类型,填写的值如:table1.column1 = table2.column2,相当于OUTER JOIN table1 ON table1.column1=table2.column2。注意:表有别名的应该写表别名");
+ return null;
+ }
+ }
+ }
+ }
+ return list;
+ }
+
+ /**
+ * 解析分组
+ * "@group":"store_id"
+ */
+ @Override
+ public List getGroupBy() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.SELECT) {
+ Set tableNames = request.keySet();
+ String tableAliasName;
+ for (String tableName : tableNames) {
+ //格式检查
+ if (!tableName.matches("(\\w+(:\\w+)?)")) {
+ error("表" + tableName + "格式不符合");
+ return null;
+ }
+ //是否有自定义别名
+ if (tableName.contains(ALIAS_SPLIT)) {
+ //填写了表别名
+ tableAliasName = tableName.split(ALIAS_SPLIT)[1];
+ } else {
+ tableAliasName = tableName;
+ }
+ // 获取请求@group的值
+ JSONObject propertis = request.getJSONObject(tableName);
+ String columnsValue = propertis.getString("@group");
+ if (columnsValue != null) {
+ if (!columnsValue.matches("\\w+(\\s?,\\s?\\w+)*")) {
+ error("字段@group:" + columnsValue + "格式不符合,正确请求如:a,b,c");
+ return null;
+ }
+ String[] columnNames = columnsValue.replaceAll("\\s", "").split(",");
+ for (String colmunName : columnNames) {
+ list.add(tableAliasName + "." + colmunName);
+ }
+ }
+
+ }
+ }
+ return list;
+ }
+
+ /**
+ * 解析排序逻辑
+ * column1+,column2-,+表示升序,-表示降序
+ */
+ @Override
+ public List getOrderBy() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.SELECT) {
+ Set tableNames = request.keySet();
+ String tableAliasName;
+ for (String tableName : tableNames) {
+ //格式检查
+ if (!tableName.matches("(\\w+(:\\w+)?)")) {
+ error("表" + tableName + "格式不符合");
+ return null;
+ }
+ //是否有自定义别名
+ if (tableName.contains(ALIAS_SPLIT)) {
+ //填写了表别名
+ tableAliasName = tableName.split(ALIAS_SPLIT)[1];
+ } else {
+ tableAliasName = tableName;
+ }
+ // 获取请求@column的值
+ JSONObject propertis = request.getJSONObject(tableName);
+ String columnsValue = propertis.getString("@orders");
+ if (columnsValue != null) {
+ if (!columnsValue.matches("(\\w+(\\+|\\-)?)+(\\s?,\\s?(\\w+(\\+|\\-)?)+)*")) {
+ error("字段@orders:" + columnsValue + "格式不符合,正确格式如:column1+,column2-,+表示升序,-表示降序。");
+ return null;
+ }
+ //没有填写@orders字段,默认为全部
+ String[] columnNames = columnsValue.replaceAll("\\s", "").split(",");
+ for (String columnName : columnNames) {
+ if (columnName.endsWith("+")) {
+ list.add(tableAliasName + "." + columnName.replaceAll("\\+", "") + " ASC");
+ } else if (columnName.endsWith("-")) {
+ list.add(tableAliasName + "." + columnName.replaceAll("\\-", "") + " DESC");
+ }
+ }
+ }
+ }
+ }
+ return list;
+ }
/*
* ==================================
* 新增逻辑
* ==================================
*/
-
- @Override
- public List getColumns() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.INSERT) {
- Set tableNames = request.keySet();
- if(tableNames.size()!=1) {
- error("新增时,表只能有一个");
- return null;
- }
- for(String tableName : tableNames) {
- //是否有自定义别名
- if(tableName.contains(ALIAS_SPLIT)) {
- //填写了表别名
- error("新增时,表不需要有别名");
- return null;
- }
- // 遍历过滤条件
- JSONObject propertis = request.getJSONObject(tableName);
- for(String condition : propertis.keySet() ) {
- //关键字则跳过
- if(condition.endsWith("@"))
- continue;
- if(condition.matches("\\w+")) {
- //纯字段名
- validateColumn(tableName,condition);
- list.add(condition);
- }else {
- error("新增时,"+condition+"必须是字段名");
- return null;
- }
- }
-
- }
- }
- return list;
- }
-
- @Override
- public List getValues() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.INSERT) {
- Set tableNames = request.keySet();
- if(tableNames.size()!=1) {
- error("新增时,表只能有一个");
- return null;
- }
- for(String tableName : tableNames) {
- //是否有自定义别名
- if(tableName.contains(ALIAS_SPLIT)) {
- //填写了表别名
- error("新增时,表不需要有别名");
- return null;
- }
- // 遍历过滤条件
- JSONObject propertis = request.getJSONObject(tableName);
- for(String condition : propertis.keySet() ) {
- //关键字则跳过
- if(condition.endsWith("@"))
- continue;
- if(condition.matches("\\w+")) {
- //纯字段名
- if(propertis.get(condition) instanceof Integer ||
- propertis.get(condition) instanceof Float ||
- propertis.get(condition) instanceof Double ||
- propertis.get(condition) instanceof BigDecimal) {
- list.add(propertis.get(condition).toString() );
- }else if(propertis.get(condition) instanceof String) {
- list.add("'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'");
- }
- }else {
- error("新增时,"+condition+"必须是字段名");
- }
- }
-
- }
- }
- return list;
- }
+
+ @Override
+ public List getColumns() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.INSERT) {
+ Set tableNames = request.keySet();
+ if (tableNames.size() != 1) {
+ error("新增时,表只能有一个");
+ return null;
+ }
+ for (String tableName : tableNames) {
+ //是否有自定义别名
+ if (tableName.contains(ALIAS_SPLIT)) {
+ //填写了表别名
+ error("新增时,表不需要有别名");
+ return null;
+ }
+ // 遍历过滤条件
+ JSONObject propertis = request.getJSONObject(tableName);
+ for (String condition : propertis.keySet()) {
+ //关键字则跳过
+ if (condition.endsWith("@")) {
+ continue;
+ }
+ if (condition.matches("\\w+")) {
+ //纯字段名
+ validateColumn(tableName, condition);
+ list.add(condition);
+ } else {
+ error("新增时," + condition + "必须是字段名");
+ return null;
+ }
+ }
+
+ }
+ }
+ return list;
+ }
+
+ @Override
+ public List getValues() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.INSERT) {
+ Set tableNames = request.keySet();
+ if (tableNames.size() != 1) {
+ error("新增时,表只能有一个");
+ return null;
+ }
+ for (String tableName : tableNames) {
+ //是否有自定义别名
+ if (tableName.contains(ALIAS_SPLIT)) {
+ //填写了表别名
+ error("新增时,表不需要有别名");
+ return null;
+ }
+ // 遍历过滤条件
+ JSONObject propertis = request.getJSONObject(tableName);
+ for (String condition : propertis.keySet()) {
+ //关键字则跳过
+ if (condition.endsWith("@")){
+ continue;
+ }
+ if (condition.matches("\\w+")) {
+ //纯字段名
+ if (propertis.get(condition) instanceof Integer ||
+ propertis.get(condition) instanceof Float ||
+ propertis.get(condition) instanceof Double ||
+ propertis.get(condition) instanceof BigDecimal) {
+ list.add(propertis.get(condition).toString());
+ } else if (propertis.get(condition) instanceof String) {
+ list.add("'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'");
+ }
+ } else {
+ error("新增时," + condition + "必须是字段名");
+ }
+ }
+
+ }
+ }
+ return list;
+ }
/*
* ==================================
* 修改逻辑
* ==================================
*/
-
- /**
- * 更新字段
- * "@description": "20190101,元旦快乐"
- * 有@标记的才会更新,否则会被认为是WHERE的条件
- */
- @Override
- public List getSets() {
- // TODO Auto-generated method stub
- List list = new ArrayList<>();
- if(getStatementType() == StatementType.UPDATE) {
- Set tableNames = request.keySet();
- if(tableNames.size()!=1) {
- error("更新时,表只能有一个");
- return null;
- }
- for(String tableName : tableNames) {
- //是否有自定义别名
- if(tableName.contains(ALIAS_SPLIT)) {
- //填写了表别名
- error("更新时,表不需要有别名");
- return null;
- }
- // 遍历过滤条件
- JSONObject propertis = request.getJSONObject(tableName);
- for(String condition : propertis.keySet() ) {
- //关键字则跳过
- if(condition.matches("@\\w+")) {
- //要更新的字段
- String columnName = condition.replaceAll("@", "");
- if(propertis.get(condition) instanceof Integer ||
- propertis.get(condition) instanceof Float ||
- propertis.get(condition) instanceof Double ||
- propertis.get(condition) instanceof BigDecimal) {
- validateColumn(tableName,columnName);
- list.add(tableName + "." + columnName + "=" + propertis.get(condition).toString() );
- }else if(propertis.get(condition) instanceof String) {
- validateColumn(tableName, columnName);
- list.add(tableName + "." + columnName + "=" + "'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'");
- }
- }
- }
-
- }
- }
- return list;
- }
+
+ /**
+ * 更新字段
+ * "@description": "20190101,元旦快乐"
+ * 有@标记的才会更新,否则会被认为是WHERE的条件
+ */
+ @Override
+ public List getSets() {
+ List list = Lists.newArrayList();
+ if (getStatementType() == StatementType.UPDATE) {
+ Set tableNames = request.keySet();
+ if (tableNames.size() != 1) {
+ error("更新时,表只能有一个");
+ return null;
+ }
+ for (String tableName : tableNames) {
+ //是否有自定义别名
+ if (tableName.contains(ALIAS_SPLIT)) {
+ //填写了表别名
+ error("更新时,表不需要有别名");
+ return null;
+ }
+ // 遍历过滤条件
+ JSONObject propertis = request.getJSONObject(tableName);
+ for (String condition : propertis.keySet()) {
+ //关键字则跳过
+ if (condition.matches("@\\w+")) {
+ //要更新的字段
+ String columnName = condition.replaceAll("@", "");
+ if (propertis.get(condition) instanceof Integer ||
+ propertis.get(condition) instanceof Float ||
+ propertis.get(condition) instanceof Double ||
+ propertis.get(condition) instanceof BigDecimal) {
+ validateColumn(tableName, columnName);
+ list.add(tableName + "." + columnName + "=" + propertis.get(condition).toString());
+ } else if (propertis.get(condition) instanceof String) {
+ validateColumn(tableName, columnName);
+ list.add(tableName + "." + columnName + "=" + "'" + ((String) propertis.get(condition)).replaceAll("'", "''") + "'");
+ }
+ }
+ }
+
+ }
+ }
+ return list;
+ }
/*
* ==================================
@@ -795,81 +806,61 @@ public List getSets() {
* 如果想要新增或者修改的更复杂的逻辑,
* 请在外层处理完成之后以制定格式提交该SQL的黑白名单即可
*
- */
- /**
- * 表的黑白名单检查
- * @param tableName
- */
- private void validateTable(String tableName) {
- String tableUCN = tableName.toUpperCase();
- if(tableBlackList != null && !tableBlackList.isEmpty()) {
- for(String tn : tableBlackList) {
- if(tableUCN.equals(tn.toUpperCase())) {
- error("请求的表:" + tableName + "在黑名单中");
- return;
- }
- }
- }
-
- if(tableWhiteList != null && !tableWhiteList.isEmpty()) {
- for(String tn : tableWhiteList) {
- if(tableUCN.equals(tn.toUpperCase())) {
- return;
- }
- }
- error("请求的表:" + tableName + "不在白名单中");
- }
- }
- /**
- * 字段黑白名单检查
- * 要求: "表.列"
- * @param columnName
*/
- private void validateColumn(String tableName, String columnName) {
- String tableUCN = tableName.toUpperCase();
- String columnUCN = columnName.toUpperCase();
- String tcUCN = tableUCN + "." + columnUCN;
- if(columnBlackList != null && !columnBlackList.isEmpty()) {
- for(String tc : columnBlackList) {
- if(tcUCN.equals(tc.toUpperCase())) {
- error("请求的字段:" + tcUCN + "在黑名单中");
- return;
- }
- }
- }
-
- if(columnWhiteList != null && !columnWhiteList.isEmpty()) {
- for(String tc : columnWhiteList) {
- if(tc.endsWith(".*") || tcUCN.equals(tc.toUpperCase())) {
- return;
- }
- }
- error("请求的字段:" + tcUCN + "不在白名单中");
- }
- }
-
- public List getTableWhiteList() {
- return tableWhiteList;
- }
- public void setTableWhiteList(List tableWhiteList) {
- this.tableWhiteList = tableWhiteList;
- }
- public List getTableBlackList() {
- return tableBlackList;
- }
- public void setTableBlackList(List tableBlackList) {
- this.tableBlackList = tableBlackList;
- }
- public List getColumnWhiteList() {
- return columnWhiteList;
- }
- public void setColumnWhiteList(List columnWhiteList) {
- this.columnWhiteList = columnWhiteList;
- }
- public List getColumnBlackList() {
- return columnBlackList;
- }
- public void setColumnBlackList(List columnBlackList) {
- this.columnBlackList = columnBlackList;
- }
+
+ /**
+ * 表的黑白名单检查
+ *
+ * @param tableName
+ */
+ private void validateTable(String tableName) {
+ String tableUCN = tableName.toUpperCase();
+ if (tableBlackList != null && !tableBlackList.isEmpty()) {
+ for (String tn : tableBlackList) {
+ if (tableUCN.equals(tn.toUpperCase())) {
+ error("请求的表:" + tableName + "在黑名单中");
+ return;
+ }
+ }
+ }
+
+ if (tableWhiteList != null && !tableWhiteList.isEmpty()) {
+ for (String tn : tableWhiteList) {
+ if (tableUCN.equals(tn.toUpperCase())) {
+ return;
+ }
+ }
+ error("请求的表:" + tableName + "不在白名单中");
+ }
+ }
+
+ /**
+ * 字段黑白名单检查
+ * 要求: "表.列"
+ *
+ * @param columnName
+ */
+ private void validateColumn(String tableName, String columnName) {
+ String tableUCN = tableName.toUpperCase();
+ String columnUCN = columnName.toUpperCase();
+ String tcUCN = tableUCN + "." + columnUCN;
+ if (columnBlackList != null && !columnBlackList.isEmpty()) {
+ for (String tc : columnBlackList) {
+ if (tcUCN.equals(tc.toUpperCase())) {
+ error("请求的字段:" + tcUCN + "在黑名单中");
+ return;
+ }
+ }
+ }
+
+ if (columnWhiteList != null && !columnWhiteList.isEmpty()) {
+ for (String tc : columnWhiteList) {
+ if (tc.endsWith(".*") || tcUCN.equals(tc.toUpperCase())) {
+ return;
+ }
+ }
+ error("请求的字段:" + tcUCN + "不在白名单中");
+ }
+ }
+
}
diff --git a/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java b/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java
index c6f71f8..faed4e2 100644
--- a/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java
+++ b/src/main/java/zuo/biao/apijson/parser/AbstractProvider.java
@@ -1,196 +1,48 @@
package zuo.biao.apijson.parser;
-import java.util.ArrayList;
-import java.util.List;
+import com.google.common.collect.Lists;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import java.util.List;
+/**
+ * @author zhangls
+ */
+@Data
public abstract class AbstractProvider implements SQLProvider {
- private StatementType statementType;
- private List sets = new ArrayList();
- private List select = new ArrayList();
- private List tables = new ArrayList();
- private List join = new ArrayList();
- private List innerJoin = new ArrayList();
- private List outerJoin = new ArrayList();
- private List leftOuterJoin = new ArrayList();
- private List rightOuterJoin = new ArrayList();
- private List where = new ArrayList();
- private List having = new ArrayList();
- private List groupBy = new ArrayList();
- private List orderBy = new ArrayList();
- private List lastList = new ArrayList();
- private List columns = new ArrayList();
- private List values = new ArrayList();
- private boolean distinct;
-
- private Message message = new Message();
-
- public Message getMessage() {
- return message;
- };
- /**
- * 接收错误消息
- * @param err
- */
- public void error(String err) {
- StackTraceElement ste = new Throwable().getStackTrace()[1];
- //this.message.error(ste.getFileName() + ": Line " + ste.getLineNumber() + " Error message:" +err, ste);
- this.message.error(err, ste);
- }
-
- @Override
- public StatementType getStatementType() {
- // TODO Auto-generated method stub
- return statementType;
- }
- public void setStatementType(StatementType statementType) {
- // TODO Auto-generated method stub
- this.statementType = statementType;
- }
-
- @Override
- public List getSets() {
- // TODO Auto-generated method stub
- return sets;
- }
-
- @Override
- public List getSelect() {
- // TODO Auto-generated method stub
- return select;
- }
-
- @Override
- public List getTables() {
- // TODO Auto-generated method stub
- return tables;
- }
-
- @Override
- public List getJoin() {
- // TODO Auto-generated method stub
- return join;
- }
-
- @Override
- public List getInnerJoin() {
- // TODO Auto-generated method stub
- return innerJoin;
- }
-
- @Override
- public List getOuterJoin() {
- // TODO Auto-generated method stub
- return outerJoin;
- }
-
- @Override
- public List getLeftOuterJoin() {
- // TODO Auto-generated method stub
- return leftOuterJoin;
- }
-
- @Override
- public List getRightOuterJoin() {
- // TODO Auto-generated method stub
- return rightOuterJoin;
- }
-
- @Override
- public List getWhere() {
- // TODO Auto-generated method stub
- return where;
- }
-
- @Override
- public List getHaving() {
- // TODO Auto-generated method stub
- return having;
- }
-
- @Override
- public List getGroupBy() {
- // TODO Auto-generated method stub
- return groupBy;
- }
-
- @Override
- public List getOrderBy() {
- // TODO Auto-generated method stub
- return orderBy;
- }
-
- @Override
- public List getLastList() {
- // TODO Auto-generated method stub
- return lastList;
- }
-
- @Override
- public List getColumns() {
- // TODO Auto-generated method stub
- return columns;
- }
- @Override
- public List getValues() {
- // TODO Auto-generated method stub
- return values;
- }
+ private StatementType statementType;
+ private List sets = Lists.newArrayList();
+ private List select = Lists.newArrayList();
+ private List tables = Lists.newArrayList();
+ private List join = Lists.newArrayList();
+ private List innerJoin = Lists.newArrayList();
+ private List outerJoin = Lists.newArrayList();
+ private List leftOuterJoin = Lists.newArrayList();
+ private List rightOuterJoin = Lists.newArrayList();
+ private List where = Lists.newArrayList();
+ private List having = Lists.newArrayList();
+ private List groupBy = Lists.newArrayList();
+ private List orderBy = Lists.newArrayList();
+ private List lastList = Lists.newArrayList();
+ private List columns = Lists.newArrayList();
+ private List values = Lists.newArrayList();
+ private boolean distinct;
+
+ private Message message = new Message();
+
+ /**
+ * 接收错误消息
+ *
+ * @param err
+ */
+ public void error(String err) {
+ StackTraceElement ste = new Throwable().getStackTrace()[1];
+
+ this.message.error(err, ste);
+ }
- @Override
- public boolean isDistinct() {
- // TODO Auto-generated method stub
- return distinct;
- }
- public void setSets(List sets) {
- this.sets = sets;
- }
- public void setSelect(List select) {
- this.select = select;
- }
- public void setTables(List tables) {
- this.tables = tables;
- }
- public void setJoin(List join) {
- this.join = join;
- }
- public void setInnerJoin(List innerJoin) {
- this.innerJoin = innerJoin;
- }
- public void setOuterJoin(List outerJoin) {
- this.outerJoin = outerJoin;
- }
- public void setLeftOuterJoin(List leftOuterJoin) {
- this.leftOuterJoin = leftOuterJoin;
- }
- public void setRightOuterJoin(List rightOuterJoin) {
- this.rightOuterJoin = rightOuterJoin;
- }
- public void setWhere(List where) {
- this.where = where;
- }
- public void setHaving(List having) {
- this.having = having;
- }
- public void setGroupBy(List groupBy) {
- this.groupBy = groupBy;
- }
- public void setOrderBy(List orderBy) {
- this.orderBy = orderBy;
- }
- public void setLastList(List lastList) {
- this.lastList = lastList;
- }
- public void setColumns(List columns) {
- this.columns = columns;
- }
- public void setValues(List values) {
- this.values = values;
- }
- public void setDistinct(boolean distinct) {
- this.distinct = distinct;
- }
-
}
diff --git a/src/main/java/zuo/biao/apijson/parser/App.java b/src/main/java/zuo/biao/apijson/parser/App.java
index 06c74db..6de7e73 100644
--- a/src/main/java/zuo/biao/apijson/parser/App.java
+++ b/src/main/java/zuo/biao/apijson/parser/App.java
@@ -13,13 +13,7 @@ public class App
public static void main( String[] args ) throws SQLProviderException
{
long st = System.currentTimeMillis();
- String json = "{\r\n" +
- " \"Product:p\":{\r\n" +
- " \"@column\":\"name,max(price):max_price\",\r\n" +
- " \"name~\": \"双11\",\r\n" +
- " \"@group\": \"name\"\r\n" +
- " }\r\n" +
- "}";
+ String json = "{'Product:p':{'name~':'双11','@group':'name','@column':'name,max(price):max_price'}}";
JSONObject req = JSONObject.parseObject(json);
long fastJsonet = System.currentTimeMillis();
//JSON解析太耗时了174ms
diff --git a/src/main/java/zuo/biao/apijson/parser/BaseProvider.java b/src/main/java/zuo/biao/apijson/parser/BaseProvider.java
index 00311cb..a42b434 100644
--- a/src/main/java/zuo/biao/apijson/parser/BaseProvider.java
+++ b/src/main/java/zuo/biao/apijson/parser/BaseProvider.java
@@ -1,5 +1,8 @@
package zuo.biao.apijson.parser;
+/**
+ * @author zhangls
+ */
public class BaseProvider extends AbstractProvider {
}
diff --git a/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java b/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java
index 69d2a8d..78a3510 100644
--- a/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java
+++ b/src/main/java/zuo/biao/apijson/parser/InterpreterProvider.java
@@ -1,185 +1,169 @@
package zuo.biao.apijson.parser;
+import lombok.Getter;
+
import java.util.List;
/**
- * 该类延伸出来转换方法,让继承的子类实现
- * toXXX方法时转换逻辑,需要继承实现
- * @author Zerounary
+ * 该类延伸出来转换方法,让继承的子类实现
+ * toXXX方法时转换逻辑,需要继承实现
*
+ * @author Zerounary
*/
-public abstract class InterpreterProvider extends AbstractProvider{
-
- private T statementTypeHandle;
- private T setsHandle;
- private T selectHandle;
- private T tableHandle;
- private T joinHandle;
- private T innerJoinHandle;
- private T valuesHandle;
- private T outerJoinHandle;
- private T leftOuterJoinHandle;
- private T rightOuterJoinHandle;
- private T whereHandle;
- private T havingHandle;
- private T groupByHandle;
- private T orderByHandle;
- private T columnsHandle;
- private T lastListHandle;
- private T distinctHandle;
-
- public T getStatementTypeHandle() {
- return statementTypeHandle;
- }
- public void setStatementTypeHandle(T statementTypeHandle) {
- setStatementType(toSatementType(statementTypeHandle));
- this.statementTypeHandle = statementTypeHandle;
- }
- public abstract StatementType toSatementType(T charger) ;
-
- public T getSetsHandle() {
- return setsHandle;
- }
- public void setSetsHandle(T setsHandle) {
- setSets(toSets(setsHandle));
- this.setsHandle = setsHandle;
- }
- public abstract List toSets(T charger) ;
-
- public T getSelectHandle() {
- return selectHandle;
- }
- public void setSelectHandle(T selectHandle) {
- setSelect(toSelect(selectHandle));
- this.selectHandle = selectHandle;
- }
- public abstract List toSelect(T charger) ;
-
- public T getTableHandle() {
- return tableHandle;
- }
- public void setTableHandle(T charger) {
- setTables(toTables(charger));
- this.tableHandle = charger;
- }
- public abstract List toTables(T charger) ;
-
- public T getJoinHandle() {
- return joinHandle;
- }
- public void setJoinHandle(T charger) {
- setJoin(toJoin(charger));
- this.joinHandle = charger;
- }
- public abstract List toJoin(T charger) ;
-
- public T getInnerJoinHandle() {
- return innerJoinHandle;
- }
- public void setInnerJoinHandle(T charger) {
- setInnerJoin(toInnerJoin(charger));
- this.innerJoinHandle = charger;
- }
- public abstract List toInnerJoin(T charger) ;
-
- public T getValuesHandle() {
- return valuesHandle;
- }
- public void setValuesHandle(T charger) {
- setValues(toValues(charger));
- this.valuesHandle = charger;
- }
- public abstract List toValues(T charger) ;
-
- public T getOuterJoinHandle() {
- return outerJoinHandle;
- }
- public void setOuterJoinHandle(T charger) {
- setOuterJoin(toOuterJoin(charger));
- this.outerJoinHandle = charger;
- }
- public abstract List toOuterJoin(T charger) ;
-
- public T getLeftOuterJoinHandle() {
- return leftOuterJoinHandle;
- }
- public void setLeftOuterJoinHandle(T charger) {
- setLeftOuterJoin(toLeftOuterJoin(charger));
- this.leftOuterJoinHandle = charger;
- }
- public abstract List toLeftOuterJoin(T charger) ;
-
- public T getRightOuterJoinHandle() {
- return rightOuterJoinHandle;
- }
- public void setRightOuterJoinHandle(T charger) {
- setRightOuterJoin(toRightOuterJoin(charger));
- this.rightOuterJoinHandle = charger;
- }
- public abstract List toRightOuterJoin(T charger) ;
-
- public T getWhereHandle() {
- return whereHandle;
- }
- public void setWhereHandle(T charger) {
- setWhere(toWhere(charger));
- this.whereHandle = charger;
- }
- public abstract List toWhere(T charger) ;
-
- public T getHavingHandle() {
- return havingHandle;
- }
- public void setHavingHandle(T charger) {
- setHaving(toHaving(charger));
- this.havingHandle = charger;
- }
- public abstract List toHaving(T charger) ;
-
- public T getGroupByHandle() {
- return groupByHandle;
- }
- public void setGroupByHandle(T charger) {
- setGroupBy(toGroupBy(charger));
- this.groupByHandle = charger;
- }
- public abstract List toGroupBy(T charger) ;
-
- public T getOrderByHandle() {
- return orderByHandle;
- }
- public void setOrderByHandle(T charger) {
-
- this.orderByHandle = charger;
- }
- public abstract List toOrderBy(T charger) ;
-
- public T getColumnsHandle() {
- return columnsHandle;
- }
- public void setColumnsHandle(T charger) {
- setColumns(toColumns(charger));
- this.columnsHandle = charger;
- }
- public abstract List toColumns(T charger) ;
-
- public T getLastListHandle() {
- return lastListHandle;
- }
- public void setLastListHandle(T charger) {
- setLastList(toLastList(charger));
- this.lastListHandle = charger;
- }
- public abstract List toLastList(T charger) ;
-
- public T getDistinctHandle() {
- return distinctHandle;
- }
- public void setDistinctHandle(T charger) {
- super.setDistinct(toDistinct(charger));
- this.distinctHandle = charger;
- }
- public abstract boolean toDistinct(T charger) ;
-
+public abstract class InterpreterProvider extends BaseProvider {
+
+ @Getter
+ private T statementTypeHandle;
+ @Getter
+ private T setsHandle;
+ @Getter
+ private T selectHandle;
+ @Getter
+ private T tableHandle;
+ @Getter
+ private T joinHandle;
+ @Getter
+ private T innerJoinHandle;
+ @Getter
+ private T valuesHandle;
+ @Getter
+ private T outerJoinHandle;
+ @Getter
+ private T leftOuterJoinHandle;
+ @Getter
+ private T rightOuterJoinHandle;
+ @Getter
+ private T whereHandle;
+ @Getter
+ private T havingHandle;
+ @Getter
+ private T groupByHandle;
+ @Getter
+ private T orderByHandle;
+ @Getter
+ private T columnsHandle;
+ @Getter
+ private T lastListHandle;
+ @Getter
+ private T distinctHandle;
+
+ public void setStatementTypeHandle(T statementTypeHandle) {
+ setStatementType(toSatementType(statementTypeHandle));
+ this.statementTypeHandle = statementTypeHandle;
+ }
+
+ public abstract StatementType toSatementType(T charger);
+
+ public void setSetsHandle(T setsHandle) {
+ setSets(toSets(setsHandle));
+ this.setsHandle = setsHandle;
+ }
+
+ public abstract List toSets(T charger);
+
+ public void setSelectHandle(T selectHandle) {
+ setSelect(toSelect(selectHandle));
+ this.selectHandle = selectHandle;
+ }
+
+ public abstract List toSelect(T charger);
+
+ public void setTableHandle(T charger) {
+ setTables(toTables(charger));
+ this.tableHandle = charger;
+ }
+
+ public abstract List toTables(T charger);
+
+ public void setJoinHandle(T charger) {
+ setJoin(toJoin(charger));
+ this.joinHandle = charger;
+ }
+
+ public abstract List toJoin(T charger);
+
+ public void setInnerJoinHandle(T charger) {
+ setInnerJoin(toInnerJoin(charger));
+ this.innerJoinHandle = charger;
+ }
+
+ public abstract List toInnerJoin(T charger);
+
+ public void setValuesHandle(T charger) {
+ setValues(toValues(charger));
+ this.valuesHandle = charger;
+ }
+
+ public abstract List toValues(T charger);
+
+ public void setOuterJoinHandle(T charger) {
+ setOuterJoin(toOuterJoin(charger));
+ this.outerJoinHandle = charger;
+ }
+
+ public abstract List toOuterJoin(T charger);
+
+ public void setLeftOuterJoinHandle(T charger) {
+ setLeftOuterJoin(toLeftOuterJoin(charger));
+ this.leftOuterJoinHandle = charger;
+ }
+
+ public abstract List toLeftOuterJoin(T charger);
+
+ public void setRightOuterJoinHandle(T charger) {
+ setRightOuterJoin(toRightOuterJoin(charger));
+ this.rightOuterJoinHandle = charger;
+ }
+
+ public abstract List toRightOuterJoin(T charger);
+
+ public void setWhereHandle(T charger) {
+ setWhere(toWhere(charger));
+ this.whereHandle = charger;
+ }
+
+ public abstract List toWhere(T charger);
+
+ public void setHavingHandle(T charger) {
+ setHaving(toHaving(charger));
+ this.havingHandle = charger;
+ }
+
+ public abstract List toHaving(T charger);
+
+ public void setGroupByHandle(T charger) {
+ setGroupBy(toGroupBy(charger));
+ this.groupByHandle = charger;
+ }
+
+ public abstract List toGroupBy(T charger);
+
+ public void setOrderByHandle(T charger) {
+
+ this.orderByHandle = charger;
+ }
+
+ public abstract List toOrderBy(T charger);
+
+ public void setColumnsHandle(T charger) {
+ setColumns(toColumns(charger));
+ this.columnsHandle = charger;
+ }
+
+ public abstract List toColumns(T charger);
+
+ public void setLastListHandle(T charger) {
+ setLastList(toLastList(charger));
+ this.lastListHandle = charger;
+ }
+
+ public abstract List toLastList(T charger);
+
+ public void setDistinctHandle(T charger) {
+ super.setDistinct(toDistinct(charger));
+ this.distinctHandle = charger;
+ }
+
+ public abstract boolean toDistinct(T charger);
}
diff --git a/src/main/java/zuo/biao/apijson/parser/Message.java b/src/main/java/zuo/biao/apijson/parser/Message.java
index f381152..144f995 100644
--- a/src/main/java/zuo/biao/apijson/parser/Message.java
+++ b/src/main/java/zuo/biao/apijson/parser/Message.java
@@ -1,56 +1,43 @@
package zuo.biao.apijson.parser;
+import com.google.common.collect.Lists;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
import java.util.ArrayList;
import java.util.List;
+
/**
* 消息通知类,通过这个类型把Provider的消息传递给SQLBuilder
* 比如:当我们自定义操作遇到异常需要抛出异常的时候,往这个类里面塞StackTraceElement异常
- * 之后传到SQLBuilder中getSQL方法,统一抛出异常。
- * @author Zerounary
+ * 之后传到SQLBuilder中getSQL方法,统一抛出异常。
*
+ * @author Zerounary
*/
public class Message {
- private List errors = new ArrayList<>();
-
- public List getErrors() {
- return errors;
- }
-
- public void setErrors(List errors) {
- this.errors = errors;
- }
-
- public void error(String errorMsg, StackTraceElement stack) {
- errors.add(new ErrorElement(errorMsg, stack));
- }
-
- public void cleanErrors() {
- errors.clear();
- }
-
- public class ErrorElement {
- private String errorMsg;
- private StackTraceElement stack;
- public ErrorElement() {
-
- }
- public ErrorElement(String errorMsg, StackTraceElement stack) {
- this.errorMsg = errorMsg;
- this.stack = stack;
- }
- public String getErrorMsg() {
- return errorMsg;
- }
- public void setErrorMsg(String errorMsg) {
- this.errorMsg = errorMsg;
- }
- public StackTraceElement getStack() {
- return stack;
- }
- public void setStack(StackTraceElement stack) {
- this.stack = stack;
- }
-
- }
+
+ @Getter
+ @Setter
+ private List errors = Lists.newArrayList();
+
+
+ public void error(String errorMsg, StackTraceElement stack) {
+ errors.add(new ErrorElement(errorMsg, stack));
+ }
+
+ public void cleanErrors() {
+ errors.clear();
+ }
+
+ @Getter
+ @Setter
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public class ErrorElement {
+ private String errorMsg;
+ private StackTraceElement stack;
+ }
}
diff --git a/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java b/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java
index e2b0a79..9eea0c8 100644
--- a/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java
+++ b/src/main/java/zuo/biao/apijson/parser/SQLExplorer.java
@@ -1,218 +1,219 @@
package zuo.biao.apijson.parser;
+import com.google.common.collect.Lists;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-
+/**
+ * @author zhangls
+ */
public class SQLExplorer {
- private static final String AND = ") \nAND (";
- private static final String OR = ") \nOR (";
- private SQLStatement sql = new SQLStatement();
- private SQLProvider sqlProvider;
- public SQLExplorer(SQLProvider sqlProvider) {
- this.sqlProvider = sqlProvider;
- }
-
- public String getSQL() throws SQLProviderException {
- feedSQLStatement();
- //异常处理
- if(!sqlProvider.getMessage().getErrors().isEmpty()) {
- throw new SQLProviderException(sqlProvider.getMessage().getErrors());
- }
- StringBuffer sb = new StringBuffer();
- sql.sql(sb);
- return sb.toString();
- }
-
- /***
- * 将提供器提供的数据刷新到SQLStatement中
- */
- private void feedSQLStatement() {
- sql = new SQLStatement();
- if(sqlProvider.getStatementType() == null)
- return;
-
- sql.statementType = sqlProvider.getStatementType();
- sql.sets.addAll(ofNullable(sqlProvider.getSets()));
- sql.select.addAll(ofNullable(sqlProvider.getSelect()));
- sql.tables.addAll(ofNullable(sqlProvider.getTables()));
- sql.join.addAll(ofNullable(sqlProvider.getJoin()));
- sql.innerJoin.addAll(ofNullable(sqlProvider.getInnerJoin()));
- sql.outerJoin.addAll(ofNullable(sqlProvider.getOuterJoin()));
- sql.leftOuterJoin.addAll(ofNullable(sqlProvider.getLeftOuterJoin()));
- sql.rightOuterJoin.addAll(ofNullable(sqlProvider.getRightOuterJoin()));
- sql.where.addAll(ofNullable(sqlProvider.getWhere()));
- sql.having.addAll(ofNullable(sqlProvider.getHaving()));
- sql.groupBy.addAll(ofNullable(sqlProvider.getGroupBy()));
- sql.orderBy.addAll(ofNullable(sqlProvider.getOrderBy()));
- sql.lastList.addAll(ofNullable(sqlProvider.getLastList()));
- sql.columns.addAll(ofNullable(sqlProvider.getColumns()));
- sql.values.addAll(ofNullable(sqlProvider.getValues()));
- }
-
- public SQLProvider getSqlProvider() {
- return sqlProvider;
- }
-
- public void setSqlProvider(SQLProvider sqlProvider) {
- this.sqlProvider = sqlProvider;
- }
-
- private List ofNullable(List list){
- if(list == null)
- return new ArrayList();
- return list;
- }
-
- private static class SafeAppendable {
- private final Appendable a;
- private boolean empty = true;
-
- public SafeAppendable(Appendable a) {
- super();
- this.a = a;
- }
-
- public SafeAppendable append(CharSequence s) {
- try {
- if (empty && s.length() > 0) {
- empty = false;
- }
- a.append(s);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- public boolean isEmpty() {
- return empty;
- }
-
- }
-
- private static class SQLStatement {
-
- private StatementType statementType;
- private List sets = new ArrayList();
- private List select = new ArrayList();
- private List tables = new ArrayList();
- private List join = new ArrayList();
- private List innerJoin = new ArrayList();
- private List outerJoin = new ArrayList();
- private List leftOuterJoin = new ArrayList();
- private List rightOuterJoin = new ArrayList();
- private List where = new ArrayList();
- private List having = new ArrayList();
- private List groupBy = new ArrayList();
- private List orderBy = new ArrayList();
- private List lastList = new ArrayList();
- private List columns = new ArrayList();
- private List values = new ArrayList();
- private boolean distinct;
-
- public SQLStatement() {
- // Prevent Synthetic Access
- }
-
- private void sqlClause(SafeAppendable builder, String keyword, List parts, String open, String close,
- String conjunction) {
- if (!parts.isEmpty()) {
- if (!builder.isEmpty()) {
- builder.append("\n");
- }
- builder.append(keyword);
- builder.append(" ");
- builder.append(open);
- String last = "________";
- for (int i = 0, n = parts.size(); i < n; i++) {
- String part = parts.get(i);
- if (i > 0 && !part.equals(AND) && !part.equals(OR) && !last.equals(AND) && !last.equals(OR)) {
- builder.append(conjunction);
- }
- builder.append(part);
- last = part;
- }
- builder.append(close);
- }
- }
-
- private String selectSQL(SafeAppendable builder) {
- if (distinct) {
- sqlClause(builder, "SELECT DISTINCT", select, "", "", ", ");
- } else {
- sqlClause(builder, "SELECT", select, "", "", ", ");
- }
-
- sqlClause(builder, "FROM", tables, "", "", ", ");
- joins(builder);
- sqlClause(builder, "WHERE", where, "(", ")", " AND ");
- sqlClause(builder, "GROUP BY", groupBy, "", "", ", ");
- sqlClause(builder, "HAVING", having, "(", ")", " AND ");
- sqlClause(builder, "ORDER BY", orderBy, "", "", ", ");
- return builder.toString();
- }
-
- private void joins(SafeAppendable builder) {
- sqlClause(builder, "JOIN", join, "", "", "\nJOIN ");
- sqlClause(builder, "INNER JOIN", innerJoin, "", "", "\nINNER JOIN ");
- sqlClause(builder, "OUTER JOIN", outerJoin, "", "", "\nOUTER JOIN ");
- sqlClause(builder, "LEFT OUTER JOIN", leftOuterJoin, "", "", "\nLEFT OUTER JOIN ");
- sqlClause(builder, "RIGHT OUTER JOIN", rightOuterJoin, "", "", "\nRIGHT OUTER JOIN ");
- }
-
- private String insertSQL(SafeAppendable builder) {
- sqlClause(builder, "INSERT INTO", tables, "", "", "");
- sqlClause(builder, "", columns, "(", ")", ", ");
- sqlClause(builder, "VALUES", values, "(", ")", ", ");
- return builder.toString();
- }
-
- private String deleteSQL(SafeAppendable builder) {
- sqlClause(builder, "DELETE FROM", tables, "", "", "");
- sqlClause(builder, "WHERE", where, "(", ")", " AND ");
- return builder.toString();
- }
-
- private String updateSQL(SafeAppendable builder) {
- sqlClause(builder, "UPDATE", tables, "", "", "");
- joins(builder);
- sqlClause(builder, "SET", sets, "", "", ", ");
- sqlClause(builder, "WHERE", where, "(", ")", " AND ");
- return builder.toString();
- }
-
- public String sql(Appendable a) {
- SafeAppendable builder = new SafeAppendable(a);
- if (statementType == null) {
- return null;
- }
-
- String answer;
-
- switch (statementType) {
- case DELETE:
- answer = deleteSQL(builder);
- break;
-
- case INSERT:
- answer = insertSQL(builder);
- break;
-
- case SELECT:
- answer = selectSQL(builder);
- break;
-
- case UPDATE:
- answer = updateSQL(builder);
- break;
-
- default:
- answer = null;
- }
-
- return answer;
- }
- }
+ private static final String AND = ") \nAND (";
+ private static final String OR = ") \nOR (";
+ private SQLStatement sql = new SQLStatement();
+
+ @Getter
+ @Setter
+ private SQLProvider sqlProvider;
+
+ public SQLExplorer(SQLProvider sqlProvider) {
+ this.sqlProvider = sqlProvider;
+ }
+
+ public String getSQL() throws SQLProviderException {
+ feedSQLStatement();
+ //异常处理
+ if (!sqlProvider.getMessage().getErrors().isEmpty()) {
+ throw new SQLProviderException(sqlProvider.getMessage().getErrors());
+ }
+ StringBuffer sb = new StringBuffer();
+ sql.sql(sb);
+ return sb.toString();
+ }
+
+ /**
+ * 将提供器提供的数据刷新到SQLStatement中
+ */
+ private void feedSQLStatement() {
+ sql = new SQLStatement();
+ if (sqlProvider.getStatementType() == null) {
+ return;
+ }
+
+ sql.statementType = sqlProvider.getStatementType();
+ sql.sets.addAll(ofNullable(sqlProvider.getSets()));
+ sql.select.addAll(ofNullable(sqlProvider.getSelect()));
+ sql.tables.addAll(ofNullable(sqlProvider.getTables()));
+ sql.join.addAll(ofNullable(sqlProvider.getJoin()));
+ sql.innerJoin.addAll(ofNullable(sqlProvider.getInnerJoin()));
+ sql.outerJoin.addAll(ofNullable(sqlProvider.getOuterJoin()));
+ sql.leftOuterJoin.addAll(ofNullable(sqlProvider.getLeftOuterJoin()));
+ sql.rightOuterJoin.addAll(ofNullable(sqlProvider.getRightOuterJoin()));
+ sql.where.addAll(ofNullable(sqlProvider.getWhere()));
+ sql.having.addAll(ofNullable(sqlProvider.getHaving()));
+ sql.groupBy.addAll(ofNullable(sqlProvider.getGroupBy()));
+ sql.orderBy.addAll(ofNullable(sqlProvider.getOrderBy()));
+ sql.lastList.addAll(ofNullable(sqlProvider.getLastList()));
+ sql.columns.addAll(ofNullable(sqlProvider.getColumns()));
+ sql.values.addAll(ofNullable(sqlProvider.getValues()));
+ }
+
+ private List ofNullable(List list) {
+ if (list == null) {
+ return Lists.newArrayList();
+ }
+ return list;
+ }
+
+ private static class SafeAppendable {
+ private final Appendable a;
+ private boolean empty = true;
+
+ public SafeAppendable(Appendable a) {
+ super();
+ this.a = a;
+ }
+
+ public SafeAppendable append(CharSequence s) {
+ try {
+ if (empty && s.length() > 0) {
+ empty = false;
+ }
+ a.append(s);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return this;
+ }
+
+ public boolean isEmpty() {
+ return empty;
+ }
+
+ }
+
+ @NoArgsConstructor
+ private static class SQLStatement {
+
+ private StatementType statementType;
+ private List sets = Lists.newArrayList();
+ private List select = Lists.newArrayList();
+ private List tables = Lists.newArrayList();
+ private List join = Lists.newArrayList();
+ private List innerJoin = Lists.newArrayList();
+ private List outerJoin = Lists.newArrayList();
+ private List leftOuterJoin = Lists.newArrayList();
+ private List rightOuterJoin = Lists.newArrayList();
+ private List where = Lists.newArrayList();
+ private List having = Lists.newArrayList();
+ private List groupBy = Lists.newArrayList();
+ private List orderBy = Lists.newArrayList();
+ private List lastList = Lists.newArrayList();
+ private List columns = Lists.newArrayList();
+ private List values = Lists.newArrayList();
+ private boolean distinct;
+
+ private void sqlClause(SafeAppendable builder, String keyword, List parts, String open, String close, String conjunction) {
+ if (!parts.isEmpty()) {
+ if (!builder.isEmpty()) {
+ builder.append("\n");
+ }
+ builder.append(keyword);
+ builder.append(" ");
+ builder.append(open);
+ String last = "________";
+ for (int i = 0, n = parts.size(); i < n; i++) {
+ String part = parts.get(i);
+ if (i > 0 && !part.equals(AND) && !part.equals(OR) && !last.equals(AND) && !last.equals(OR)) {
+ builder.append(conjunction);
+ }
+ builder.append(part);
+ last = part;
+ }
+ builder.append(close);
+ }
+ }
+
+ private String selectSQL(SafeAppendable builder) {
+ if (distinct) {
+ sqlClause(builder, "SELECT DISTINCT", select, "", "", ", ");
+ } else {
+ sqlClause(builder, "SELECT", select, "", "", ", ");
+ }
+
+ sqlClause(builder, "FROM", tables, "", "", ", ");
+ joins(builder);
+ sqlClause(builder, "WHERE", where, "(", ")", " AND ");
+ sqlClause(builder, "GROUP BY", groupBy, "", "", ", ");
+ sqlClause(builder, "HAVING", having, "(", ")", " AND ");
+ sqlClause(builder, "ORDER BY", orderBy, "", "", ", ");
+ return builder.toString();
+ }
+
+ private void joins(SafeAppendable builder) {
+ sqlClause(builder, "JOIN", join, "", "", "\nJOIN ");
+ sqlClause(builder, "INNER JOIN", innerJoin, "", "", "\nINNER JOIN ");
+ sqlClause(builder, "OUTER JOIN", outerJoin, "", "", "\nOUTER JOIN ");
+ sqlClause(builder, "LEFT OUTER JOIN", leftOuterJoin, "", "", "\nLEFT OUTER JOIN ");
+ sqlClause(builder, "RIGHT OUTER JOIN", rightOuterJoin, "", "", "\nRIGHT OUTER JOIN ");
+ }
+
+ private String insertSQL(SafeAppendable builder) {
+ sqlClause(builder, "INSERT INTO", tables, "", "", "");
+ sqlClause(builder, "", columns, "(", ")", ", ");
+ sqlClause(builder, "VALUES", values, "(", ")", ", ");
+ return builder.toString();
+ }
+
+ private String deleteSQL(SafeAppendable builder) {
+ sqlClause(builder, "DELETE FROM", tables, "", "", "");
+ sqlClause(builder, "WHERE", where, "(", ")", " AND ");
+ return builder.toString();
+ }
+
+ private String updateSQL(SafeAppendable builder) {
+ sqlClause(builder, "UPDATE", tables, "", "", "");
+ joins(builder);
+ sqlClause(builder, "SET", sets, "", "", ", ");
+ sqlClause(builder, "WHERE", where, "(", ")", " AND ");
+ return builder.toString();
+ }
+
+ public String sql(Appendable a) {
+ SafeAppendable builder = new SafeAppendable(a);
+ if (statementType == null) {
+ return null;
+ }
+
+ String answer;
+
+ switch (statementType) {
+ case DELETE:
+ answer = deleteSQL(builder);
+ break;
+
+ case INSERT:
+ answer = insertSQL(builder);
+ break;
+
+ case SELECT:
+ answer = selectSQL(builder);
+ break;
+
+ case UPDATE:
+ answer = updateSQL(builder);
+ break;
+
+ default:
+ answer = null;
+ }
+
+ return answer;
+ }
+ }
}
diff --git a/src/main/java/zuo/biao/apijson/parser/SQLProvider.java b/src/main/java/zuo/biao/apijson/parser/SQLProvider.java
index 7dbfa2a..944a8ec 100644
--- a/src/main/java/zuo/biao/apijson/parser/SQLProvider.java
+++ b/src/main/java/zuo/biao/apijson/parser/SQLProvider.java
@@ -1,77 +1,106 @@
package zuo.biao.apijson.parser;
import java.util.List;
+
/**
* 实现这个接口提供SQLBuilder获取构造SQL语句所需要的数据
- * @author Zerounary
*
+ * @author Zerounary
*/
public interface SQLProvider {
- /**
- * 消息类,如果Provider中有异常,通过这个方法可以传递消息
- * @return
- */
- public Message getMessage();
- /**
- * StatementType表示要生成的是SELECT,INSERT,UPDATE,DLEETE中的哪种
- * @return StatementType
- */
- public StatementType getStatementType();
- /**
- * StatementType为UPDATE时
- * UPDATE要更新的字段
- * @return List
- */
- public List