在實際應用中咱們常常會遇到多條件查詢的情景,以往的解決方案是在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>