• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

APIJSONParser: apijson解析sql那段代码,作者没有单独拆成模块。和作者联系,也没有 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

APIJSONParser

开源软件地址:

https://gitee.com/sxran/APIJSONParser

开源软件介绍:

APIJSONParser

参考项目APIJSON设计的一款编译SQL编译器框架,现已实现APIJSON格式的JSON到SQL的转换

简介

在APIJSON程序中,主要分三步:权限判断,解析生成SQL,包装成制定格式的响应

APIJSONParser是其中解析生成SQL过程的一个工具类,提供将制定格式的JSON对象转化生成一条标准的SQL,如果你想自定义格式,底层的框架也完全支持你进行自由扩展。

假设一个JSON是这样的:

{    "Product":{        "id":"1"    }}

将上述的JSON解析到一个叫objJSONObject中,经过以下代码:

APIJSONProvider apijsonProvider = new APIJSONProvider(obj); //一个APIJSON解析器拿到一个json对象apijsonProvider.setStatementType(StatementType.SELECT); //当前为查询模式,还支持新增,修改,删除System.out.println(SQLExplorer.getSQL(apijsonProvider).getText());//拿到SQL

之后会打印这样一句SQL

SELECT Product.*FROM Product ProductWHERE (Product.id = '1')

通过对比,我们很容易发现,其中的奥秘。JSON中Product是指表名,而其中的id则是它的过滤条件。这里你可能会有一些疑惑,比如注入之类的安全问题。解析器的在进行解析的时候,会进行严格的格式检查,诚然这将会牺牲一些效率和SQL本身的灵活性。

如果你觉得这里的别名很怪异,想自己定义,你可以这样:

{    "Product:p":{        "id":"1"    }}

结果:

SELECT p.*FROM Product pWHERE (p.id = '1')

这里我们查询出来的是id为1的数据的所有字段,如果我们想要部分字段怎么办?

{    "Product:p":{        "@column":"id,code,name",        "id":"1"    }}

结果:

SELECT p.id, p.code, p.nameFROM Product pWHERE (p.id = '1')

倘若,你想要给表加别名一样给字段也加个别名

{    "Product:p":{        "@column":"id,code,name:productName",        "id":"1"    }}

结果:

SELECT p.id, p.code, p.name as productNameFROM Product pWHERE (p.id = '1')

到现在为止,我们都是以id为1作为过滤条件的,其他还有很多过滤方法。

对于一个数值字段,我们要找出价格(price)300元以上的商品,我们可以这样

{    "Product:p":{        "@column":"id,code,name,price",        "price{}":">300"    }}

结果:

SELECT p.id, p.code, p.name, p.priceFROM Product pWHERE (p.price > 300)

这里的{}表示你查询的是一个范围,如果你有多个范围。除了这里演示的>,自然你也可以使用<<=>>==

{    "Product:p":{        "@column":"id,code,name,price",        "price{}":">300,<1200"    }}

结果:

SELECT p.id, p.code, p.name, p.priceFROM Product pWHERE (p.price > 300 AND p.price < 1200)

现在我们查询的范围是,300 < price < 1200,如果想要找,price <= 300或者price >= 1200的数据。

{    "Product:p":{        "@column":"id,code,name,price",        "price|{}":">300,<1200"    }}

结果:

SELECT p.id, p.code, p.name, p.priceFROM Product pWHERE (p.price > 300 OR p.price < 1200)

{}的另外一种用法是IN,只需要你{}的字段的值的类型的JSONArray。

例如,我们的商品Product有一个品牌的字段brand_id,这是一个品牌表(Brand)的外键字段,我们想选择某一部分的品牌的商品出来

{    "Product:p":{        "@column":"id,code,name,price",        "brand_id{}": [1,4,5]    }}

结果:

SELECT p.id, p.code, p.name, p.priceFROM Product pWHERE (p.brand_id IN (1, 4, 5))

如果要排除某些品牌,你可以

{    "Product:p":{        "@column":"id,code,name,price",        "brand_id!{}": [1,4,5]    }}

结果:

SELECT p.id, p.code, p.name, p.priceFROM Product pWHERE (p.brand_id NOT IN (1, 4, 5))

此功能同样支持文本字段

如果想查看商品名称字段name包含某一子串双11的商品

{    "Product:p":{        "@column":"id,code,name,price",        "name~": "双11"    }}

结果:

SELECT p.id, p.code, p.name, p.priceFROM Product pWHERE (p.name LIKE '%双11%')

如果你想自己调控%,也可以直接使用。

{    "Product:p":{        "@column":"id,code,name,price",        "name$": "%双11"    }}

