在实际应用中咱们常常会遇到多条件查询的情景,以往的解决方案是在java中对各个参数值进行非空之类的判断,再进行sql及参数的拼凑。html
其实还有更简单的解决方法的--用Freemarker。Freemarker能够轻松的使用if之类的进行判断,当if条件时再使用指定的sql片断。而Freesql就是在Freemarker的基础上,配合java中sql的参数设置进行的简单封装,能够简单方便的编写动态的sql。java
本文介绍如何在JFinal中使用Freesql。Freesql的jar包能够从http://git.oschina.net/jse7en/Freesql/中下载。Freesql默认提供对JFinal的支持,在JFinal中能够简单的使用JFinal。git
在JFinalConfig中添加Freesql插件web
public class ProjectConfig extends JFinalConfig { //... @Override public void configPlugin(Plugins me) { //Freesql默认使用web根目录下的freesql做为模板存放根目录 FreesqlPlugin freesql = new FreesqlPlugin(); //设置Freesql的模板存放目录为web根目录下的sql文件夹 //FreesqlPlugin freesql = new FreesqlPlugin("sql"); me.add(freesql); } }
JFinal的dao对象是继承自com.jfinal.plugin.activerecord.Model
,Freesql在该块原有的功能上针对模板进行了扩展,在使用时须要替换原先Model的导入定义。sql
import com.freesql.jfinal.Model; public class User extends Model<User> { public static final User dao = new User(); }
public class UserController extends Controller{ public void list() { Page<User> page = User.dao.paginateByTemp(getParaToInt("page"), getParaToInt("rows"), "test/test.ftl", this.getParaMap()); renderJson(page); } }
用FreeMarker语法编写sql,动态、方便。简单的传值没法知足你时,能够使用函数进行解析。 Freesql默认用{值}
的方式,设置sql查询参数。当普通的sql传值没法知足你时,能够Freesql函数,Freesql函数的使用方法为 {函数名(值[,值])}
如: {like(name)}
,须要存入多个值时能够用逗号分割参数:{func(paramA, paramB)}
ide
SELECT * FROM user WHERE 1 = 1 <#if username??> AND username {like(username)} #使用Freesql函数like,username为参数名,此处为页面提交的值 </#if> <#if status??> AND status = {status} #使用status做为参数,此处为页面提交的值 </#if>
<form id="s_form"> 用户名:<input text="input" name="username" /> 状态: <select name="status"> <option value="">全部</option> <option value="1">有效</option> <option value="0">无效</option> </select> <input type="submit" /> </form>