不用写代码 APIJSON 3.5K Star 超第 2 大 ORM 库 Hibernate

2018-11-14 10:54:07 +08:00
 TommyLemon

https://www.timqian.com/star-history/#TommyLemon/APIJSON&hibernate/hibernate-orm

众所周知,Hibernate 是 Java 的第 2 大开源 ORM 库,从 2007 年开源到现在已经有近 12 年的历史。
廉颇老矣,尚能饭否? 长江后浪推前浪,一代新库换旧库。

为什么 APIJSON 从 2016 年 11 月开源后短短 2 年就超过它了呢?
因为 APIJSON 是自动化的,后端不用写代码,就能自动解析前端传的 JSON 参数,
自动转为 SQL 语句并连接数据库执行,然后返回对应的 JSON 结果,
期间自动校验权限、数据、结构,自动防 SQL 注入。

对于前端

对于后端

多表关联查询、结构自由组合、多个测试账号、一键共享测试用例

自动生成封装请求 JSON 的 Android 与 iOS 代码、一键下载自动生成的 JavaBean

自动保存请求记录、自动生成接口文档

一键自动接口回归测试,不需要写任何代码(注解、注释等全都不要)

目前 APIJSON 的生态已初具雏形:

* APIJSON 接口工具:      https://github.com/TommyLemon/APIJSONAuto
* APIJSON -Java 版:      https://github.com/TommyLemon/APIJSON
* APIJSON - C# 版:      https://github.com/liaozb/APIJSON.NET
* APIJSON - PHP 版:      https://github.com/orchie/apijson
* APIJSON -Node 版:      https://github.com/TEsTsLA/apijson

创作不易,GitHub 右上角点 ⭐Star 支持下吧,谢谢 ^_^

https://github.com/TommyLemon/APIJSON

8569 次点击
所在节点    开源软件
73 条回复
TommyLemon
2018-11-15 15:02:12 +08:00
@chinvo
很不一样,Parse 是 SaaS 服务,类似的有 Firebase 以及国内的 LeanCloud 等,
它们主要是把业务放到了前端,后端只手写或者自动生成一些细粒度的 RESTful 接口,
很多需求往往要前端调用多个接口再自己组装并处理数据,
有的还提供自己的类似 SQL 的查询语言,例如 LeanCloud 提供的 CQL,功能限制大,官方文档说了:
与 SQL 的主要差异
不支持在 select 中使用 as 关键字为列增加别名。
update 和 delete 不提供批量更新和删除,只能根据 objectId ( where objectId=xxx )和其他条件来更新或者删除某个文档。
不支持 join,关联查询提供 include、relatedTo 等语法来替代(关系查询)。
仅支持部分 SQL 函数(内置函数)。
不支持 group by、having、max、min、sum、distinct 等分组聚合查询语法。

以上都是 CQL 不支持的,但 APIJSON 全都支持。

另外 SaaS 应用场景基本只适合创业项目,
提供的功能都是受限于 SaaS 服务商( Parse 开源了,定制性要好一些),
有了一定规模就非常有必要把后端推到重来了。
而且又因为绑定了服务商的服务,迁移困难。

APIJSON 完全开放源码,容易定制,还能很好地控制权限。


APIJSON 则是 JSON 转 SQL 的协议,基于 JSON 扩展而来,
开源项目中提供了 Java 的 ORM 实现,
还有其它作者提供了 Node.js, C#, PHP 的实现。

APIJSON 为 简单的增删改查、复杂的查询、简单的事务操作 提供了完全自动化的 API。
能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。
适合中小型前后端分离的项目,尤其是互联网创业项目和企业自用项目。

通过自动化 API,前端可以定制任何数据、任何结构!
大部分 HTTP 请求后端再也不用写接口了,更不用写文档了!
前端再也不用和后端沟通接口或文档问题了!再也不会被文档各种错误坑了!
后端再也不用为了兼容旧接口写新版接口和文档了!再也不会被前端随时随地没完没了地烦了!
TommyLemon
2018-11-15 15:08:42 +08:00
@chocotan 你确定是各方面?再仔细看看 25 楼我的回复,我都说了
"Hibernate 代码质量比 APIJSON 高,这点我是承认的,但 APIJSON 的代码质量我自认为也是超过平均水平的,
不服的话,用阿里的 P3C 规范对比下?"

我在另一个社区还提到
"Hibernate 使用率是远高于 APIJSON 的,毕竟从 07 年开源到现在都快 12 年了,APIJSON 才 2 年多一点。"
oschina。net/news/101787/apijson-3-1-0-released#comments

