diff --git a/README.md b/README.md index 1348e2b..e5e4f55 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,7 @@ WHERE (p.price > 300 OR p.price < 1200) ```sql SELECT p.id, p.code, p.name, p.price FROM Product p -WHERE (p.brand_id IN [1, 4, 5]) +WHERE (p.brand_id IN (1, 4, 5)) ``` @@ -218,7 +218,7 @@ WHERE (p.brand_id IN [1, 4, 5]) ```sql SELECT p.id, p.code, p.name, p.price FROM Product p -WHERE (p.brand_id NOT IN [1, 4, 5]) +WHERE (p.brand_id NOT IN (1, 4, 5)) ``` 此功能同样支持文本字段 @@ -314,7 +314,7 @@ WHERE ( regexp_like(p.code,'^[0-9]+$')) 结果: -```json +```sql SELECT p.id, p.code, p.name, p.price FROM Product p WHERE (p.name LIKE '%双11%') @@ -350,21 +350,74 @@ GROUP BY p.name 目前允许的函数没有进行控制,所有的单一参数的函数都可以使用。 +单表查询的内容基本介绍完了,接下来是多表查询。 +现在有两张表,零售表`m_retail`,零售的店铺`m_retail.c_store_id`外键关联到`c_store`表。 +第一种是使用`id@` +```json +{ + "m_retail:r":{ + "@column":"id,docno", + "id": 18 + }, + "c_store:s":{ + "id@":"/r/c_store_id", + "@column":"code,name" + } +} +``` -单表查询的内容基本介绍完了。 +结果: -接下来是多表查询,后续文档内容敬请期待。 +```sql +SELECT r.id, r.docno, s.code as "s.code", s.name as "s.name" +FROM m_retail r, c_store s +WHERE (r.id = 18 AND r.c_store_id = s.id) +``` +如果不使用`id@` + +```json +{ + "[]": { + "c_store": { + "@column": "code,name", + "code": "C86L" + }, + "m_retail:r": { + "@column": "id,docno" + } + }, + "join": { + "@innerJoin": [ + "c_store.id=r.c_store_id" + ] + } +} +``` +结果: +```sql +SELECT r.id, r.docno, c_store.code, c_store.name +FROM m_retail r +INNER JOIN c_store ON c_store.id=r.c_store_id +WHERE (c_store.code = 'C86L') +``` +其他几种join的使用方法和这里演示的innerJoin是一样的。 +现在支持的join有: +@innerJoin +@leftOuterJoin +@rightOuterJoin +@join +@outerJoin @@ -375,32 +428,131 @@ GROUP BY p.name ## 速查 +> 速查中的示例,都是最简单的实例,更新,删除的功能中的过滤条件的使用和查询相同,具体使用参考上述说明 + + + +一个叫`test_apijson`的表 + + + +| ID | CODE | NAME | +| ---- | ---- | ------ | +| 1 | A001 | 浦东区 | +| 2 | B001 | 徐汇区 | +| 3 | C001 | 普陀区 | + + + ### 查询 -#### 别名 -表的别名 +查询`A001`的名称 + + ```json { - "Table:t":{} + "test_apijson":{ + "@column":"name", + "code":"A001" + } } ``` -字段的别名 + + +### 新增 + + +新增一行如ID=1的数据 + + ```json { - "Table:t":{ - "@column":"columnName:columnAliasName,.." + "test_apijson":{ + "code":"A001", + "name":"浦东区" } } ``` -### 新增 +ID是自动增长的,所以不需要再给ID赋值。 ### 修改 -### 删除 \ No newline at end of file + +修改代码`B001`为`A002` + + + +```json +{ + "test_apijson":{ + "@code":"A002", + "code": "B001" + } +} +``` + + + + + +### 删除 + + +删除`A002` + + + +```json +{ + "test_apijson":{ + "code": "A002" + } +} +``` + + + +## 权限 + +### 表权限 + +表白名单:`APIJSONProvider.getTableWhiteList()` + +表黑名单:`APIJSONProvider.getTableBlackList()` + +表的黑白名单的使用 + + + +```java +apijsonProvider.getTableBlackList().add("Retail"); +``` + +`Retail`是表名 + + + +### 字段权限 + +字段白名单:`APIJSONProvider.getColumnWhiteList()` + +字段黑名单:`APIJSONProvider.getColumnBlackList()` + +字段的黑白名单的使用 + + + +```java +apijsonProvider.getColumnWhiteList().add("retail.*"); +apijsonProvider.getColumnWhiteList().add("retail.amt"); +``` + +格式:`表名.字段名`,字段名支持通配符`*` + diff --git a/pom.xml b/pom.xml index e6ffde5..e9e316b 100644 --- a/pom.xml +++ b/pom.xml @@ -27,4 +27,53 @@ 1.2.21 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + true + + + + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + UTF-8 + + ${project.basedir}/lib/ + + + + + + maven-assembly-plugin + + + jar-with-dependencies + + + + com.ctbri.echoRisk.ApplicationStart + + + + + + make-assembly + package + + single + + + + + + + diff --git a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java index 83ed32e..428f0dd 100644 --- a/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java +++ b/src/main/java/zuo/biao/apijson/parser/APIJSONProvider.java @@ -12,6 +12,8 @@ public class APIJSONProvider extends AbstractProvider { private final String ALIAS_SPLIT = ":"; private static final String AND = " AND "; private static final String OR = " OR "; + private final String q = "\""; + private boolean isWrap = false; private List tableWhiteList = new ArrayList(); private List tableBlackList = new ArrayList(); @@ -61,7 +63,7 @@ public List getTables() { Set tableNames = request.keySet(); String tableAliasName; String tableRealName; - for(String tableName : tableNames) { + out:for(String tableName : tableNames) { if(!tableName.matches("(\\w+(:\\w+)?)")) { error("表" + tableName + "格式不符合" ); return null; @@ -74,8 +76,25 @@ public List getTables() { }else { tableRealName = tableAliasName = tableName; } + if(join != null) { + String[] checkJoin = {"@innerJoin","@leftOuterJoin","@rightOuterJoin","@join","@outerJoin"}; + for(String joinKey : checkJoin) { + JSONArray array = join.getJSONArray(joinKey); + if(array != null && array.size() != 0) { + for(Object obj : array) { + if(obj instanceof String && (((String)obj).startsWith(tableRealName) || ((String)obj).startsWith(tableAliasName))) { + continue out; + } + } + } + } + } validateTable(tableRealName); - list.add(tableRealName + " " + tableAliasName); + if(getStatementType() == StatementType.SELECT) { + list.add(tableRealName + " " + tableAliasName); + }else { + list.add(tableRealName); + } } return list; } @@ -151,18 +170,27 @@ public List getSelect() { String columnRealName = functionStrs[1]; String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; validateColumn(tableRealName,columnRealName); + if(propertis.getString("id@") != null) + columnAliasName = wrapColumn(tableAliasName, columnAliasName); list.add(funcitonName + "(" + tableAliasName + "." + columnRealName + ")" + " as " + columnAliasName); }else { //没函数的字段 String columnRealName = functionOrColumn ; String columnAliasName = columnName.split(ALIAS_SPLIT)[1]; validateColumn(tableRealName,columnRealName); + if(propertis.getString("id@") != null) + columnAliasName = wrapColumn(tableAliasName, columnAliasName); list.add(tableAliasName + "." + columnRealName + " as " + columnAliasName); } }else { //使用tableAliasName.columnName类型 validateColumn(tableRealName,columnName); - list.add(tableAliasName + "." + columnName); + if(propertis.getString("id@") != null) { + String columnAliasName = wrapColumn(tableAliasName, columnName); + list.add(tableAliasName + "." + columnName + " as " + columnAliasName); + }else { + list.add(tableAliasName + "." + columnName); + } } } } @@ -171,6 +199,9 @@ public List getSelect() { } return list; } + private String wrapColumn(String tableAliasName, String columnAliasName) { + return isWrap? q + tableAliasName + "." + columnAliasName + q : q + columnAliasName + q; + } /** * 解析请求中的过滤条件 * 支持以下模式: @@ -295,7 +326,7 @@ public List getWhere() { limit += "'" + ((String)obj).replaceAll("'", "''") + "'"; } } - list.add(tableAliasName + "." + columnName + " NOT IN [" + limit + "]" ); + list.add(tableAliasName + "." + columnName + " NOT IN (" + limit + ")" ); } }else { if(!array.isEmpty()) { @@ -313,7 +344,7 @@ public List getWhere() { limit += "'" + ((String)obj).replaceAll("'", "''") + "'"; } } - list.add(tableAliasName + "." + columnName + " IN [" + limit + "]" ); + list.add(tableAliasName + "." + columnName + " IN (" + limit + ")" ); } } } @@ -520,7 +551,7 @@ public List getOuterJoin() { List list = new ArrayList<>(); if(getStatementType() == StatementType.SELECT) { if(join != null && join.get("@outerJoin")!=null) { - JSONArray stms = join.getJSONArray("@join"); + JSONArray stms = join.getJSONArray("@outerJoin"); for(int i = 0; i < stms.size(); i++) { Object obj = stms.get(i); @@ -872,4 +903,12 @@ public List getColumnBlackList() { public void setColumnBlackList(List columnBlackList) { this.columnBlackList = columnBlackList; } + public boolean isWrap() { + return isWrap; + } + public void setWrap(boolean isWrap) { + this.isWrap = isWrap; + } + + } diff --git a/src/main/java/zuo/biao/apijson/parser/App.java b/src/main/java/zuo/biao/apijson/parser/App.java index 06c74db..c45c8e7 100644 --- a/src/main/java/zuo/biao/apijson/parser/App.java +++ b/src/main/java/zuo/biao/apijson/parser/App.java @@ -14,12 +14,22 @@ 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" + + " \"c_store\": {\r\n" + + " \"@column\": \"code,name\",\r\n" + + " \"code\": \"C86L\"\r\n" + + " },\r\n" + + " \"m_retail:r\": {\r\n" + + " \"@column\": \"id,docno\"\r\n" + + " }\r\n" + + " },\r\n" + + " \"join\": {\r\n" + + " \"@innerJoin\": [\r\n" + + " \"c_store.id=r.c_store_id\"\r\n" + + " ]\r\n" + " }\r\n" + "}"; + System.out.println(json); JSONObject req = JSONObject.parseObject(json); long fastJsonet = System.currentTimeMillis(); //JSON解析太耗时了174ms diff --git a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties index b28d1ab..26916d5 100644 --- a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties +++ b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Tue Dec 25 10:09:51 CST 2018 +#Thu Feb 14 08:53:56 CST 2019 version=0.0.1-SNAPSHOT groupId=APIJSONParser m2e.projectName=APIJSONParser diff --git a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml index e6ffde5..e9e316b 100644 --- a/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml +++ b/target/classes/META-INF/maven/APIJSONParser/APIJSONParser/pom.xml @@ -27,4 +27,53 @@ 1.2.21 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + true + + + + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + UTF-8 + + ${project.basedir}/lib/ + + + + + + maven-assembly-plugin + + + jar-with-dependencies + + + + com.ctbri.echoRisk.ApplicationStart + + + + + + make-assembly + package + + single + + + + + + + diff --git a/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class b/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class index 6345296..0836ce9 100644 Binary files a/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class and b/target/classes/zuo/biao/apijson/parser/APIJSONProvider.class differ diff --git a/target/classes/zuo/biao/apijson/parser/App.class b/target/classes/zuo/biao/apijson/parser/App.class index 64ddeda..eec3c2b 100644 Binary files a/target/classes/zuo/biao/apijson/parser/App.class and b/target/classes/zuo/biao/apijson/parser/App.class differ