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