APIJSON Versions Save

🏆 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构。 🏆 A JSON Transmission Protocol and an ORM Library 🚀 provides APIs and Docs without writing any code.

5.2.0

1 year ago

功能

新增支持物联网时序数据库 TDengine,对应 Demo APIJSONBoot-MultiDataSource2677A7863B725488AE4FD8B7DC4FEEFB AE875F70EA0A5E6D6D72AD528B1E3836 C37146C233CE53077C7584D4AB4F0BC3 image

新增对 Year, Month, DayOfWeek 的支持; 完善数据库版本判断,兼容 MySQL 8.0 以上和以下版本,适配正则匹配、窗口函数等;

解决 APP JOIN 一对多时子数组长度超过预设范围; fix: sql join缓存丢失而出现1+N查询问题,感谢用户 架构 - Jar @github291406933 再次贡献 #417;

大幅提升 APP JOIN 一对多时子数组查询和缓存性能; 优化 Join.isOne2Many 判断性能; 优化一对多 APP JOIN 的缓存逻辑;

记录 SQL JOIN 副表的聚合函数结果和之前不一致问题;

文档

doc: 修改文档错别字'借口'为'接口' issue #420,感谢 @Finkyky 的贡献 #421; 修改 APIJSON初期构思及实现.pages 中的错别字; 用户:腾讯外有华为、华能、百度、快手、中兴、圆通、传音等;

其它

如果你 提 PR 登记了自己使用 APIJSON 的公司,可以加 企业用户支持群,作者亲自且优先答疑, 只有解答了这个群里的全部问题,才看情况解答其它群里的问题(其它群不保证解答、更不保证及时)。

如果你为 APIJSON 做出了以下任何一个贡献: 提交了 PR 且被合并提交了优质 Issue发表了优质文章开发了可用的生态项目, 可以在群里发出贡献链接并附带说明,管理员将设置关注你一段时间,优先答疑解惑。 其它群一般解答顺序:贡献者 > 帮助他人的群友 > 带企业名昵称 > 带岗位名昵称 > 其他群友。

5.1.5

1 year ago

新增支持跨层级 APP JOIN,感谢 @github291406933 的贡献 #413 ; image

新增对 LocalDateTime 类型支持,感谢 @MentosL 的贡献 #394 ;

还原依赖 javax.activation,实测 JDK 11, 13 都需要; 修复多字段参与 JOIN 时,没有命中缓存而出现的 1+N 查询性能问题,感谢 @github291406933 的贡献 #403 ; 完善对 APP JOIN 的 SQL 执行与缓存次数统计; 解决 @combine:"(a | b) & (c | d)" 这种任意条件组合情况下有时预编译值错位导致 SQL 报错; 解决 APP JOIN 副表返回内部字段 @RAW@LIST;

升级 fastjson 版本至 1.2.83

相关推荐新增 腾讯业务百万数据 6s 响应,APIJSON 性能优化背后的故事

数量级 4.7.0(5次取平均值) 4.8.0(5次取平均值) 是否正常回包 where条件 性能提升
10W 1.739s 1.159s 50%。即((1/1.159-1/1.739)/(1/1.739))*100%
20W 3.518s 2.676s 31.5%
50W 9.257s 6.952s 33.2%
80W 16.236s 10.697s -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok。 51.8%
100W 19.748s 14.466s -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok 36.5%
10W 1.928s 1.392s "x_xid{}":[xxxx36,xxxx38],覆盖数据超过100W数据。 38.5%
20W 4.149s 2.852s "x_xid{}":[xxxx36,xxxx38] 45.5%
50W 10.652s 7.231s "x_xid{}":[xxxx36,xxxx38] 47.3%
80W 16.975s 12.465s 调整了-Xmx后正常回包 "x_xid{}":[xxxx36,xxxx38] 36.2%
100W 20.632s 16.481s 调整了-Xmx后正常回包 "x_xid{}":[xxxx36,xxxx38] 25.2%

5.1.0

1 year ago

功能

