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
    评论
WebApi操作数据库的步骤如下: 1. 首先,在项目的appsettings.json文件中添加对应的数据库连接字符串。根据需要选择MySql、SqlServer或Oracle数据库,并填写相应的服务器IP、账号、密码和数据库名称。\[2\] 2. 在项目中创建一个服务类,用于实现对数据库操作。可以参考示例中的StudentService类,该类继承了BaseDbService<StudentEntity>接口,并实现了IStudentService接口。在构造函数中可以指定数据库类型,默认为SqlServer。\[1\] 3. 在服务的依赖注入配置文件中,将服务类与接口进行对应关系的配置。可以参考示例中的ServiceInjection类,通过调用ConfigureRepository方法,将IStudentService接口与StudentService类进行绑定。\[3\] 4. 在需要使用数据库操作的地方,通过依赖注入的方式获取对应的服务类实例,然后调用相应的方法进行数据库操作。 总结起来,WebApi操作数据库的关键步骤包括配置数据库连接字符串、创建服务类实现数据库操作、配置服务的依赖注入关系,并在需要使用数据库操作的地方获取服务类实例进行操作。 #### 引用[.reference_title] - *1* *2* *3* [.NET Core WebApi中实现数据库操作(之SqlServer)](https://blog.csdn.net/xiaochenXIHUA/article/details/119574119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值