有句话说得很对,"人们总是只看到他们想看到的东西"
sagaxu
2018-11-15 16:31:03 +08:00
@TommyLemon 搜索 name 中包含字母 a
{
"User": {
"name~": "a"
}
}
变为 搜索 sex 为 1
{
"User": {
"sex": 1
}
}

==============================================

难道这里改的不是代码?


10 大痛点我看了,感觉也没那么痛。

1. 带宽,内部系统或者管理后台大多数不需要考虑带宽。需要省带宽时,后端也可以只返回部分字段,甚至换二进制协议。

2. 命名混乱,不同部门或者第三方 API 的命名风格,编码规范解决不了,lint 也解决不了,APIJSON 也解决不了。

3. 数据类型,那是动态类型语言才有的问题,Java 或者 Go 定义好类型,还能变来变去?{}变[]是 php 独有的。

4. 混乱的状态码,跟第 2 点一样,只有很小的项目,不跟别人对接,只用 APIJSON 返回数据才能解决,但是可能吗?

5. 文档跟代码不同步,的确,这个问题比较普遍,也有很多根据代码生成文档的工具,但是往往只能做到字段说明或者参数说明这种程度,不能描述业务逻辑,也没有流程图或者 UML 图。

6. 应用界面和接口强耦合,只要数据依赖不变,UI 随便怎么改都不用后端一起改。接口定义是前后端一起商议的,后端一言堂的情况很多吗?强迫前端用 APIJSON 这种风格的 API 不算拍脑袋?

后面就不多说了,我个人感觉都不是痛点。

如果这 10 大痛点成立,现在应该很多公司在用了,还会写到招聘广告里。

===============================================



请原谅我的抬杠,毕竟你的标题立的太高了

1. 不用写代码
2. 超 Hibernate

假如有 30%符合事实,恐怕早就铺天盖地的用起来了,根本用不着亲自宣传。
TommyLemon
2018-11-15 17:50:44 +08:00
@sagaxu
我说的是不改后端代码,这是前端发的 JSON 参数。

===============================================


1.用什么方式都能做,前提都是后端服务支持,只是传统方式要后端写代码支持,而 APIJSON 几乎没有成本,尤其是对于后端开发来说。

2.APIJSON 规范了:
页码(统一用 page 代替 pageNum, page_index, pnum 等),
每页数量(统一用 count 代替 pageSize, pcount 等 ),
搜索关键词(统一用 $, ~ 代替原来的 serach,searchKey, s, query, q 等),
连续范围 Between and(统一用 % 代替原来的 start=1&end=2, s=1&e=2, from=1&to=2 等)
包含值(统一用 <> 代替原来的 contains, con, cts, include, ild, inc 等)
增加或扩展 (统一用 + 代替原来的 add, plus, pls, append, appd, appe 等)
减少或去除 (统一用 - 代替原来的 remove, reduce, delete, rmv, red, del 等)
比较运算 (统一用 > 代替原来的 gt, <= 代替原来的 lte,id != 1 代替原来的 "id": { "ne": 1 } 等 各种不直观的写法)
逻辑运算 (统一用 & 代替原来的 and, |(可省略) 代替原来的 or, ! 代替原来的 not 等 各种不直观的写法)
...
传统方式开发的接口,不同的人对以上的命名很可能不一样,甚至同一个人写的不同接口都有可能不一样,
前端需要针对每个接口去查看文档或找后端确定,如果复制另一个相似接口的调用代码,
而不改名称(以为搜索 key 都是 seachKey ),接口调不通最后确定是这种问题,不是很恼火?

APIJSON 对以上功能是强制这样写关键词 /符号的,不是的话,调自动化 APIJSON 是得不到正确结果的,
还可能返回具体的错误信息,例如
"GET 请求,字符 id= 不合法! key:value 中的 key 只能关键词 '@key' 或 'key[逻辑符][条件符]' 或 PUT 请求下的 'key+' / 'key-' !"
"id{}:range 类型为 Integer ! range 只能是 用','分隔条件的字符串 或者 可取选项 JSONArray !"


当然其它一些命名,例如字段名等不能抽象的东西确实是没法强制了,强制的话会导致满足不了业务需求。

3.你说的很对,但现实就有大量 PHP 等动态类型语言写的后端啊,我是见过空对象变成 [] 返回导致线上 App 挂掉的。
难道就视而不见,或者强制使用 Java,Go 等静态类型语言?谁有这个权利,还能承担这个风险?