请求参数校验:REFUSE 新增支持 !key 排除禁止字段,优化 MUST 和 REFUSE 处理性能; 部分常量改为可自定义静态变量;

解决 PUT 不能完整替代 json, jsonb 字段的数组值,感谢 @weiwei162 的贡献 #387; 解决 Oracle 分页获取时无法获取除第一页以外的数据,感谢 @SingleDogL 的贡献 #390; 解决高并发下生成主键冲突导致新增记录失败等; 解决关闭权限校验时 POST 请求传 userId 无效,加强对 POST 请求内字段格式的校验; 解决 format: true 在 Log.DEBUG 时也不返回 SQL、时间等调试信息; 解决 JOIN 副表返回空对象; 解决预估容量判断 NOT 条件用错逻辑 key;

优化 SQL 执行缓存; 优化角色权限、参数校验、远程函数的初始化; 优化登录报错和远程函数执行报错的提示; 优化主键泛型; 优化代码; 删除不再需要的依赖 javax.activation; 升级自身版本为 5.1.0;

文档

更新 @combine 条件组合说明为 5.0+ 的条件任意组合格式; 更新 5.0 新增的 @having&:"...", @having:{...} 两种用法; 完善 JOIN 的类型以及 join:{...} 这种可带 ON 及功能符的写法; 完善 JOIN ON 的各种关联方式、支持多字段关联、支持其它条件的说明; 相关推荐新增 apijson在同一个接口调用中 使用远程函数写入更新时间和创建时间,感谢博主,点赞、收藏支持下博主吧~ 生态项目新增 路由插件 apijson-router,对外暴露类 RESTful 接口,内部转成 APIJSON 接口执行,点 Star 支持下作者吧~

兼容性

AbastractSQLConfig 中

原来的 IdCallback 加了泛型 <T extends Object>,并且 Object newId(RequestMethod method, String database, String schema, String table) 改为 T newId(RequestMethod method, String database, String schema, String datasource, String table); 原来的 Callback 加了泛型 <T extends Object>,并且 SQLConfig getSQLConfig(RequestMethod method, String database, String schema, String table) 改为 SQLConfig getSQLConfig(RequestMethod method, String database, String schema, String datasource, String table); 原来的 SimpleCallback 加了泛型 <T extends Object>; 如果业务后端项目直接调用或重写了相关方法,需要对应修改; https://github.com/Tencent/APIJSON/commit/8df36e26d7ad74f2df4df4e9ce5b29530d814141

AbstractSQLExecutor 中

SQLExecutor.KEY_RAW_LIST 移到 AbstractSQLExecutor,如果业务后端项目直接引用了这个常量,需要对应修改; 原来的缓存读写方法 putCache, removeCache, getCache, getCacheItem 中最后参数 int type 都改为了 SQLConfig config,如果业务后端项目直接调用或重写了相关方法,需要对应修改; https://github.com/Tencent/APIJSON/commit/8df36e26d7ad74f2df4df4e9ce5b29530d814141

Parser 中

用于接口限流的配置参数 DEFAULT_QUERY_COUNT, MAX_QUERY_PAGE, MAX_QUERY_COUNT, MAX_UPDATE_COUNT, MAX_SQL_COUNT, MAX_OBJECT_COUNT, MAX_ARRAY_COUNT, MAX_QUERY_DEPTH 全都移到 AbstractParser,如果业务后端项目直接引用了这些常量,需要对应修改; https://github.com/Tencent/APIJSON/commit/8df36e26d7ad74f2df4df4e9ce5b29530d814141

pom.xml 中

移除了依赖 javax.activation https://github.com/Tencent/APIJSON/commit/95432dde2c7a1f5147f9fe2f77f5500d33c651d0 如果用 JDK 11 +,可能编译不通过或运行报错,可以在自己项目 <dependencies></dependencies> 标签内加上:

		<dependency>
			<groupId>javax.activation</groupId>
			<artifactId>activation</artifactId>
			<version>1.1.1</version>
		</dependency>

5.0.0

2 years ago

功能

条件组合新增支持任意逻辑表达式 @combine:"a | (b & !(c | d))"; image

