使用Freesql簡單地實現多條件查詢

在實際應用中咱們常常會遇到多條件查詢的情景,以往的解決方案是在java中對各個參數值進行非空之類的判斷,再進行sql及參數的拼湊。html

其實還有更簡單的解決方法的--用Freemarker。Freemarker能夠輕鬆的使用if之類的進行判斷,當if條件時再使用指定的sql片斷。而Freesql就是在Freemarker的基礎上,配合java中sql的參數設置進行的簡單封裝,能夠簡單方便的編寫動態的sql。java

如何使用Freesql

本文介紹如何在JFinal中使用Freesql。Freesql的jar包能夠從http://git.oschina.net/jse7en/Freesql/中下載。Freesql默認提供對JFinal的支持,在JFinal中能夠簡單的使用JFinal。git

初始化Freesql

在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);
    }
}

擴展Model

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

模板test.ftl

SELECT
    * FROM user
WHERE 1 = 1
<#if username??>
    AND username {like(username)} #使用Freesql函數like,username爲參數名,此處爲頁面提交的值
</#if>
<#if status??>
    AND status = {status}         #使用status做爲參數,此處爲頁面提交的值
</#if>

Html頁面

    <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>
相關文章
相關標籤/搜索