# sqlTools-server
**Repository Path**: yang_hong_tang/sql-tools-server
## Basic Information
- **Project Name**: sqlTools-server
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-08-12
- **Last Updated**: 2021-12-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## SqlTools使用文档
#### 1.sqlTools介绍
sqlTools是数据挖潜项目研发过程中,从大量重复业务代码中抽离出来的前端基于SQL进行后台接口配置的配置工具,该工具极大简化了编写重复的CRUD接口,将研发人员从写重复的业务接口中解放出来。sqlTools配置的接口方便管理,方便修改,支持热部署。sqlTools配置好项目和分组模块,可以支持多个项目并行使用。以下是sqlTools具有的主要特征:
> * 免除后台Java写接口,直接使用sql进行接口配置,默认会配置接口地址,前端直接将配置好的接口进行调用,就像访问后台一样。支持POST/GET传参请求,接口类型具有:增、删、改、查。
> * 支持可变参数,配置的查询接口可以自定义参数是否必传\可传,后台会自动通过参数优化sql语句。
> * 支持登录授权和密钥授权,登录授权需要将sqlTools后台模块嵌入项目中,将自动获取项目登录的授权,仅支持项目的shiro鉴权框架,密钥授权需要绑定配置的密钥。
> * 支持数据源配置,选择不同数据源,将默认给该数据源配置接口。
> * 支持sql里面请求的参数自动解析。
> * 支持复杂的多条件、多表关联、统计查询,但是需要满足一定的sql编写格式。格式如下3
> * redis做数据缓存,所有查询的数据如果以相同参数访问,先访问redis看是否命中。
#### 2.sqlTools的使用场景
sqlTools最大的优势在于用配置sql的方式简化接口调用模式,将原来的前后端项目访问模式,既前端携带参数通过HTTP请求后台接口,后台通过SpringMVC在Controller层进行业务处理再调用DAO层,DAO层在Service里面封装MyBatis的Mapper文件,利用MyBatis框架组装定义的sql来和数据库交互,再返回结果数据,Controller层将数据进行进一步的处理、封装再响应给前端。这种模式每一个接口都需要后台各层之间的调用,定义接口方法,实现接口方法,注入接口类等等。各级之间最后形成调用链和数据库交互,重复过程非常多。
基于上面的后台编写普通的CRUD接口模式,尤其是像可视化项目,需要后台提供各种统计接口来支持前端各种图表的展现,各种报表的查询,各种普通数据的插入、更新、删除等操作。就需要大量简单的、重复的后台接口,编写这些接口非常费时费事,会大大延期项目。因此,在这种情况下,使用sqlTools工具,给前端提供居于sql的配置接口,就非常有利。
**不适合的场景**:如果后台需要复杂的业务逻辑处理,比如:工作流、自动化任务处理、定时任务、第三方服务调用、高并发情况下的缓存中间件使用等。都不适合使用直接配置工具,因为业务逻辑复杂,sql不可能直接代替掉后台的逻辑处理。这种情况下,就不合适再来配置接口。
#### 3.sqlTools的sql配置注意事项:
sqlTools配置的sql需要满足后台的校验规则,来进行非必要参数的过滤和sql的预定义检查。所以需要满足以下格式:
> 1.编写sql的时候,sql函数格式如:`yyyy-mm-dd hh24:mi:ss`,在写的时候,中间空格使用‘?’代替,既写成:`yyyy-mm-dd ?hh24:mi:ss`不要在日期格式中间出现空格
>2.`where` 后面的条件表达式是一个整体的部分,比如:`a.disposaltime>=to_date('#{#starttime}','yyyy-mm-dd?hh24:mi:ss')`,中间不能出现空格部分,不能写成
`a.disposaltime>=to_date('2017-05-04 00:00:00','yyyy-mm-dd?hh24:mi:ss' ) `
或者 `a.disposaltime>= to_date( '#{#starttime}','yyyy-mm-dd?hh24:mi:ss' )`
或者`a.disposaltime > = to_date( '#{#starttime}','yyyy-mm-dd?hh24:mi:ss' )`
> 3.查询字段如果是通过传入的参数控制的,那么必须起别名,中间使用AS连接,如: `SELECT '#{#jdname}' AS jdname FROM ... `。
> 4.`group by`的聚合字段如果是通过传入的参数控制的,那么当不用的时候,默认传入参数为:1, 例如`GROUP BY 1,1,1,1,1`,这个表示符号必须要写上。
5.动态传递的参数使用'#{#parame}'控制,比如: `where id='#{#id}'` ,这里的`id`就是传递的参数,所以使用`#{#id}`来控制,注意:中间不能有空格。
#### 4.sqlTools的操作步骤:
> 注: 以数据挖潜正式环境配置截图演示为例,sqlToos工具前后台代码皆上传至公司gitlab,上传地址:
> 前端:`http://gitlab.szgis.com/zondyconfigure/sqltools-client.git`,
> 后端:`
http://gitlab.szgis.com/zondyconfigure/sqltools-server.git
`
如果有项目需要,请自行下载运行。
##### 4.1 登录地址:
`http://10.101.19.216:8100/formconfig/#/login`
> 注:目前sqltools在数据挖潜部署中,并没有做单独的权限系统,所以管理项目,需要注意保密,后期维护会添加单独的登录模块。(数据挖潜暂未将sqlTools的核心代码分离出来,接口调用还是走的数据挖潜的后台权限)

