APIJSON是一个针对小公司,快速开发api接口的好工具。 具体介绍: vincentcheng.github.io/apijson-doc…
菲哥,在研究GraphQL的时候,无意间发现了APIJSON。其作者是一个比较有独立思考能力的年轻人,看介绍好像两年前,大四的时候就开发了这个框架。我仔细阅读了作者对这个产品的开发初衷和定位,我觉得在针对小公司的应用场景里,还是有很大的应用价值的。具体文章可以参看:
完爆Facebook/GraphQL,APIJSON全方位对比解析:
完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能
完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制
完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询
对APIJSON的摸索(在MAC电脑环境,去连接局域网里的一台服务器上的SQL Server的过程)
由于菲哥的开发环境是在Mac电脑上,JAVA的开发环境熟悉一点的也是IntelliJ IDEA,而作者的项目的开发环境用的是Eclipse。由于我是C#转过来的人,实在是对Eclipse不熟悉,没办法不能要求太高了。下载折腾了半天,还是搞不定环境。
所以,一开始打算用APIJSON的C#版本来试,群里也有个小伙伴也是搞C#的,也这样处理的。还给我支了好几招。可是,我和预研的同事商量后,他还是建议我用JAVA来试,原因是我们目前在做的产品,已经选型用JAVA了,为了避免在多个语言里来切换,最终我还是决定用作者的JAVA项目来试。
作者的文档做为参考: vincentcheng.github.io/apijson-doc…
测试的配置过程
(1)先git clone下来作者的代码仓库到本地来。
git clone github.com/TommyLemon/…
(2)由于作者的项目是maven的项目,是可以用IntelliJ IDEA直接打开,然后让它自行下载好依赖。
采取项目导入的方式进行导入。导入存在的maven项目,选择APIJSONBoot的目录,编译的时候如果缺少一个包,可以在:File-》 Project Structure里添加依赖,把项目里APIJSONBoot里的libs里的jar包路径添加进来
(3)我首先测试的是连接mysql数据库(数据库也在局域网里),这个测试还是比较简单的:
@Override
public String getDBVersion() {
if (isMySQL()) {
return "5.7.27"; //"8.0.11"; //TODO 改成你自己的 MySQL 或 PostgreSQL 数据库版本号 //MYSQL 8 和 7 使用的 JDBC 配置不一样
}
if (isPostgreSQL()) {
return "9.6.15"; //TODO 改成你自己的
}
if (isSQLServer()) {
return "2012"; //TODO 改成你自己的
}
if (isOracle()) {
return "18c"; //TODO 改成你自己的
}
return null;
}
@Override
public String getDBUri() {
if (isMySQL()) {
return "jdbc:mysql://192.168.31.252:3306/"; //TODO 改成你自己的,TiDB 可以当成 MySQL 使用,默认端口为 4000
}
if (isPostgreSQL()) {
return "jdbc:postgresql://localhost:5432/postgres"; //TODO 改成你自己的
}
if (isSQLServer()) {
//return "jdbc:jtds:sqlserver://192.168.31.200:1433/pubs"; //TODO 改成你自己的
return "jdbc:sqlserver://192.168.31.200:1433;databaseName=MPDemo;user=sa;password=Xx*2018;";
//return "jdbc:sqlserver://192.168.31.200:1433;databaseName=pubs;";
}
if (isOracle()) {
return "jdbc:oracle:thin:@localhost:1521:orcl"; //TODO 改成你自己的
}
return null;
}
@Override
public String getDBAccount() {
if (isMySQL()) {
return "root"; //TODO 改成你自己的
}
if (isPostgreSQL()) {
return "postgres"; //TODO 改成你自己的
}
if (isSQLServer()) {
return "sa"; //TODO 改成你自己的
}
if (isOracle()) {
return "scott"; //TODO 改成你自己的
}
return null;
}
@Override
public String getDBPassword() {
if (isMySQL()) {
return "987"; //TODO 改成你自己的,TiDB 可以当成 MySQL 使用, 默认密码为空字符串 ""
}
if (isPostgreSQL()) {
return null; //TODO 改成你自己的
}
if (isSQLServer()) {
return "Fuxi*2018"; //TODO 改成你自己的
}
if (isOracle()) {
return "tiger"; //TODO 改成你自己的
}
return null;
}
另外,需要注意的是:
DEFAULT_DATABASE = DATABASE_MYSQL; //TODO 默认数据库类型,改成你自己的
DEFAULT_SCHEMA = "sys"; //TODO 默认模式名,改成你自己的,默认情况是 MySQL: sys, PostgreSQL: public, SQL Server: dbo, Oracle:
这里有个小坑:
// @Override
// public String getSchema() {
// String s = super.getSchema();
// //return StringUtil.isEmpty(s, true) ? "thea" : s; //TODO 改成你自己的。例如:将"thea"替换成你自己的“数据库名字”
// return StringUtil.isEmpty(s, true) ? "pubs" : s; //TODO 改成你自己的。例如:将"thea"替换成你自己的“数据库名字”
// }
要把这个函数注释拿掉,或者增加下,用于返回数据库的Schema名称,然后,执行在mysql数据库里去执行一下数据库的建库脚本和插入测试数据的脚本。
当mysql这些配置好后,启动项目,然后需要使用postman去设置一个post调用,来测试:
{
"Moment": {
"id": 12
}
}
如图:
可以看到,api的接口数据立即拿到了,非常方便,真是可以算是api json的构造协议啊。省了多少人工自己体会吧。
(4)然后,我开始测试去连接局域网里的SQL server的服务器
这个测试遇见的坑就比较多了:
- SQL Server数据库的支持最低版本:
经过测试sql2005和sql2008应该都不行,因为作者用到的分页语法:OFFSET是在sql2012后才有的
- SQL Server数据库的在mac电脑的JAVA的JDBC驱动的问题:
<!--<dependency>-->
<!--<groupId>net.sourceforge.jtds</groupId>-->
<!--<artifactId>jtds</artifactId>-->
<!--<version>1.3.1</version>-->
<!--</dependency>-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>7.4.1.jre8</version>
</dependency>
<!--<dependency>-->
<!--<groupId>com.microsoft.sqlserver</groupId>-->
<!--<artifactId>sqljdbc4</artifactId>-->
<!--<version>4.2</version>-->
<!--</dependency>-->
这里jtds的JDBC的驱动,是第三方的驱动,据说作者在win7和win10下使用没有问题,但是我在mac电脑上这个驱动却无法成功加载:
最后使用了微软官方的驱动:mssql-jdbc,成功加载了。
APIJSON的数据库url的设置也改为:
但是,这样设置后,当连接sql2012时,又出现了新问题,如图:
仔细分析后,我也检查了建库的脚本和数据都没有问题,我判断可能是指定的默认数据库有问题,我把sa的默认登录数据库指向我要登录的数据库,在测试,还是有这个问题。直到作者建议我把getSchema()函数注释掉,并把一下2个变量改为默认使用SQL Server,最终,成功连接上了SQL Server 2012
DEFAULT_DATABASE = DATABASE_SQLSERVER; //TODO 默认数据库类型,改成你自己的
DEFAULT_SCHEMA = "dbo"; //TODO 默认模式名,改成你自己的,默认情况是 MySQL: sys, PostgreSQL: public, SQL Server: dbo,
马上查询一下自己表的数据:
似乎已经可以访问了,不过有权限的问题,我在access表里添加了一条允许记录,再试:
又出现主键错误,我尝试修改了如下函数:
//取消注释来实现自定义各个表的主键名
@Override
public String getIdKey(String database, String schema, String table) {
if (table=="Goods") return "GoodsID";
else return super.getIdKey(database,schema,table);
//return StringUtil.firstCase(table + "Id"); // userId, comemntId ...
// return StringUtil.toLowerCase(t) + "_id"; // user_id, comemnt_id ...
// return StringUtil.toUpperCase(t) + "_ID"; // USER_ID, COMMENT_ID ...
}
再进行测试,OK了,非常感谢作者和群友的指导。
结语
以上就是菲哥在Mac电脑上摸索使用APIJSON的经验总结,希望能帮助其他人了解学习这个框架,谢谢大家的分享,也感谢作者的贡献,让我们可以偷懒。:)
Markdown,可以参考这里Markdown语法,非常感谢使用** 掘金-Markdown 编辑器**,希望为您提供舒适的写作体验。