JOIN 新增支持多个字段关联及引用赋值; image

JOIN ON 新增支持带非引用赋值关联的普通条件; image

JOIN ON 新增支持 {}, <>, $, ~, !, >, <, >=, <= 等多种关联方式; image

& INNER JOIN 新增支持单独设置 JOIN 语句中的字段、条件、分组、聚合、排序等; image

* CROSS JOIN 允许没有 JOIN ON 引用赋值关联条件; 模糊搜索 key$:value 新增支持 key 中定制占位符 %, _ 与 value 的拼接方式; 包含选项范围新增支持传路径,例如 key<>:{ path: "$", value:82001 };

聚合函数 @having 支持复杂条件组合,且新增 @having& 简化 AND 连接的写法; image

对 @having:"表达式" 和 key{}:"表达式" 新增支持单引号、反引号、各种关键词等; 新增支持 @having:"match(arg0..)AGAINST(..)%2=1" 全文检索等函数后带数学表达式; image

对 key{}:">0;length(key)<=5" 新增支持部分为 RAW SQL; 新增支持 NULL 值 @null:"tag"; 新增支持类型转换 @cast:"date:DATE"; 新增数组关键词 compat 解决对聚合函数字段通过 query:2 分页查总数返回值错误; 状态信息 msg 新增提问注意事项;

权限控制:分拆对角色的校验的代码为多个方法,方便灵活重写部分代码; 完善对 id, id{}, userId, userId{} 的条件强制前置 AND 处理; 预估容量新增对 HAVING 聚合函数的处理; 拼错单词 globle 纠正为 global; 去除不必要的 synchonized; 原来的 combine 重命名为 combineMap,combineExpression 重命名为 combine;

升级自身, fastjson 版本分别为 5.0.0, 1.2.79;


使用登记

新增 珠海采筑电子商务有限公司(房地产巨头万科发起),多个项目使用,感谢 @fanpocha 的登记 #367; image

新增 乐拼用车 的 Logo,感谢 @VamChao 的登记 #187#issuecomment-1009633459

image


文档

新增功能演示及说明的 GIF 图; image


image


兼容性

AbastractSQLConfig 原来的 combine 重命名为 combineMap,combineExpression 重命名为 combine,如果业务后端项目直接调用或重写了相关方法,需要对应修改; https://github.com/Tencent/APIJSON/commit/b248c698887728bd826febd77c4404dd1faecf06

拼错单词 globle 纠正为 global,涉及 Parser 及 AbstractParser 中 getGlobleXXX, setGlobleXXX 14 个方法,如果业务后端项目直接调用或重写了相关方法,需要对应修改; https://github.com/Tencent/APIJSON/commit/d7c311554042620a91faf8f4a63ebcf9a2fd0be2

聚合函数 "@having":"SQL表达式1;SQL表达式2" 默认由 AND 连接改为 OR 连接,改用 "@having&":"SQL表达式1;SQL表达式2" 实现 AND 连接,如果前端(客户端)已经在线上生产环境用了旧方式,后端可以修改 AbstractSQLConfig.IS_HAVING_DEFAULT_AND = true 来兼容 https://github.com/Tencent/APIJSON/commit/9776408d63bc1d768cdd97d910f6b2243b2a94a8

聚合函数 "@having":"toId>0" 这种不包含 SQL 函数的表达式,默认不再支持,可改为 "@having":"(toId)>0",如果前端(客户端)已经在线上生产环境用了旧方式,后端可以修改 AbstractSQLConfig.IS_HAVING_ALLOW_NOT_FUNCTION = true 来兼容 https://github.com/Tencent/APIJSON/commit/9776408d63bc1d768cdd97d910f6b2243b2a94a8


腾讯工程师公开称赞

腾讯 IEG 数据产品开发组负责人 xinlin: ”腾讯的 APIJSON 开源方案,它可以做到零代码生成接口和文档,并且整个生成过程是自动化。

当企业有元数据的时候,马上就可以获得接口“

引用来源:腾讯游戏业务竟然是这样利用低代码平台的 | ArchSummit 全球架构师峰会 2021(深圳) image


