阅读 239

APIJSON在mac电脑环境下配置去连接SQL Server

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 编辑器**,希望为您提供舒适的写作体验。