jfinal分页查询动态SQL的高级处理应用实例,解决你繁琐的查询条件拼接问题!

       因为在项目实践中有的时候SQL查询条件会有十几个甚至几十个的情况;如果只用正常的sql拼接方式的需要编写大量的if elseif 来判断查询条件是否为空,以及进行拼接。

        运用jfinal的SQL模版文件方式后代码量降低了80%。

        SQL模版文件使用#namesapce与#include 指令对其它模板文件进行统一管理。

        业务层使用getSqlPara(String key, Object… paras)的方式,入参使用 Kv.by的方式。

以下是一个简单的代码实例:

业务层代码;

/**
 * 描述:(获取用户列表接口)
 * 作者:${xf}
 
 * 参数: pageSize,startIndex,userType...可以是几十个参数
 * 创建:${2017-05-03} ${13:00:00}
 */
@Override
public Ret listUser(Record param) {
    int pageSize = Integer.parseInt(String.valueOf(param.get("pageSize")));
    int pageNum = Integer.parseInt(String.valueOf(param.get("startIndex")));
    param.remove("pageSize").remove("startIndex");
    Map map = param.getColumns();
    Kv queryParam = Kv.by("age>", ageOne).set("age<",ageTwo).set(map);
    SqlPara sqlPara = Db.getSqlPara("customer.listUser",Kv.by("queryParam", queryParam));
    Page<Record> page =Db.paginate(pageNum, pageSize, sqlPara);
    return ReturnMessage.gsonPage(page);
}

模版SQL

all_sqls文件统一管理所有sql文件:

#namespace("customer")
#include("customer.sql")
#end

customer.sql文件:

#sql("listUser")
select userName,phone, userType from test_user
 #for(param:queryParam)
 #(for.index==0? "where" : "and" ) #field(param.key)#para(param.value) 
 #end
#end

#field方式需要自己增加一个扩展指令处理模版SQL中的查询条件的 where a=1 and b<

package com.sanqimei.www.common.kit;
import java.io.Writer;
import com.jfinal.template.Directive;
import com.jfinal.template.Env;
import com.jfinal.template.stat.CharTable;
import com.jfinal.template.stat.Scope;
public class FieldDirective extends Directive {
public void exec(Env env, Scope scope, Writer writer) {
        String key = exprList.eval(scope).toString().trim();
        write(writer, key);
        if (CharTable.isLetterOrDigit(key.charAt(key.length() - 1))) {
            write(writer, " = ");
        }
    }
}

然后在config中引入arp.getEngine().addDirective("field", new FieldDirective());


评论区

suxiaoqiuking

2017-12-12 17:18

@JFinal 后面看了一下文档 解决了 多谢波总

KingTiger

2018-05-11 01:13

@JFinal all_sqls 是如何在启动的时候加载的呢,有指定吗

JFinal

2018-05-11 10:32

@KingTiger 通过 activeRecordPlugin.addSqlTemplate("all_sqls.sql") 来配置

KingTiger

2018-05-11 10:53

@JFinal 这里代码有点看不懂,如果用使用 ClassPathSourceFactory 去加载呢
------------------分割线--------------------
sql 管理模块的 Engine 配置
JFinal Template Engine 被设计成为可以在单独的项目中同时使用多个 Engine 对象,这多个不同的 Engine 对象可分别进行不同的配置,用于不同的用途,独立配置、互不干扰。

例如,jfinal 中的 configEngine(Engine me) 中配置的 Engine 对象是用于 Controller.render(...) 方法的渲染,而 ActiveRecordPlugin.getEngine() 对象是用于 sql 管理功能模块,这两个 Engine 对象是两个不同的实例,互相之间没有干扰,配置方式也不同。

前面例子中的配置已介绍过了用于 Controller.render(...) 渲染的 Engine 对象的配置,而 ActiveRecordPlugin 的 sql 管理模块的 Engine 对象的配置方法如下:

public void configPlugin(Plugins me) {
ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
Engine engine = arp.getEngine();

// 上面的代码获取到了用于 sql 管理功能的 Engine 对象,接着就可以开始配置了
engine.setSourceFactory(new ClassPathSourceFactory());
engine.addSharedMethod(new StrKit());

me.add(arp);
}
上面代码中通过 arp.getEngine() 获取到了 sql 管理模块专用的 Engine 对象,并对其进行了两项配置。这两项配置仅对 sql 管理功能的 Engine 对象有效,与 configEngine(Engine me) 中配置的 Engine 对象完全无关,她们自各拥有独立的配置。

xh13k

2018-11-27 16:34

怎么能动态传入表名

kings186

2019-03-14 10:57

请问如果我要写动态sql,可以用#if判断是否存在,并判断她的值嘛,比如说#if(num && num =1),这样的用法可以嘛

一只敲代码的猫

2021-02-01 17:07

@欲风217 2.2版本支持这个吗?

欲风217

2021-03-12 14:25

@一只敲代码的猫 2.2 版本好像不支持 sql 模板引擎

热门分享

扫码入社