腾讯科技 后台开发高级工程师 雷大锤: “可以抽出时间来看apijson了,这个可以为T10做准备,也是业界很火的东西,可以提升个人影响力!”

引用来源:腾讯人工作日常—在沟通和扯皮中度过的一周 image



APIJSON - 零代码、全功能、强安全 ORM 库

腾讯开源前十、内外五个奖项,后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构 http://apijson.cn image image

4.9.1

2 years ago

新增支持 Hive 及 Hadoop,感谢 @chenyanlann 的贡献 #353 #356 以及生态项目 APIJSONBoot_Hive,大家可以点 Star 支持下~ 调试时间字段新增 parse 和 sql 两个时长,例如 "time:start|duration|end|parse|sql": "1641751048573|145|1641751048718|50|95";

提升 JOIN 结果集解析性能,减少 ArrayList 反复扩容的性能开销;

新增登记 腾讯音乐、传音、社宝科技、华能贵诚信托、投投科技、圆通、乐拼科技 等公司名及链接。

4.8.3

2 years ago

功能特性

报错信息新增搜索链接及带环境信息的提交问题模板,帮助用户自行解决及提交问题;

解决 LEFT/RIGHT JOIN 副表关联主表外键的字段取别名导致 SQL 报错 #346; 解决 SQL JOIN 副表包含 SQL 函数时没有返回 SQL 函数的执行结果以及未用上 SQL 缓存导致冗余 SQL 查询 #341; 解决 SQL JOIN 副表除了引用赋值键值对还有 id/id{}/userId/userId{} 键值对时不能命中缓存,导致 一对多、多对多副表数据重复 以及 一对一、多对一 查询性能问题 #341; 解决某个字段值为 null 导致中断后续正常返回值; 解决 AbstractVerifier.verifyAccess 只允许 Number 类型的 id,并优化变量名;

优化 SQL JOIN 副表解析结果集 ResultSet 的性能(减少同副表字段的重复逻辑),实测提升 6%-21% #354; 删除多余且未实际用上的的 Response.java;

周边生态

新增基于 Hyperf&Swoole 的 PHP 协程版 APIJSON 叫 hyperf-APIJSON,感谢 @kvnZero 的贡献; 新增接入 IBM DB2 的 Demo 叫 apijson-db2,感谢 @andream7 的贡献; 新增接入 ClickHouse Demo 叫 APIJSONDemo,感谢 @qiujunlin 的贡献; 新增使用 Gradle 依赖构建的 APIJSON Java 模版 apijson_template,感谢 @abliger 的贡献; 新增适配 Oracle 事务的 api-json-demo,感谢 @hxdwd 的贡献;

创作不易,右上角点 ⭐Star 支持下项目作者们吧~

相关推荐

新增文章 使用APIJSON写低代码Crud接口,感谢博主的贡献;

新增 7 篇代码分析相关系列文章,基本都是 27 篇中的开篇,感谢 3 个博主的贡献: APIJSON(一:综述) APIJSON 代码分析(三:demo主体代码) APIJSON 代码分析(二)AbstractParser类(解析器) APIJSON 代码分析(四:AbstractObjectParser源码阅读) APIJSON 代码分析 AbstractSQLConfig 第二篇 APIJSON 代码分析(六)APIJSON—Verifier检查类 APIJSON 代码分析(四)AbstractSQLExecutor—SQL执行器

可以点赞/收藏支持下文章博主们哦~

其它

完善图文教程、路线规划等;

4.8.0

2 years ago

新增支持 ClickHouse,感谢 @chenyanlann、@qiujunlin 的贡献 #307 #309; 新增支持 PostgreSQL, Oracle 等数据库的窗口函数 OVER(PARTITION BY .. ORDER BY ..),感谢 @qiujunlin 的贡献 #305; 重构 enum RequestRole 为 String 方便用户自定义扩展; 新增对 PUT 默认支持条件,不传 @combine 也行,感谢 @chenyanlann 的贡献 #307; 修改 @column 中的解析代码,使之支持带 SQL 关键词、单引号 'value' 等字符串,感谢 @qiujunlin 的贡献 #305; 新增支持 @column:"`key`" 反引号指定字段名以及 @column:"cast(`date` AS TIME)" 这种在函数内 `key` 与关键词等组合的格式; 新增支持 CASE WHEN,例如 (CASE sex WHEN 0 THEN '男' WHEN 1 THEN '女' ELSE '其它' END);

