# 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的核心代码分离出来,接口调用还是走的数据挖潜的后台权限) ![737357332dce05dcd2f39cf0f4f5da6c.png](en-resource://database/507:1) 整体页面如下图: ![17e028b4dd176def6061d291355df6bf.png](en-resource://database/509:1) ##### 4.2 新建配置接口 新增配置如下所示: > * 选择分组:分组是为管理接口,请求URL默认是已/api/分组URl/新增接口名 > * 所属项目: 是给谁配置的项目, > * 授权方式:两种,密钥授权、登录授权 > * 是否启用:该接口是否被启用 > * 数据量: 默认查询的数据量,不写为全查 > * 描述:该接口的描述 > * 数据库列表: 展示该数据源的所有表名称和表描述 > * 字段类型: 当选择某个表时候,展示该表的表结构 > * 操作类型: 该接口是查询接口、新增接口、删除接口、还是更新接口 > * sql语句:需要执行的sql语句,该语句就是sql的标准语句,但是需要满足上面的注意事项,下面是一条sql demo: ![36e4fa38a595638b6fdd4e00308b7ac1.png](en-resource://database/511:1) ##### 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 ``` 这里展示的是参数类型信息,可以查看详细接口信息,从详情中可以看到,详情分为:请求信息、响应信息、示例。 ![e63548dc6f3f32311d6be4a54cbb97d4.png](en-resource://database/519:1) 示例是进行请求完接口之后的响应结果,可以看到,调用方式就是将配置的接口在浏览器上面执行,执行的结果为JSON数据格式。 ![7d00c76ade1ad0b9ba05340d40f9dd36.png](en-resource://database/521:1) 错误码展示,所有的可能出错的响应码如下图,可以通过错误码来排查调用接口时候哪里报错: ![9e8a46a51f1c2cb68b43db65988ffa67.png](en-resource://database/523:1) ##### 4.4 接口绑定密钥: 如果是通过密钥授权,所有的接口配置好之后,需要绑定密钥授权,密钥管理如下图: ![d61878a5c48d4e12ae546d8a2ee7a40b.png](en-resource://database/525:1) 接口绑定密钥如下: 选择需要配置的接口,选择绑定,弹出密钥绑定对话框,选择需要绑定的密钥 ![8cd43c21e59b93c9e2d440ef0784328f.png](en-resource://database/527:1) ##### 4.5 查询接口调用 添加完接口,绑定密钥便可以进行接口测试,在浏览器上面复制地址,地址是项目跟路径加配置的接口路径,将密钥已参数的形式输入。从图中可以看出,统计参数只有两个,街道名称和社区code ![ddbccd2210d08a5e74e51f841af440cb.png](en-resource://database/529:1) 更改参数可以得到不同的值,如下两张截图,wgname不一样时候,是统计各自的人口数量: ![ea1e92016595feb43c957e7ab836e4e1.png](en-resource://database/535:1) ![6dfb7378cdf01ae277721de28ddd3df3.png](en-resource://database/539:1) 如果将w_wname去掉,则就只统计平湖的人口数量 ![cf0aeb0d64afb4c5452f5f70c116d40f.png](en-resource://database/541:1) 从上面的参数选择上面就可以清晰的看出来,sqlTools非常灵活,根据传入的参数来动态的执行sql,并给到前端需要的结果,这里面对各级别的统计,即使是使用后台Java代码,也很难动态灵活的统计出前端条件选择的结果,要么就是使用大量的if判断来决定,这会给研发带来很大的业务代码量。从比较可以看出,sqlTools的优势之处。 ##### 4.6 插入接口调用 以下新增一条插入接口,并配置使用密钥授权。 ![7d4747040fe427a8d296d08c9be92e70.png](en-resource://database/543:1) 执行以下插入,并检测结果是否正确,这里插入我是用的是get请求,因为浏览器只支持get请求,如果给项目配置,插入接口配置POST请求最好。 ![b930203fe717be8e8d095c345f413467.png](en-resource://database/545:1) 通过navicate来检验是否执行正确,可以看出,结果和插入的数据一模一样。 ![a4b5c5ccbb993b661d9026f6d7ef97c1.png](en-resource://database/547:1) ##### 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/)