而且即便是静态类型语言,也有部分后端开发者不遵守约定改掉类型的,开发与测试环境常见,
可能是原来的类型不满足需求,或者有代码洁癖,看不惯以前不一致的代码自己重构了,前端必须改代码来兼容。

用 APIJSON 低成本、低风险地简单解决不好吗?而且还是从源头上避免问题的发生。

4.不能,但问题是 APIJSON 起码能保证 自动化 API 是返回标准且统一的 状态码的,传统方式啥都保证不了,全靠人。
人都是懒的,能用自动化 API 简单解决的,他就不大可能会自己写,又因为大部分 CRUD 是能用自动化 API 做,
所以大部分 CRUD API 就能保证状态码标准和统一了。
至于调第三方的接口,如果是前端直接调用,则前端特殊处理;如果是后端调用,一般都是手动写的接口,
不管是前端特殊处理,还是后端转成标准的状态码,都是可行的。

5.业务逻辑、流程图又不是后端给前端的,这是产品需求给的。后端只是提供 API,告诉前端怎么调用。
至于 UML 图,基本只是后端用来描述表关系,内部交接的时候用下,前端不需要关心。

6.非常多,非常普遍,可能你所在的项目组是严格按照前后端约定好文档再开发接口,很好地落实了这个流程,
但大部分中小型企业,还真的比较少有 合理的组织、规范的流程、良好的落实、高素质的开发团队。
能用 APIJSON 低成本解决的问题,就不要用 高成本的管理 来死磕了嘛。

APIJSON 的规范统一的,你换项目、换公司还是一样,Learn once, write anywhere.
用传统方式,别说换公司、换项目、就是换个后端开发甚至只是换个接口,就很可能不一样了,得一遍遍学习和适应。

你觉得不是问题的问题,可能是你没注意到,或者你经历过的项目确实不存在,但不代表一大堆中小型企业啊。
如果都和你是一样的看法,怎么会有这么多人支持我呢?或许你的项目环境比较优越,以至于 “何不食肉糜?”


===============================================


一个项目从开源到普及是需要时间的,APIJSON 效果确实好,但还有大量业务的开发人员、企业都不知道不了解,
而且 APIJSON 确实也没有火到像 SpringBoot,Mybatis,Redis 等一样成为业内普遍认可的方案,所以还需要推广,
不太可能现在就有公司写到招聘广告里,但的确已经有一些公司、团队、个人在用了,我们经常在群里回答问题。
TommyLemon
2018-11-15 17:57:33 +08:00
@TommyLemon
并不觉得“标题立的太高了”

1. 不用写代码 -- 后端不用写代码
“因为 APIJSON 是自动化的,后端不用写代码,就能自动解析前端传的 JSON 参数...”
标题太长可能显示不下,一大堆新闻资讯(包括开源相关的)的标题不都要精简提炼下?

2. 超 Hibernate -- Star 超 Hibernate
事实依据都放上来了,一开始就是那张 Star 趋势图,还带链接,
再不信的话,APIJSON 项目链接都给了,Hibernate 你也能找到(我发的可能你又不信了),你都看下。

不是符合事实就 “早就铺天盖地的用起来了,根本用不着亲自宣传。”,
而是要有很大的影响力才能达到这个效果,一般开发者是 名企或名人 才行,可惜我都不是,只好自己宣传了。
sagaxu
2018-11-15 19:30:09 +08:00
@TommyLemon 做到后端不写代码了吗?回顾一下做过的项目,有几个能因此不用写后端代码?就算把范围缩小到 orm 这一层,也没做到完全不写代码。如果前端直接调用,只是把拼 DSL 的工作移交到了前端。如果后端自己去调用这个库,拼 json 真的比拼 sql/hql 简单吗?

你是如何得出受社区欢迎的结论的,star 数吗?我觉得这个指标毫无参考价值。我更关注贡献者数量,和衍生项目或者依赖这个项目的项目指标。

你可以自己搜搜看,结果数量很少,其中不少还是你亲自写的。网友的分享和实践几乎空白,热度跟 star 数量已经没有相关性了。