解决表对象中的子表对象数据总是一样以及在 Table[]:{ Table:{ ChildTable:{} } } 情况下只有首个 Table 里返回了 ChildTable; 解决聚合与分组等统计语句不支持 HAVING 等,感谢 @LiXinnnnnn 的贡献 #311; 解决 PUT "balance+": 1 未加到 update set 导致报错; 解决 PUT "key<>":[] 等被错误地转成了 SQL 条件 key = '[]' 等,感谢 @chenyanlann 的贡献 #307; 解决 PUT Table[] 请求中在某些情况下传远程函数无效的 bug,感谢 @WaizLee 的贡献 #324; 解决对 Oracle 的子查询 SELECT 语法错误的问题,感谢 @qiujunlin 的贡献 #309; 解决对 PostgreSQL 重复设置事务等级的 bug,感谢 @bullhe4d 的贡献 #316;

优化 Table[]:{ Table:{} } 这种单表数组的查询性能,实测提升 19%-27% #315; 将隐藏字段功能单独抽取方法 isHideColumn,方便重写来自定义; 抽取根据 tag 自动包装请求结构的方法为 wrapRequest,方便实现 简单形式的接口; AbstractSQLConfig 中 getValue 和 preparedValueList 修饰符改为 protected 方便子类重写来实现兼容 Oracle DATETIME,TIMESTAMP 等日期时间类型,例如对应 POST/PUT 的 to_date(?,'yyyy-mm-dd hh24:mi:ss'); Parser 移除未用上且没必要的方法 parseCorrectResponse; 删除部分已废弃的方法;

通用文档 新增本身说明、3.2 功能符 全局关键词和"@datasource":"DRUID" 跨数据源、3.1 操作方法 简单接口相关文档; Pull Request 新增小改文档或代码 的简要步骤; 更新 详细的说明文档.md,修复一些错误或过时的内容; 完善 保持与 APIJSON 仓库的同步 的可视化操作步骤; 解决中英文首页文档部分用户 Logo 不显示,感谢 @sy-records 的贡献 #325;

生态周边项目新增 apijson-practice,感谢 BAT 技术专家 vcoolwind 的贡献; 增加一个示例项目和一篇文章,感谢 @jerrylususu 的贡献 #291; 新增 apijson-go 的链接,感谢作者 @j2go 的贡献 #apijson-go 新增包括 1 个腾讯工程师在内的 8 个贡献者,感谢大家的贡献; 主项目贡献者新增 1 人,生态项目贡献者新增 7 人,感谢大家的贡献; 使用登记新增圆通公司(场景:大数据应用APP内部接口);

兼容性:

重构 enum RequestRole 为 String 方便用户自定义扩展, 移除了原有的 apijson.RequestRole.java, 改为了现在的 apijson.orm.AbstractVerifier 中的 String 常量

	/**未登录,不明身份的用户
	 */
	public static final String UNKNOWN = "UNKNOWN";

	/**已登录的用户
	 */
	public static final String LOGIN = "LOGIN";

	/**联系人,必须已登录
	 */
	public static final String CONTACT = "CONTACT";

	/**圈子成员(CONTACT + OWNER),必须已登录
	 */
	public static final String CIRCLE = "CIRCLE";

	/**拥有者,必须已登录
	 */
	public static final String OWNER = "OWNER";

	/**管理员,必须已登录
	 */
	public static final String ADMIN = "ADMIN";

如果你的业务项目中用到了 RequestRole 相关代码,则:

1.所有 apijson.RequestRole.角色名 全局替换为 apijson.orm.AbstractVerifier.角色名; 2.所有类型为 RequestRole 的地方全局替换为 String; 3.所有 role == RequestRole.角色名 全局替换为 AbstractVerifier.角色名.equals(role);

