APIJSON的介绍
这是什么
APIJSON是一种专为API而生的 JSON网络传输协议 以及 基于这套协议实现的ORM库
这有什么用
为 简单的增删改查、复杂的查询、简单的事务操作 提供了完全自动化的API。能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。
对我们的项目好处有哪些
通过自动化API,前端可以定制任何数据、任何结构!
大部分HTTP请求后端再也不用写接口了,更不用写文档了!
前端再也不用和后端沟通接口或文档问题了!再也不会被文档各种错误坑了!
后端再也不用为了兼容旧接口写新版接口和文档了!再也不会被前端随时随地没完没了地烦了
功能流程图
一般Java用SpringBoot,Mybatis来开发一般来说就像下面这个流程
部署上这个项目后,流程变成了这样
使用这个项目作为后端的支持的话,是不需要对每个表写增删改查等接口的,只需在该项目连接的数据里进行表的创建,以及配置接口权限即可。无需进行过多的开发,哪怕是要改结构也仅仅只需要修改表字段而已。想想仅仅是部署一个后端项目,现在需要些的接口就基本写好了,直接调用就行了,是不是挺爽的。
项目的搭建
安装&使用
- 配置开发环境 推荐使用:
JDK: 1.8
,Maven: 3.0+
,Mysql
- 下载Demo项目:
git clone https://gitee.com/APIJSON/APIJSON-Demo.git
修改数据库链接
如我的数据库信息是这样的
数据库参数 | 值 |
---|---|
地址 | localhost:3306 |
用户 | root |
密码 | root |
数据库 | system |
改为自己数据库对应的链接
DEFAULT_DATABASE = DATABASE_MYSQL; //TODO 默认数据库类型,改成你自己的。TiDB, MariaDB, OceanBase 这类兼容 MySQL 的可当做 MySQL 使用
DEFAULT_SCHEMA = "security"; //TODO 默认模式名,改成你自己的,默认情况是 MySQL: sys, PostgreSQL: public, SQL Server: dbo, Oracle:
@Override
public String getDBVersion() {
if (isMySQL()) {
return "5.7.23"; //"8.0.11"; //TODO 改成你自己的 MySQL 或 PostgreSQL 数据库版本号 //MYSQL 8 和 7 使用的 JDBC 配置不一样
}
if (isPostgreSQL()) {
return "9.6.15"; //TODO 改成你自己的
}
if (isSQLServer()) {
return "2016"; //TODO 改成你自己的
}
if (isOracle()) {
return "18c"; //TODO 改成你自己的
}
if (isDb2()) {
return "11.5"; //TODO 改成你自己的
}
return null;
}
@Override
public String getDBUri() {
if (isMySQL()) {
// 这个是 MySQL 8.0 及以上,要加 userSSL=false return "jdbc:mysql://localhost:3306?userSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8";
// 以下是 MySQL 5.7 及以下
return "jdbc:mysql://localhost:3306?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8"; //TODO 改成你自己的,TiDB 可以当成 MySQL 使用,默认端口为 4000
}
if (isPostgreSQL()) {
return "jdbc:postgresql://localhost:5432/postgres"; //TODO 改成你自己的
}
if (isSQLServer()) {
return "jdbc:jtds:sqlserver://localhost:1433/pubs;instance=SQLEXPRESS"; //TODO 改成你自己的
}
if (isOracle()) {
return "jdbc:oracle:thin:@localhost:1521:orcl"; //TODO 改成你自己的
}
if (isDb2()) {
return "jdbc:db2://localhost:50000/BLUDB"; //TODO 改成你自己的
}
return null;
}
@Override
public String getDBAccount() {
if (isMySQL()) {
return "root"; //TODO 改成你自己的
}
if (isPostgreSQL()) {
return "root"; //TODO 改成你自己的
}
if (isSQLServer()) {
return "root"; //TODO 改成你自己的
}
if (isOracle()) {
return "root"; //TODO 改成你自己的
}
if (isDb2()) {
return "root"; //TODO 改成你自己的
}
return null;
}
@Override
public String getDBPassword() {
if (isMySQL()) {
return "root"; //TODO 改成你自己的,TiDB 可以当成 MySQL 使用, 默认密码为空字符串 ""
}
if (isPostgreSQL()) {
return null; //TODO 改成你自己的
}
if (isSQLServer()) {
return "root"; //TODO 改成你自己的
}
if (isOracle()) {
return "root"; //TODO 改成你自己的
}
if (isDb2()) {
return "root"; //TODO 改成你自己的
}
return null;
}
导入表
在APIJSON-Demo/MySQL目录下有一批SQL脚本,他们看起来是这样的
导入完成之后。我们可以把项目跑起来看下,以刚刚配置的项目,项目是否能够连上数据库。其中也有一些初始化数据,可以方便我们测试。
|
语法的使用
基本查询
对接口地址http://localhost:8080/get发送一个JSON格式的请求,查询参数如下
//查询Moment表里面的,ID为12的数据
{
"Moment" : {
"id" : 12
}
}
//查询Moment表里面的,ID为12,只返回content列数据
//@column表示你要筛选出的字段,如果是多个字段可以这样写"@column":"id,date,content"
{
"Moment": {
"id":12,
"@column":"content"
}
}
//同时筛选出,ID在12,15,32中的这三条数据的日期和内容
{
"[]": {
"Moment":{
"id{}":[12,15,32],
"@column":"id,date,content"
}
}
}
//筛选ID是10到40之间的, 同时不包含12的数据
{
"[]": {
"Moment":{
"id&{}":">=10,<=40",
"id!{}":[12],
"@column":"id,date,content:text"
}
}
}
//模糊查询content里面包含APIJSON的值
{
"[]": {
"Moment":{
"content$":"%APIJSON%",
"@column":"id,date,content:text"
}
}
}
//正则表达式^[0-9]+$,查询content为纯数字的数据
{
"[]": {
"Moment":{
"content~":"^[0-9]+$",
"@column":"id,date,content:text"
}
}
}
//过滤praiseUserIdList里面有82001的JSON数组数据,我们应该这样请求
{
"[]": {
"Moment":{
"praiseUserIdList<>":82001,
"@column":"id,date,content,praiseUserIdList"
}
}
}
//数量太多的数据,我们很多时候都需要分页操作,这时候我们可以用类似下面这样的请求
{
"[]": {
"Moment":{
"@column":"id,date,content,praiseUserIdList"
},
"page": 0,
"count": 5
}
}
//要使用排序的话,这样操作
//"@order":"date-,id,content+"其中,字段的前后顺序表示字段排序的优先级。id和id+是等价的,默认就是升序排列。date-表示将date字段降序排列。
{
"[]": {
"Moment":{
"@column":"id,date,content,praiseUserIdList",
"praiseUserIdList<>":38710,
"@order":"date-,id,content+"
}
}
}
关联查询
现在有两张表USER和MOMENT,两张表的关系是下面这样
可以这样写
{
"[]": {
"Moment":{
"@column":"id,date,userId",
"id":12
},
"User":{
"id@":"/Moment/userId",
"@column":"id,name"
}
}
}
User是与Moment相关联的数据,所以查询的时候我们需要用id@来表示他们之间的关联关系
/Moment/userId中,最开始的/相当于是指明了[]的位置,/Moment表示[]对象下的Moemnt对象,/Moment/userId表示Moemnt的userId字段是与User的id关联的。这是一种缺省引用路径,这里等价于完整引用路径 []/Moment/userId。
分组查询
我们需要先了解下APIJSON所支持的函数
函数名 | 说明 |
---|---|
count | 统计分组下,某字段的个数 |
sum | 统计分组下,某字段的和 |
max | 统计分组下,某字段的最大值 |
min | 统计分组下,某字段的最小值 |
avg | 统计分组下,某字段的平均值 |
//查询单纯的查出最大值,这样请求就可以了
//这里maxid是我们取的别名
{
"Moment":{
"@column":"max(id):maxid"
}
}
//我们想要计算出这天每个店铺一共卖了多少,我们通过APIJSON可以这样查询
//如果是有分组条件的,那我们需要使用@group
{
"[]": {
"Sale":{
"@column":"store_id,sum(amt):totAmt",
"@group":"store_id"
}
}
}
最后总结
APIJSON帮助了我们后端简化了很多步骤,让我们开发效率可以大幅增加,需要什么就拿什么,也可以让前端也参与进来一起编程。
关于使用的性能,安全这里我觉还是需要留意一下的。
上面的语法只是列出了一下比较常用的查询方法,有兴趣的小伙伴可以去 这里找找看 APIJSON通用文档