不断学习,不断进步。
在纯jfinal项目里面变成了这样:
###组装条件语句 #define whereSqlTemplate() #for(x : cond) ###处理条件cond参数 and #if(x.key.contains(" in")) ###拼装in条件 #(x.key) #("(") #for(inVal : x.value.split(",")) #(for.index == 0 ? "" : ",")#para(inVal) #end #(")") #else ###拼装其余条件,= > < >= <= != and #(x.key) #para(x.value) #end #end #end ###测试 #sql("test") select * from #if(isBak??=="001") log_bak #else log #end where 1=1 #@whereSqlTemplate() #(orderSql??) #end
/** * 构建DbTemplate(BaseController中的方法) * @param sqlId sql模板中的id * @param cond 查询条件 * @param defOrderSql 默认排序,表格有排序时不生效 * @param otherInfo sql中其他 * @return */ private static DbTemplate buildDbTemplate(String sqlId, Kv cond, String orderSql, Kv otherInfoKv) { DbPro dbPro = Db.use(); // 排序参数 if (StrKit.notBlank(orderSql)) { orderSql = " order by " + orderSql.toUpperCase().replace("ORDER BY", ""); } Kv data = Kv.by("cond", cond); data.set("orderSql", orderSql); data.set(otherInfoKv); return dbPro.template(sqlId, data); }
Controller中调用:
Kv cond = Kv.by("id=", get("id"));
Kv otherInfoKv = Kv.by("isBak", "002");
DbTemplate dbTemplate = buildDbTemplate("test", cond,"order by id",otherInfoKv);
dbTemplate.paginate(pageNumber, pageSize);
dbTemplate.findFirst();
——————————2020.9.4——————————
之前一直是sql模板文件里写一部分拼装sql 的逻辑,又在controller里也写一段拼装sql的逻辑。
这样不仅导致维护起来麻烦,还让sql模板变得臃肿(每个sql都得写一遍重复的逻辑代码)。
今天仔细研究了一下文档,结合波总在【Jfinal 如何实现IN查询呢????】反馈中回复的信息,整理了一下之前的代码。
###使用sql模板进行条件拼装 #sql("templateSql") #(querySql) ###查询使用的sql #for(x : cond) ###处理条件cond参数 #(for.first ? "where": "and") #if(x.key.contains(" like")) ###拼装like条件 #(x.key) concat('%', #para(x.value), '%') #elseif(x.key.contains(" in")) ###拼装in条件 #(x.key) #("(") #for(inVal : x.value.split(",")) #(for.index == 0 ? "" : ",")#para(inVal) #end #(")") #else ###拼装其余条件,= > < >= <= != and #(x.key) #para(x.value) #end #end #(orderSql??) #end #sql("yourSqlId") select * from blog #end
Kv kv = Kv.create(); kv.set("querySql", Db.getSql("yourSqlId")); kv.set("orderSql", "order by id"); // 组装查询条件 Kv condKv = Kv.create(); condKv.set("title like", "test"); condKv.set("title in", "test 1"); kv.set("cond", condKv); SqlPara sp = Db.getSqlPara("templateSql", kv); System.out.println("================="); System.out.println(Db.find(sp)); System.out.println(Db.paginate(1, 3, sp)); System.out.println("================="); System.out.println(new Blog().find(sp)); System.out.println(new Blog().paginate(2, 3, sp)); System.out.println("=================");