结果:

SELECT p.id, p.code, p.name, p.priceFROM Product pWHERE (p.name LIKE '%双11')

%放哪里,你可以自己决定。

想使用正则的话

{    "Product:p":{        "@column":"id,code,name,price",        "code?": "^[0-9]+$"    }}

结果:

SELECT p.id, p.code, p.name, p.priceFROM Product pWHERE ( regexp_like(p.code,'^[0-9]+$'))

介于不同的数据库,函数名有一些区别,可按实际情况修改。APIJSONProvider345行,进行修改。

如果你想要排序,你可以这样

{    "Product:p":{        "@column":"id,code,name,price",        "name~": "双11",        "@orders": "price-"    }}

结果:

SELECT p.id, p.code, p.name, p.priceFROM Product pWHERE (p.name LIKE '%双11%')ORDER BY p.price DESC

-表示降序,+表示增序。以上查询的是双11商品价格从高到底的列表

有时我们也要进行分组操作,比如找出双11商品中的最贵的商品

{    "Product:p":{        "@column":"name,max(price):max_price",        "name~": "双11",        "@group": "name"    }}

结果:

SELECT p.name, max(p.price) as max_priceFROM Product pWHERE (p.name LIKE '%双11%')GROUP BY p.name

目前允许的函数没有进行控制,所有的单一参数的函数都可以使用。

单表查询的内容基本介绍完了,接下来是多表查询。

现在有两张表,零售表m_retail,零售的店铺m_retail.c_store_id外键关联到c_store表。

第一种是使用id@

{  "m_retail:r":{      "@column":"id,docno",      "id": 18    },  "c_store:s":{    "id@":"/r/c_store_id",    "@column":"code,name"  }}

结果:

SELECT r.id, r.docno, s.code as "s.code", s.name as "s.name"FROM m_retail r, c_store sWHERE (r.id = 18 AND r.c_store_id = s.id)

如果不使用id@

{    "[]": {        "c_store": {            "@column": "code,name",            "code": "C86L"        },        "m_retail:r": {            "@column": "id,docno"        }    },    "join": {        "@innerJoin": [            "c_store.id=r.c_store_id"        ]    }}

结果:

SELECT r.id, r.docno, c_store.code, c_store.nameFROM m_retail rINNER JOIN c_store ON c_store.id=r.c_store_idWHERE (c_store.code = 'C86L')

其他几种join的使用方法和这里演示的innerJoin是一样的。

现在支持的join有:

@innerJoin@leftOuterJoin@rightOuterJoin@join@outerJoin

速查

速查中的示例,都是最简单的实例,更新,删除的功能中的过滤条件的使用和查询相同,具体使用参考上述说明

一个叫test_apijson的表

IDCODENAME
1A001浦东区
2B001徐汇区
3C001普陀区

查询

查询A001的名称

{    "test_apijson":{        "@column":"name",        "code":"A001"    }}

新增

新增一行如ID=1的数据

{    "test_apijson":{        "code":"A001",        "name":"浦东区"    }}

ID是自动增长的,所以不需要再给ID赋值。

修改

修改代码B001A002

{    "test_apijson":{        "@code":"A002",        "code": "B001"    }}

删除

删除A002

{    "test_apijson":{        "code": "A002"    }}

权限

表权限

表白名单:APIJSONProvider.getTableWhiteList()

表黑名单:APIJSONProvider.getTableBlackList()

表的黑白名单的使用

apijsonProvider.getTableBlackList().add("Retail");

Retail是表名

字段权限

字段白名单:APIJSONProvider.getColumnWhiteList()

字段黑名单:APIJSONProvider.getColumnBlackList()

字段的黑白名单的使用

apijsonProvider.getColumnWhiteList().add("retail.*");apijsonProvider.getColumnWhiteList().add("retail.amt");

格式:表名.字段名,字段名支持通配符*

导入jar

地址

https://jitpack.io/#com.gitee.sxran/dyna-graph-ql/1.0.0

pom.xml 依赖

To get a Git project into your build:Step 1. Add the JitPack repository to your build file

	<repositories>		<repository>		    <id>jitpack.io</id>		    <url>https://jitpack.io</url>		</repository>	</repositories>

Step 2. Add the dependency版本见标签

	<dependency>	    <groupId>com.gitee.sxran</groupId>	    <artifactId>APIJSONParser</artifactId>	    <version>1.1.0-hutool</version>	</dependency>

已接入项目:

版本更新:

1.0.0

  • 完成上面功能

1.1.0-hutool

  • 优化目录结构
  • 改成hutool-json依赖.

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap