Skip to content

Files

Latest commit

author
stonexwang
Sep 16, 2021
368ad37 · Sep 16, 2021

History

History
This branch is up to date with vcoolwind/apijson-practice:main.

apijson-jdbc-demo

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Sep 16, 2021
Sep 16, 2021
Sep 16, 2021
# 参考项目
https://github.com/jerrylususu/apijson_todo_demo/blob/master/FULLTEXT.md
https://github.com/Tencent/APIJSON/wiki#%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86

# 快速跑起来
1. 建立数据库,创建apijson必须以来的几张表
   * 执行apijson.sql文中的sql语句(apijson依赖表)
   * 执行todo.sql(业务依赖表)

2. 使用postman导入文件demo.postman_collection.json

3. 运行程序,测试postman中的各个用例

# 代码解读
1. apijson orm本身就一个orm工具,更好的一点是不需要编码即可完成相关的upad
2. 数据库链接相关配置在DemoSQLConfig中,如IP、Port、DataBase、user、password等信息
3. CommonController 定义了对数据库表的通用增删改查操作,UserController定义了自定义的入口操作,和传统的spring mvc没有差异。
4. 每个业务表的访问权限控制在Access表中,决定了CURD都对哪些角色开放,系统启动时读取该表写入内存 AbstractVerifier.ACCESS_MAP 中,执行时进行判决,数据变更需要重启服务。
5. 每个请求基于tag进行检查设置,检查规则保存在Request表中,系统启动时读取该表写入内存 AbstractVerifier.REQUEST_MAP 中,执行时进行判决,数据变更需要重启服务。
6. 对外公开的函数写入在表Function中, 系统启动时读取该表写入内存 AbstractFunctionParser.FUNCTION_MAP 中,执行时进行判决,数据变更需要重启服务。

# 一个简单的demo需要做哪些事情?
1. 创建apijson数据库及对应的系统表,初始化必要的数据;
2. 创建业务表,并根据业务表的权限设置Access表数据
3. 确定每个访问方法的request的规则,这个就是业务逻辑的体现
4. 创建继承于APIJSONSQLConfig实体类,用于确定数据库访问方式;创建继承于APIJSONFunctionParser的实体类,
   暴露对外的函数,并在Function中配置访问规则。
   函数又可以在request中进行配置,作为业务处理签的校验:{"Todo": {"MUST": "id", "REFUSE": "userId", "UPDATE": {"checkCanPutx-()": "isUserCanPutTodo(id)"}}}
   在对todo进行修改时,通过设置checkCanPutx-(),在业务处理前,先调用isUserCanPutTodo完成检查。
   
5. 创建继承于APIJSONController的实体类,进行post到restful的转换。
6. model不是必须的,除非有json到model的转换,并进行业务的处理。如本demo中,Moment有表即可处理,不需要新建立一个Moment的Model来对应。

# 几点解读
1. apijson本质上完成了json到sql的转换,通过灵活的语法来生成sql。难点是orm对应的sql生成器。
2. jdbc方式,演示了系统表和业务表必须在一个库中的场景
3. 通过系统的三张表,控制了访问权限、请求格式校验、远程函数调用检验,这个思路还是不错的。


4. 几个优化点:
   * 通过注解实现这三张表,可以完全脱离数据库的使用。
     通过三个注解(MethodAccess、RequestStructure、FunctionDef),动态完成对ACCESS_MAP、REQUEST_MAP、FUNCTION_MAP的填充;
     全部使用注解,是可以完成所有动作的,比如本demo中的MomentComment类,通过添加MethodAccess和RequestStructure,使用扩展框架的如下代码,完成动态的规则设置:
     ApiJsonAnnotationUtil.fillAccessMap(MomentComment.class);
     ApiJsonAnnotationUtil.fillRequestMap(MomentComment.class);
     
   * 函数强制绑定在一个APIJSONFunctionParser是不合适的,可以使用内存对象的方式搞定。
   * 抽空了再实现一个FunctionDef注解,就可以废弃三张表了。