腾讯 CSIG 某项目性能测试结果

MySQL 5.7 共 1.9KW 记录的大表,统计 CRUL 10-20M/s 网速从发起请求到接收完回包的总时长,具体见 https://github.com/Tencent/APIJSON/issues/315#issuecomment-975603059

数量级 4.7.0(5次取平均值) 4.8.0(5次取平均值) 是否正常回包 where条件 性能提升
10W 1.739s 1.159s 50%。即((1/1.159-1/1.739)/(1/1.739))*100%
20W 3.518s 2.676s 31.5%
50W 9.257s 6.952s 33.2%
80W 16.236s 10.697s -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok。 51.8%
100W 19.748s 14.466s -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok 36.5%
10W 1.928s 1.392s "x_xid{}":[xxxx36,xxxx38],覆盖数据超过100W数据。 38.5%
20W 4.149s 2.852s "x_xid{}":[xxxx36,xxxx38] 45.5%
50W 10.652s 7.231s "x_xid{}":[xxxx36,xxxx38] 47.3%
80W 16.975s 12.465s 调整了-Xmx后正常回包 "x_xid{}":[xxxx36,xxxx38] 36.2%
100W 20.632s 16.481s 调整了-Xmx后正常回包 "x_xid{}":[xxxx36,xxxx38] 25.2%

4.7.2

2 years ago

解决远程函数拿不到有效的当前对象,导致校验参数容易放行等问题 #281 ; 解决操作符 UNIQUE 校验不允许重复失效 #282 ;

优化文档,贡献者名单新增圆通工程师等 3 人,感谢贡献 #278 #279 #280 ; 删除多余的文件; 升级版本号为 4.7.2;

4.7.1

2 years ago

解决 @raw 对应值包含 date_format 等特殊文本时查询报错,感谢圆通工程师反馈 bug 及贡献源码 #278 ; D7F11B88E79952A8929003A1E60FB090 7A2B158EF0CD41F1136A4970D1F19876

4.7.0

2 years ago

新增数据源关键词 @datasource,可由业务完全自定义,感谢腾讯同事 fineday009 #251 ; 去除 JSONResponse 中 KEY_CODE 等常量的 final 关键字,方便业务重新定义 ok、code、msg 字段名,感谢 gujiachun #227 ;

解决 > RIGHT JOIN, ^ SIDE JOIN, ! ANTI JOIN, ) FOREIGN JOIN 等不返回副表数据; 解决 | FULL JOIN 返回的副表数据部分是错的; 分页:解决 query=2 不兼容 主表 @column:"fun()" 这种包含 SQL 函数的写法; SQL 函数:获取右括号 ) 的位置从 indexOf 改为 lastIndexOf,解决多个右括号解析问题; 解决 JOIN 副表有 引用赋值 外的条件时因为缓存 SQL WHERE 中条件顺序不一致导致多余查询; 解决查询计划 @explain 不支持增删改方法;在分页详情 info 内返回查询计划 @explain; 更新为最新的手机号正则表达式匹配,感谢 Rkyzzy #241 ;

log print current time, thanks to Tencent colleague jun0315 #250 ; 优化 system.err.printlin 输出,感谢 kxlv2000 #238 ; 对 JSONResponse.java中 的 formatHyphen 方法的优化,感谢 403f #217 ; 使用 entrySet 迭代器替代 keySet 迭代器提高效率,感谢 Rkyzzy #224 ; Using Arrays.toString() to deal with methods array, thanks to gdjs2 #221 ; 将 StringUtil.java 类中三处字符串直接拼接优化为使用 StringBuilder 拼接,感谢 Rkyzzy #222 ; Format the code & Replace the Long(String) by Long.valueOf(String), thanks to gdjs2 #225 ;

Update README-English.md, thanks to Tencent colleague Wscats #235 ; 修改 Document 文档 OUTER JOIN 拼写错误,感谢腾讯同事 caohao-php #233 ;