发布于 2017-05-04 11:00:26 | 423 次阅读 | 评论: 0 | 来源: 网友投递
JFinal 基于Java极速WEB+ORM 框架
JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率!为您节约更多时间
JFinal 3.1 针对 3.0 版推出的魔板引擎进行了深度打磨,例如魔板 parse 异常提示更加友好明确,消除指令嵌套时多出来的一个换行符,对于模板 isModified() 逻辑进行了重构,消除冗余代码,可读性更好。
除了对魔板引擎深度打磨之外,也不乏推出了一些极简实用的功能,匠心打磨的 JFinal 3.1 在这一个月的俱乐部内测时间里,小伙伴们的一致感言是:妙不可言!
JFinal 3.1 sql 管理模块,给小伙伴们带来极简的分页设计,只需要一条用于查询的 sql 便可极速打完收枪:
#sql("findGirl") select * from girl where age > ? #end
在 java 端的代码依然简洁到极致:
paginate(1, 10, getSqlPara("findGirl", 18));
传统 mybatis 这一类的sql 管理功能,为了实现分页还要额外做很多事情,例如,需要 Handler 或 Interceptor 扩展,需要Mapper、XML、annotation,又或者引入各种所谓的 Tag,不仅无聊,而且麻烦。
JFinal 魔板函数,消灭掉了传统模板引擎中大量无聊的概念,令学习成本无限逼近于0,函数是在任何现代语言都有的概念,用函数去实现类似于 layout 这样的功能就像呼吸空气一样地自由,只需 define 一个 layout() 函数,在此函数中调用另一个函数即可:
#define layout() <html> <body> #@main() <body> </html> #end
然后在最终的页面,直接调用 layout() 并定义 main() 函数:
#@layout() #define main() ... #end
魔板函数是在 jfinal 3.0 时就有的功能,在此再次强调其易用性与灵活性,很多小伙伴使用 define 封装了各种可用于模块化的函数,jfinal 3.1 版的关键 “妙不可言” 也是在这种情况下产生的,感谢 @天蓬小猪 第一个在俱乐部提出该关键词,以致于成为了 jfinal 3.1 的版本代号。
render 指令支持动态模板渲染,为其在运行时传入不同的模板,极速支持子模板的动态化定制,无限参数赋值极其有利于模块化,例如:如下名为 ”_hot_list.html” 的模板文件用于展示热门项目、热门新闻等等列表:
<div class="hot-list"> <h3>#(title)</h3> <ul> #for(x : list) <li><a href="#(url)/#(x.id)">#(x.title)</a></li> #end </ul> </div>
上面html片段中的title、list、url是渲染时需要的变量,使用render指令分别渲染“热门项目”与“热门新闻”的用法如下:
#render("_hot_list.html", title="热门项目", list=projectList, url="/project") #render("_hot_list.html", title="热门新闻", list=newsList, url="/news")
上面两行代码中,为“_hot_list.html”中用到的三个变量title、list、url分别传入了不同的值,实现了 “_hot_list.html”的模块化重用。此外,include 指令也添加了无限参数赋值功能特性。
JFinal 3.0 的 sql 管理功能需要传入 Map data 参数:
Kv para = Kv.by("age", 18).set("weight", 50); SqlPara sp = dao.getSqlPara("findGirl", para);
而大部分情况下还可以更加简洁、极速,以下是 JFinal 3.1 引入的新用法:
SqlPara sp = dao.getSqlPara("findGril", 18, 50);
新用法完全避免掉了参数的构造,sql 定义只需要使用 para指令的 #para(int) 形式即可:
#sql("findGirl") select * from girl where age > #para(0) and weight < #para(1) #end
新用法为 para 指令提供 int 型参数达成参数传递,适用于参数位置与个数确定的场景。而老用法更加适用于参数名称、个数、位置者不确定的场景,多数情况下使用第一种用法即可胜任。
date指令用于格式化输出日期型数据,包括Date、Timestamp等一切继承自Date类的对象的输出,
使用方式极其简单:
#date(account.createAt) #date(account.createAt, "yyyy-MM-dd HH:mm:ss")
上面的第一行代码只有一个参数,那么会按照默认日期格式进行输出,默认日期格式为:“yyyy-MM-dd HH:mm”。上面第二行代码则会按第二个参数指定的格式进行输出。
如果希望改变默认输出格式,只需要通过engine.setDatePattern()进行配置即可。此指令在 jfinal 3.0 中已经存在,但jfinal 手册中遗漏了其说明,有不少小伙伴们经常问,借本次新版本发布强调一下该功能的使用。
JFinal 3.1 添加了 Kv 用于实现快捷构造参数,与 JFinal 3.0 版本中引入的 JMap 工具对比如下:
JMap cond = JMap.create("k1", v1).set("k2", v2); Kv cond = Kv.by("k1", v1).set("k2", v2);
Kv 无论是在字符输入量上,还是在输入的顺滑度上都完胜 JMap。Kv 的引入,表达为 jfinal 一直以来追求极致且永不止不步的精神。
renderFile("原文件名.zip", "新文件名.zip");
在原有熟悉的 renderFile 基础之上再添加一个新文件名即可打完收枪。
JFinal 3.1 去除了对于 para 指令参数表达式类型的限制,可以支持任意表达式,方便支持类似于下面这种用法:
#sql("find") select * from t #for (x : map) #(for.index == 0 ? "where" : "and") #(x.key) = #para(x.value) #end #end
JFinal 3.0 取消了用正则对 order by 子句的移除工作,对于非mysql数据库等等不支持 select count(*) 带有 order by 子句的数据库带来了一定的困扰。JFinal 3.1 添加对 order by 子句的处理,为了权衡正则效率引入了 paginateByFullSql 专门处理复杂 order by 子句:
String from = "from t where ..."; String totalRowSql = "select count(*) " + from; String findSql = "select * " + from + "order by case when a > 0 then 0 else 1 end"; dao.paginateByFullSql(1, 10, totalRowSql, findSql, x);
以上的 findSql 中包含一个非常规的 order by 子句,还有比这更为复杂的嵌套型 order by 子句,如果需要正确匹配这些复杂 order by,正则表达式的效率会降低一到两个量级,而绝大部分 sql 使用的是简单 group by 子句,权衡后通过引入 paginateByFullSql 来解决这类少部分情况。
hp = new HikariCpPlugin(url, username, password, driverClass); arp = new ActiveRecordPlugin(hp); me.add(hp); me.add(arp);
HikariCP 号称是目前为止最快的数据库连接池,这个插件对于数据库请求有超高并发量的小伙伴们可能非常有价值,此插件由 @玛雅牛 大牛贡献,感谢 @玛雅牛 的支持。
ModelBuilder、RecordBuilder 被 Dialect 接管以后,方便小伙伴们对于 JDBC 返回的数据进行精细化控制和类型转换,在使用时,只需要扩展相应的 XxxDialect 并覆盖掉其 buildeModelList() 与 buildRecordList()即可。
由于近期时间极其有限,本文只做较为粗浅的表述,里面很可能有不少错别字,还有很多增强与改进都未在此文中提到,changlog 也未来得及整理出来,所有这些内容将在近两天内在 jfinal.com 官网公布,大家可以明后天去 jfinal.com 官网下载详细的 changelog。
ONE MORE THING: JFinal 俱乐部直播即将推出,作者将通过直播的方式深度讲解 JFinal 设计原理、俱乐部专享项目源码内涵,以及在线问题答疑,对这些内容感兴趣的小伙伴可加入俱乐部:http://www.jfinal.com/club