整体页面如下图:

##### 4.2 新建配置接口
新增配置如下所示:
> * 选择分组:分组是为管理接口,请求URL默认是已/api/分组URl/新增接口名
> * 所属项目: 是给谁配置的项目,
> * 授权方式:两种,密钥授权、登录授权
> * 是否启用:该接口是否被启用
> * 数据量: 默认查询的数据量,不写为全查
> * 描述:该接口的描述
> * 数据库列表: 展示该数据源的所有表名称和表描述
> * 字段类型: 当选择某个表时候,展示该表的表结构
> * 操作类型: 该接口是查询接口、新增接口、删除接口、还是更新接口
> * sql语句:需要执行的sql语句,该语句就是sql的标准语句,但是需要满足上面的注意事项,下面是一条sql demo:

##### 4.3 sqlTools编写sql语句:
如下的sql语句demo所示:#{#column} 是可选项,既作为条件传递,后面 as aliaes 是作为别名,每个参数都有自己的类型信息,类型如下图:
```
select
'440307' as qcode,
'龙岗区' as qname,
'#{#w_jdname}' as jdname,
'#{#w_shequname}' as shequname,
'#{#w_wgname}' as wgname,
#{#g_jdname},
#{#g_jdcode},
#{#g_shequcode},
#{#g_shequname},
#{#g_wgcode},
#{#g_wgname},
sort_id,
case when type_name is null then '未知' else cast(type_name as varchar2(64)) end tradetype,
count
from(
select
#{#g_jdname},
#{#g_jdcode},
#{#g_shequcode},
#{#g_shequname},
#{#g_wgcode},
#{#g_wgname},
row_number() over(order by count(*) desc) sort_id,
c.type_name,
count(*) count
from lggzw.gzw_enterpriseinfomanage a
left join lgsjwq_ads.gzw_build_temp t1 on substr(a.buildinghousecode,1,19)=t1.code
left join lggzw.gzw_dictionary c on a.pdatradetype=c.type_value and c.type=upper('PDATRADETYPE')
where 1=1
and a.isstate='0'
and jdname='#{#w_jdname}'
and shequname='#{#w_shequname}'
and wgname='#{#w_wgname}'
group by c.type_name , #{#g_jdname} , #{#g_jdcode} , #{#g_shequcode} , #{#g_shequname} , #{#g_wgcode} , #{#g_wgname}
) a1
where sort_id<=10
```
这里展示的是参数类型信息,可以查看详细接口信息,从详情中可以看到,详情分为:请求信息、响应信息、示例。

