# GoSqlGo
**Repository Path**: opsfast/gosqlgo
## Basic Information
- **Project Name**: GoSqlGo
- **Description**: 天下武功,唯快不破,程序无非就是接收用户输入、存到数据库。GoSqlGo能让前端直接存取数据库,独立完成项目开发。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 23
- **Created**: 2019-05-03
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 为避免误解,在此声明:
## 本项目架构上没有什么安全问题,有质疑安全、注入问题的,在吐槽之前请将本说明完整看完。
### GoSqlGo简介 | Description
天下武功,唯快不破,程序无非就是接收用户输入、存到数据库。GoSqlGo能让前端直接存取数据库,独立完成项目开发。
### 缘起 | Origin
一直认为,开发效率最高的方式不是让MVC架构极简(SpringBoot/jFinal),而是彻底省略掉MVC架构和后端程序员,直接由前端搞定一切,由多层架构变成两层,在前端直接写SQL,缩短界面和数据库之间的距离,才是最快的开发途径。基于此理念,在2011年本人在[这里](https://blog.csdn.net/drinkjava/article/details/6935539)写了一句预言,没想到技术的发展如此之慢,现在要自己亲手去实现它了,这就是GoSqlGo项目,如果名字翻译成中文,可以翻成"Sql冲冲冲冲冲",这个比较形象,它表达了SQL为王,一路狂奔,冲到了前端的意思。界面和逻辑混合是一种肮脏的开发模式,但是就象臭豆腐一样闻着臭,吃着吃着就觉得香了。
GoSqlGo是一个运行于后端的开发工具,它的最大特点就是在运行期动态编译客户端Java代码,所有SQL和Java代码都可以在前端Html页面完成,可以彻底甩掉后端。开发完成后再利用打包工具将SQL和Java从前端移到后端,以实现安全。忘掉MVC吧,因为现在架构变成MV两层了;忘掉FreeMaker之类模板吧,因为Java内嵌到HTML里去了;忘掉后端程序员吧,因为前端把后端的活给干了(这叫大前端);忘掉前端校验吧,因为后端校验这活也归前端了,前端校验能偷懒就偷吧。
### 简介 | Features
用一个例子来说明直接在前端Javascript里写SQL和Java代码,以下html示例,实测通过,完整文件位于[这里](https://gitee.com/drinkjava2/gosqlgo/blob/master/demo/gsg-jbooox/src/main/webapp/page/demo1.html)。
这是一个转账业务的演示,开发阶段把所有的SQL和业务逻辑都写在html里面,在布署阶段再由打包工具抽取到服务端:
```
```
另外还有两个演示:
[演示2](https://gitee.com/drinkjava2/gosqlgo/blob/master/demo/gsg-jbooox/src/main/webapp/page/demo2.html):GoSqlGo结合Vue的使用。
[演示3](https://gitee.com/drinkjava2/gosqlgo/blob/master/demo/gsg-jbooox/src/main/webapp/page/demo3.html): 在前端定义一个完整的实体类并进行DDL生成、建表、表单输入检查、表单提交和存盘。
查看演示:在windows下点击demo\gsg-jbooox\run_undertow_embedded.bat批处理即可。
GoSqlGo运行在服务端,只需要进行简单的数据源设定、ActiveRecord实体类定义就可以了(也可以定义在html里,见例3)。配置详见com.demo.InitConfig类内容。
GoSqlGo是一个工具,而不是一个框架,它是通过在Web容器里添加一个Servlet过滤器,处理.gsg访问,也就是说,它通常寄生在其它后端框架里,这样的优点是可以直接共享其它框架的Session和工具类。
GoSqlGo使用需要在客户端添加gosqlgo.js,业务逻辑和SQL直接写在客户端的Javascript里,示范项目里主要有以下方法:
```
$java(String, Object...) 执行多行Java语句。第一个参数是Java本体,后面是参数,在Java里可以用$1,$2...来访问。
$javaTx(String, Object...) 执行多行Java语句并开启事务,如果有异常发生,事务回滚。
$qry(String, Object...) 将SQL查询结果的第一行第一列作为字符串值返回,第一个参数是SQL,后面是SQL参数
$qryArray(String, Object...) 返回SQL查询的第一行数据,格式为Object[]的JSON字符串
$qryArrayList(String, Object...) 返回多行查询结果为List<数组>的JSON格式
$qryTitleArrayList(String, Object...) 返回多行查询结果,为List<数组>的JSON格式,但第一行内容是各个列的标题
$qryMap(String, Object...) 返回SQL查询的第一行数据,为Map的JSON格式
$qryMapList(String, Object...) 返回SQL查询的多行数据,为List