GoSqlGo ( https://gitee.com/drinkjava2/gosqlgo)
天下武功,唯快不破,程序无非就是接收用户输入、存到数据库。GoSqlGo能让前端直接存取数据库,独立完成项目开发。
GoSqlGo是一个运行于后端的开发工具,它的特点是在运行期动态编译客户端Java代码,所有SQL和Java代码都可以在前端Html页面完成,可以彻底甩掉后端。开发完成后再利用打包工具将SQL和Java从前端移到后端,以实现安全性。忘掉MVC吧,因为现在架构变成MV两层了;忘掉FreeMaker之类模板吧,因为Java内嵌到HTML里去了;忘掉后端程序员吧,因为前端把后端的活给干了(这叫大前端);忘掉前端校验吧,因为后端校验这活也归前端了,前端校验能偷懒就偷吧。
1. 原来1.0.0版只有的qry和java两个方法,现在扩充到以下方法,并且可以添加自定义方法了。
$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<Map>的JSON格式 $qryEntityList(String, Object...) 返回多行数据为List<实体>的JSON格式,SQL写法是实体类名+逗号+SQL, 示例:$qryEntityList(`a.b.Demo, select * from demo`);
用一个示例来说明以上这些方法的使用,这是一个单页面应用,所有的SQL和业务逻辑都写在javascript里面,够酸爽的吧:
<!DOCTYPE html>
<html>
<head>
<style>...略...</style>
<script src="/js/jquery-1.11.3.min.js"></script>
<script src="/js/jquery-ajax-ext.js"></script>
<script src="/js/gosqlgo.js"></script>
</head>
<body>
<script>
document.write($java(`return new WebBox("/page/menu.html").setAttribute("title", $1);`, "Transaction demo, use jQuery"));
function getUserListHtml(){
var users=JSON.parse($qryMapList(`select * from account where amount>=? order by id`,0));
var html="User List:<br/>";
for(var i=0;i<users.length;i++)
html+="User ID:" + users[i].ID+", AMOUNT:"+ users[i].AMOUNT+"<br/>";
return html;
}
</script>
<div id="msgid" class="msg"></div>
<p id="Users">
<script>document.write(getUserListHtml());</script>
</p>
<section>
<header>Account A</header>
<div id="A" class="amount">
<script>
document.write($qry(`select amount from account where id=? and amount>=?`, 'A',0));
</script>
</div>
</section>
<section>
<header>Account B</header>
<div id="B" class="amount">
<script>
document.write($java(`return new Account($1,$2).load().getAmount();`, 'B',0));
</script>
</div>
</section>
<script>
function transfer(from, to, money){
var rst = $java(`#TransferMoney
int money=Integer.parseInt($3);
if(money<=0)
throw new SecurityException("Money<=0, IP:"+ getRequest().getRemoteAddr());
Account a=new Account().setId($1).load();
if(a.getAmount()<money)
return "Error:No enough balance!";
Account b=new Account().setId($2).load();
a.setAmount(a.getAmount()-money).update();
b.setAmount(b.getAmount()+money).update();
return "Transfer Success!|"+a.getAmount()+"|"+b.getAmount();
`, from,to,money);
if(rst.startsWith("Transfer Success!")) {
var words=rst.split('|');
$("#msgid").text(words[0]);
$("#"+from).text(words[1]);
$("#"+to).text(words[2]);
$("#msgid").css("background", "#dfb");
$("#Users").html(getUserListHtml());
}
else if(rst.startsWith("Error:")) {
$("#msgid").text(rst.substring(6));
$("#msgid").css("background", "#ffbeb8");
}
}
</script>
<section>
<header>Transfer</header>
<form onsubmit="return false" action="##" method="post">
<input name="amount" value="100" class="amount">
<button name="btnA2B" value="true" onclick="transfer('A','B',100)">From
account A to account B</button>
<button name="btnB2A" value="true" onclick="transfer('B','A',100)">From
account B to account A</button>
</form>
</section>
</body>
</html>
查看演示: 在windows下点击demo/gsg-jbooox/run_undertow_embedded.bat批处理即可。
另外还有两个演示,分别是GoSqlGo结合Vue的使用、在html里定义实体类并进行DDL生成、建表、表单输入检查、表单提交和存盘,请详见项目主页。
2. "gsg-jbooox"示范项目添加以下几种运行方式:
方式1,发布war包到本机的Tomcat7或Tomcat8目录下执行:
运行:修改run_tomcat_local.bat批处理文件中的TomcatFolder为本机Tomcat目录,并执行
方式2, 命令行方式在嵌入式Tomcat上运行,这种方式本机不需要安装Tomcat, Maven会自动下载
运行:双击运行run_tomcat_embedded.bat批处理即可
方式3, 命令行方式在嵌入式Jetty上运行,这种方式本机不需要安装Servlet容器, Maven会自动下载Jetty
运行:双击运行run_jetty_embedded.bat批处理即可
方式4, 命令行方式在嵌入式Undertow上运行,这种方式本机不需要安装Servlet容器, Maven会自动下载Undertow
运行:双击运行run_undertow_embedded.bat批处理即可
方式5, 导入到Eclipse中运行或调试
1.运行run_tomcat_embedded.bat批处理一次
2.运行maven_eclipse_eclipse.bat批处理,生成eclipse配置
3.打开Eclipse,导入项目,并运行其中的MainApp.java的main方法
查看结果:在浏览器输入 http://localhost
3. 添加了几个批处理命令进行打包和逆打包操作,例如:
Windows环境下,先运行run_undertow_embedded.bat一遍后,再点击goServ.bat批处理文件即可进行打包操作,再次运行run_undertow_embedded.bat就可以发现客户端的SQL和Java消失了,取而代之的是$gsg这种Ajax远调用方法,原来的SQL和Java语句被移到了服务端。
批处理命令有goFrontForce.bat、goServ.bat、goServForce.bat、goFront.bat这几个,请详见项目主页的用法。
GoSqlGo已发布,对它感兴趣的请加关注,或发issue提出完善意见。也欢迎同学们提交GoSqlGo演示示例,GoSqlGo如果用好了,结合前端的可视化组件,可以实现类似Delphi一样的开发效率。
Apache 2.0
Github
码云点赞很重要,必须的