示例是进行请求完接口之后的响应结果,可以看到,调用方式就是将配置的接口在浏览器上面执行,执行的结果为JSON数据格式。

错误码展示,所有的可能出错的响应码如下图,可以通过错误码来排查调用接口时候哪里报错:

##### 4.4 接口绑定密钥:
如果是通过密钥授权,所有的接口配置好之后,需要绑定密钥授权,密钥管理如下图:

接口绑定密钥如下:
选择需要配置的接口,选择绑定,弹出密钥绑定对话框,选择需要绑定的密钥

##### 4.5 查询接口调用
添加完接口,绑定密钥便可以进行接口测试,在浏览器上面复制地址,地址是项目跟路径加配置的接口路径,将密钥已参数的形式输入。从图中可以看出,统计参数只有两个,街道名称和社区code

更改参数可以得到不同的值,如下两张截图,wgname不一样时候,是统计各自的人口数量:


如果将w_wname去掉,则就只统计平湖的人口数量

从上面的参数选择上面就可以清晰的看出来,sqlTools非常灵活,根据传入的参数来动态的执行sql,并给到前端需要的结果,这里面对各级别的统计,即使是使用后台Java代码,也很难动态灵活的统计出前端条件选择的结果,要么就是使用大量的if判断来决定,这会给研发带来很大的业务代码量。从比较可以看出,sqlTools的优势之处。
##### 4.6 插入接口调用
以下新增一条插入接口,并配置使用密钥授权。

执行以下插入,并检测结果是否正确,这里插入我是用的是get请求,因为浏览器只支持get请求,如果给项目配置,插入接口配置POST请求最好。

通过navicate来检验是否执行正确,可以看出,结果和插入的数据一模一样。

##### 5 后期期望拓展
sqlTools的定位初中是解决高频的普通统计接口、普通的查询接口以及业务不太复杂的和数据库交互的逻辑接口。所以项目的使用场景会非常多,尤其是可视化系统和业务统计系统。如果用的好,可以对项目的进度起到非常大的帮助,是后端开发人员的开发利器。但是限于项目时间紧张,目前还没有足够时间来对工具做进一步优化,目前该工具只是初级阶段,成熟使用仅仅在《数据挖潜》项目组中,未来希望该工具可以被用到各个项目中,同时通过业务系统的反馈对该工具做进一步的优化和功能拓展。目前给出以下几个优化方向:
> * 灵活配置数据源,配置项目,项目绑定数据源,模块绑定项目,这样可以起到一工具为多个项目服务,目前该功能已经做了一半,还需要优化。
> * 进行自动接口测试,目前还没有直接测试功能,只能将配置好的接口复制到浏览器或者PostMan里面测试,后期优化点:将接口测试集成到工具类,加快接口配置完的测试速度。
> * 做独立的权限系统,sqlToos的定位是提供接口,它的权限非常高,管理的接口是其他系统的数据来源,防止被无关人员误操作或者被攻击,独立的授权系统非常重要。
> * 对不同的数据源进行灵活sql配置,虽然关系型数据库无论mysql、oracle、postgrewql的语法基本都一样,但是还是有细微的差别,因此sql后台解析引擎还需要深入优化,目前来讲,还是非常初级,算法模式也很粗暴,手动匹配非必要参数,并没有使用任何sql语法树来进行sql校验。
> * 缓存管理,目前后台配置了redis作为缓存中间件,但是是通用的,后台配置了默认时长、缓存失效算法,后期可以将这部分配置在sqlTools进行个性化配置。
前端维护人员: 郭明强
后端维护人员: 杨宏堂
2021/06/18
# sqlTools-server
{**以下是 Gitee 平台说明,您可以替换此简介**
Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)