APIJSON学习操作Oracle数据库

APIJSON学习操作Oracle数据库

​ APIJSON是腾讯开源的, 主打零代码接口和文档, 解决后端开发接口问题。目前公司前端开发者与后台开发者一比一关系,后端开发者无法快速满足前端所需接口,故想寻找一种万能接口,来保证前端的查询接口不在需要后端开发者支持,故而学习使用了下APIJSON, 公司使用的Oracle数据库,在学习中碰到的问题记录一下。

1.环境配置

  • JDK: 1.8.0_191
  • MAVEN: 3.6.3
  • Oracle:11.2.0.4.0
  • IntelliJ IDEA :2021.1.3
  • ApiFox:2.2.10

2.下载项目

git clone https://github.com/APIJSON/APIJSON-Demo.git

在这里插入图片描述

3.将必须的脚本导入到Oracle数据

  • Access表

    ---1.创建表语句
    CREATE TABLE "Access" (
     "id" NUMBER(20) NOT NULL,
     "debug" NUMBER(4) NOT NULL,
     "name" NVARCHAR2(50) NOT NULL,
     "alias" NVARCHAR2(20),
     "get" NVARCHAR2(100) NOT NULL,
     "head" NVARCHAR2(100) NOT NULL,
     "gets" NVARCHAR2(100) NOT NULL,
     "heads" NVARCHAR2(100) NOT NULL,
     "post" NVARCHAR2(100) NOT NULL,
     "put" NVARCHAR2(100) NOT NULL,
     "delete" NVARCHAR2(100) NOT NULL,
     "date" DATE NOT NULL,
     "detail" NVARCHAR2(1000)
    );
    ALTER TABLE "Access" ADD PRIMARY KEY ("id");
    
    --2.表注释
    COMMENT ON COLUMN "Access"."debug" IS '是否为调试表,只允许在开发环境使用,测试和线上环境禁用';
    COMMENT ON COLUMN "Access"."name" IS '实际表名,例如 apijson_user';
    COMMENT ON COLUMN "Access"."alias" IS '外部调用的表别名,例如 User';
    COMMENT ON COLUMN "Access"."get" IS '允许 get 的角色列表,例如 ["LOGIN", "CONTACT", "CIRCLE", "OWNER"]
    用 JSON 类型不能设置默认值,反正权限对应的需求是明确的,也不需要自动转 JSONArray。
    TODO: 直接 LOGIN,CONTACT,CIRCLE,OWNER 更简单,反正是开发内部用,不需要复杂查询。';
    COMMENT ON COLUMN "Access"."head" IS '允许 head 的角色列表,例如 ["LOGIN", "CONTACT", "CIRCLE", "OWNER"]';
    COMMENT ON COLUMN "Access"."gets" IS '允许 gets 的角色列表,例如 ["LOGIN", "CONTACT", "CIRCLE", "OWNER"]';
    COMMENT ON COLUMN "Access"."heads" IS '允许 heads 的角色列表,例如 ["LOGIN", "CONTACT", "CIRCLE", "OWNER"]';
    COMMENT ON COLUMN "Access"."post" IS '允许 post 的角色列表,例如 ["LOGIN", "CONTACT", "CIRCLE", "OWNER"]';
    COMMENT ON COLUMN "Access"."put" IS '允许 put 的角色列表,例如 ["LOGIN", "CONTACT", "CIRCLE", "OWNER"]';
    COMMENT ON COLUMN "Access"."delete" IS '允许 delete 的角色列表,例如 ["LOGIN", "CONTACT", "CIRCLE", "OWNER"]';
    COMMENT ON COLUMN "Access"."date" IS '创建时间';
    COMMENT ON TABLE "Access" IS '权限配置(必须)';
    
    --3.插入2条要访问的表
    INSERT INTO "Access" VALUES ('31', '0', 'EO_C_ORDER', 'EoCOrder', '["UNKNOWN", "LOGIN", "CONTACT", "CIRCLE", "OWNER", "ADMIN"]', '["UNKNOWN", "LOGIN", "CONTACT", "CIRCLE", "OWNER", "ADMIN"]', '["LOGIN", "CONTACT", "CIRCLE", "OWNER", "ADMIN"]', '["LOGIN", "CONTACT", "CIRCLE", "OWNER", "ADMIN"]', '["UNKNOWN","LOGIN","OWNER", "ADMIN"]', '["OWNER", "ADMIN"]', '["ADMIN"]', TO_DATE('2018-11-29 00:28:53', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Access" VALUES ('34', '0', 'EO_C_ORDER_EXTENSION', 'EoCOrderExtension', '["UNKNOWN", "LOGIN", "CONTACT", "CIRCLE", "OWNER", "ADMIN"]', '["UNKNOWN", "LOGIN", "CONTACT", "CIRCLE", "OWNER", "ADMIN"]', '["LOGIN", "CONTACT", "CIRCLE", "OWNER", "ADMIN"]', '["LOGIN", "CONTACT", "CIRCLE", "OWNER", "ADMIN"]', '["UNKNOWN","LOGIN","OWNER", "ADMIN"]', '["OWNER", "ADMIN"]', '["ADMIN"]', TO_DATE('2018-11-29 00:28:53', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    COMMIT;
    
  • Function表

    注意:官网下的ORACLE 脚本可能存在问题,启动的时候报错, 修改了以下几点,参考官网MySQL改的
    1.删除type字段, 新增returnType字段 【 "returnType" NVARCHAR2(50) 】
    2.插入的语句中返回类型[returnType]字段,部分由Object改为 int、boolean、null、String
    
    --1.创建表语句
    CREATE TABLE "Function" (
     "id" NUMBER(20) NOT NULL,
     "userId" NUMBER(20) NOT NULL,
     "name" NVARCHAR2(50) NOT NULL,
     "arguments" NVARCHAR2(100),
     "demo" CLOB NOT NULL,
     "detail" NVARCHAR2(1000) NOT NULL,
     "returnType" NVARCHAR2(50) ,
     "version" NUMBER(4) NOT NULL,
     "tag" NVARCHAR2(20),
     "methods" NVARCHAR2(50),
     "date" DATE NOT NULL,
     "back" NVARCHAR2(45)
    );
    ALTER TABLE "Function" ADD PRIMARY KEY ("id");
    
    --2.表注释
    COMMENT ON COLUMN "Function"."userId" IS '管理员用户Id';
    COMMENT ON COLUMN "Function"."name" IS '方法名';
    COMMENT ON COLUMN "Function"."arguments" IS '参数列表,每个参数的类型都是 String。
    用 , 分割的字符串 比 [JSONArray] 更好,例如 array,item ,更直观,还方便拼接函数。';
    COMMENT ON COLUMN "Function"."demo" IS '可用的示例。
    TODO 改成 call,和返回值示例 back 对应。';
    COMMENT ON COLUMN "Function"."detail" IS '详细描述';
    COMMENT ON COLUMN "Function"."type" IS '返回值类型。TODO RemoteFunction 校验 type 和 back';
    COMMENT ON COLUMN "Function"."version" IS '允许的最低版本号,只限于GET,HEAD外的操作方法。
    TODO 使用 requestIdList 替代 version,tag,methods';
    COMMENT ON COLUMN "Function"."tag" IS '允许的标签.
    null - 允许全部
    TODO 使用 requestIdList 替代 version,tag,methods';
    COMMENT ON COLUMN "Function"."methods" IS '允许的操作方法。
    null - 允许全部
    TODO 使用 requestIdList 替代 version,tag,methods';
    COMMENT ON COLUMN "Function"."date" IS '创建时间';
    COMMENT ON COLUMN "Function"."back" IS '返回值示例';
    COMMENT ON TABLE "Function" IS '远程函数。强制在启动时校验所有demo是否能正常运行通过';
    
    --3.必须插入,否则项目启动时报各种错误
    INSERT INTO "Function" VALUES ('3', '0', 'countArray', 'array', '{"array": [1, 2, 3]}', '获取数组长度。没写调用键值对,会自动补全 "result()": "countArray(array)"', 'int', '0', NULL, NULL, TO_DATE('2018-10-13 16:23:23', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('4', '0', 'countObject', 'object', '{"object": {"key0": 1, "key1": 2}}', '获取对象长度。', 'int', '0', NULL, NULL, TO_DATE('2018-10-13 16:23:23', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('5', '0', 'isContain', 'array,value', '{"array": [1, 2, 3], "value": 2}', '判断是否数组包含值。', 'boolean', '0', NULL, NULL, TO_DATE('2018-10-13 16:23:23', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('6', '0', 'isContainKey', 'object,key', '{"key": "id", "object": {"id": 1}}', '判断是否对象包含键。', 'boolean', '0', NULL, NULL, TO_DATE('2018-10-13 16:30:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('7', '0', 'isContainValue', 'object,value', '{"value": 1, "object": {"id": 1}}', '判断是否对象包含值。', 'boolean', '0', NULL, NULL, TO_DATE('2018-10-13 16:30:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('8', '0', 'getFromArray', 'array,position', '{"array": [1, 2, 3], "result()": "getFromArray(array,1)"}', '根据下标获取数组里的值。position 传数字时直接作为值,而不是从所在对象 request 中取值', 'Object', '0', NULL, NULL, TO_DATE('2018-10-13 16:30:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('9', '0', 'getFromObject', 'object,key', '{"key": "id", "object": {"id": 1}}', '根据键获取对象里的值。', 'Object', '0', NULL, NULL, TO_DATE('2018-10-13 16:30:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('10', '0', 'deleteCommentOfMoment', 'momentId', '{"momentId": 1}', '根据动态 id 删除它的所有评论', 'int', '0', 'Moment', 'DELETE', TO_DATE('2019-08-18 02:46:56', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('11', '0', 'verifyIdList', 'array', '{"array": [1, 2, 3], "result()": "verifyIdList(array)"}', '校验类型为 id 列表', NULL, '0', NULL, NULL, TO_DATE('2019-08-18 03:58:33', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('12', '0', 'verifyURLList', 'array', '{"array": ["http://123.com/1.jpg", "http://123.com/a.png", "http://www.abc.com/test.gif"], "result()": "verifyURLList(array)"}', '校验类型为 URL 列表', NULL, '0', NULL, NULL, TO_DATE('2019-08-18 03:58:33', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('13', '0', 'getWithDefault', 'value,defaultValue', '{"value": null, "defaultValue": 1}', '如果 value 为 null,则返回 defaultValue', 'Object', '0', NULL, NULL, TO_DATE('2019-08-20 23:26:36', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('14', '0', 'removeKey', 'key', '{"key": "s", "key2": 2}', '从对象里移除 key', 'Object', '0', NULL, NULL, TO_DATE('2019-08-20 23:26:36', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('15', '0', 'getFunctionDemo', NULL, '{}', '获取远程函数的 Demo', 'JSONObject', '0', NULL, NULL, TO_DATE('2019-08-20 23:26:36', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    INSERT INTO "Function" VALUES ('16', '0', 'getFunctionDetail', NULL, '{}', '获取远程函数的详情', 'String', '0', NULL, NULL, TO_DATE('2019-08-20 23:26:36', 'SYYYY-MM-DD HH24:MI:SS'), NULL);
    COMMIT;
    COMMIT;
    

4.将项目【APIJSONBoot】导入到IDEA, 修改pom.xml, 添加Oracle驱动

注意:Oracle驱动一定要添加匹配自己Oracle数据的版本, 否则容易报【no suitable driver found for jdbc】,我就在这上面浪费了好久时间。

<dependency>
	<groupId>com.oracle</groupId>
	<artifactId>ojdbc5</artifactId>
   <version>11.1.0.6.0</version>
</dependency>

手动将jar包安装到maven资源库内

mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc5 -Dversion=11.1.0.6.0 -Dpackaging=jar -Dfile=C:\Users\Administrator\Desktop\ojdbc5-11.1.0.6.0.jar

5.修改DemoSQLConfig.java文件

DEFAULT_DATABASE = DATABASE_ORACLE; // 修改数据库
DEFAULT_SCHEMA = "OMS2C"; // 修改SCHEMA

--1.数据库版本配置(getDBVersion())方法下配置
if (isOracle()) {
	return "11.2.0.4.0"; //TODO 改成你自己的
}

--2.数据库链接配置(getDBUri())方法下配置
if (isOracle()) {
	return "jdbc:oracle:thin:@10.x.xxx.xxx:1521:orcl"; //TODO 修改成自己的链接
}

--3.数据库账号(getDBAccount())方法下配置
if (isOracle()) {
	return "OMS2C";  //TODO 改成的数据库访问账户
}

--4.数据库密码(getDBPassword())方法下配置
if (isOracle()) {
	return "XXXXXXX";  //TODO 改成自己的数据库密码
}

6.启动项目,如果报关于Script相关的错误,则在main方法内追加下记代码

AbstractFunctionParser.ENABLE_SCRIPT_FUNCTION = false;

7.用ApiFox测试

在这里插入图片描述

总结:

1.新增一个表时, 需要在Access表内插入一条数据, 但是需要重启项目才起作用,不知道我的操作是否有问题,懂得大神可以指导下。

2.做两表关联查询时, 是现将主表查询出List结果, 然后按关联字段,遍历一条条检索关联表信息, 感觉性能跟不上,如理解有误望指点。

3.完全开放给前端同事来用,存在一定的难点,不仅学习APIJSON语法,还要懂业务表结构。

综上:目前网站关于将APIJSON应用到生产的的文档偏少,个人理解也有限,暂不放到生产环境使用。
的操作是否有问题,懂得大神可以指导下。

资料参照APIJSON官网:http://apijson.cn/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值