使用Freesql简单地实现多条件查询

ぃ、小莉子 提交于 2019-12-06 07:43:04

在实际应用中我们经常会遇到多条件查询的情景,以往的解决方案是在java中对各个参数值进行非空之类的判断,再进行sql及参数的拼凑。

其实还有更简单的解决方法的--用Freemarker。Freemarker可以轻松的使用if之类的进行判断,当if条件时再使用指定的sql片段。而Freesql就是在Freemarker的基础上,配合java中sql的参数设置进行的简单封装,可以简单方便的编写动态的sql。

如何使用Freesql

本文介绍如何在JFinal中使用Freesql。Freesql的jar包可以从http://git.oschina.net/jse7en/Freesql/中下载。Freesql默认提供对JFinal的支持,在JFinal中可以简单的使用JFinal。

初始化Freesql

在JFinalConfig中添加Freesql插件

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的导入定义。

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

模板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>


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!