抛开流行程度或者使用人数不讲,我们只看项目本身。你我最大的分歧在于,你觉得纯 CRUD 接口在后端工作中占有很高比例,但我觉得这个比例很低,绝大多数接口都有业务逻辑夹杂在里面。真正简单的 crud,不仅不用写后端代码,前端代码也不用写,有 django 这类自带 admin 的,也有根据 db 自动生成全套代码的,甚至有外包公司点几下鼠标一个完整项目代码就自动生成了。
ooonme
2018-11-15 20:33:06 +08:00
@TommyLemon 还在讨论,你是不是以为“知道什么功能该丢掉”只是说说而已?我怕你不是对 orm 有什么误解哦,你知道 orm 是哪 3 个单词吗?跟 http,json 有半毛钱关系?如果没有请不要跟 hibernate 比较。
kran
2018-11-15 20:57:32 +08:00
其实在了解这些项目后,我是打算直接基于 SQL 来做一个实现。甚至写了个简化版 SQL 的解析器。但后来跟小伙伴讨论这样的使用场景发现不是很乐观。最大的问题就是这样把业务向前移,后端少了一层抽象,结果就是各个业务方各自为政,同样的业务实现千差万别,性能,底层数据结构变更,业务逻辑变更,都变得很出血的事情了。所以基础服务还是要老老实实实写好。当然了,如果是做做独立小项目,不妨一试。
无论形式如何,这样的东西和 leancloud 这样的平台提供的部分功能是相仿的,管他 json 也好,rest 也罢,都是一样的。
finian
2018-11-15 21:32:49 +08:00
你这个和 GraphQL 完全没有可比性啊,何来完爆一说。GraphQL 是数据交换协议,服务端没有限定使用什么数据源,不会和具体数据层耦合。你这个实际上就是 remote SQL 客户端,这种完全面向 SQL 的业务架构,大概只能用在简单小项目里吧。这种将服务端数据层直接暴露给前端的方式,耦合性太强,前端为啥需要知道你服务端用的是啥数据源?这种方式的可维护性是很差的。且不说假设有一天你们的业务数据层换成了 MongoDB 这种非关系型数据库,你这套就嗝屁了。就单单说,如果某天数据库 schema 改动升级了,前端也要一起改(能不能改还是个问题,像 Android、iOS 这种客户端,公开提供的 API 就不能再改了,除非不管旧客户端兼容性)。然后你就等着前端拿着刀来砍你们吧。
zzzmode
2018-11-15 23:11:35 +08:00
写代码总是会和需求相结合啊,是能少写代码但感觉通用性不强
derrickT
2018-11-16 09:04:13 +08:00
@biantaoGG java 一直都可以用 jar 运行的, 只是 web 应用才需要打包成 war
openthinks
2018-11-16 09:43:21 +08:00
Oracle APEX 可以了解下,直接 UI->DB,两层搞定,简单快速。我是来插科打诨的,溜。。。
wfd0807
2018-11-16 11:06:50 +08:00
想起当年的的 PowerBuilder 了,确实方便快捷了很多
但是,这相当于给用户提供一个 db 查询的入口,而且是可编程的
这个风险要考虑
Sharuru
2018-11-16 11:34:01 +08:00
推广未免过分了点,前几天 Hibernate ORM 讨论贴里都是你在回复,推广也是,大段文字令人毫无兴趣。
FrailLove
2018-11-16 11:51:08 +08:00
感觉就是 DB->服务器端->前端 砍掉了 服务器端 减少了一层抽象 面向对象也不需要了
hand515
2018-11-16 11:53:03 +08:00
后台做 BI 展示可能还是有点用
clino
2018-11-16 19:34:28 +08:00
楼主项目组织有点乱,看起来比较山寨,如果规整些喷的人会少一点

我有兴趣参考来实现 python 版的试试,有规范的无关具体实现的协议定义文档吗?
TommyLemon
2018-11-18 17:24:13 +08:00
@clino
说的是最后生态内开源库的链接吧,
排版预览时还是正常的,发出来就没对齐了。

设计规范
https://github.com/TommyLemon/APIJSON/blob/master/Document.md#3

如何实现其它语言的 APIJSON ?
https://github.com/TommyLemon/APIJSON/issues/38
TommyLemon
2018-11-18 17:24:37 +08:00
其它评论下周回吧
TommyLemon
2018-11-19 23:31:44 +08:00
@ooonme 你对 APIJSON 都没了解清楚就不要瞎评论了。
APJSON 就是一种 JSON 格式的 ORM 协议,APIJSONLibrary 就是基于这个协议实现的一个 ORM 库,
只负责将 JSON 对象解析为 SQL,以及校验权限。
https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Java-Server/APIJSONLibrary
至于 HTTP 请求,那是基于 SpringBoot 开发的 APIJSONDemo 实现了 7 个自动化 API,调用 ORM 库来实现 CRUD。
https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Java-Server/APIJSONDemo

JSON 对象难道不是对象?这么说 Sequelize,TypeORM 等一堆 JavaScript ORM 库都不能叫 ORM 库了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/507671

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX