sqlTemplate的使用

不断学习,不断进步。

在纯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("=================");


评论区

山东小木

2019-06-10 21:41

有点麻烦哦还可以再优化 sql语句是有固定的关键词和机构组成的 所以可以抽出来的东西也不少例如
image.png

山东小木

2019-06-10 21:41

把关键词留下 能做变量的提出来 这是JBolt开发平台里做的封装

天朝子民

2019-06-10 21:51

@山东小木 话说咋在评论里贴图的?需要权限?

JFinal

2019-06-10 23:06

@天朝子民 你有权限,直接贴就可以,注意,贴的时候 src 要指向一个已经存在的图片

blankkai

2019-06-11 10:02

@山东小木 感谢大神指导。
你的方法我试了一下,对于单表操作的确简便不少,增删改和简单的查询都可以这样实现。
对于复杂表结构、多表、多视图联查时,我还是喜欢原来的方法,直接把调试好的sql扔到sql模板文件里

久伴轻尘

2019-06-11 17:08

@blankkai 多表也可以哟

JFinal

2019-06-11 17:16

@久伴轻尘 如果不是 mysql 的关键字/保留字,sql 中不建议使用 `` 字符, 太麻烦了

jfinal 生成的 sql 中带有这些字符,是因为 sql 是动态生成的,可能会出现 `` 字符,所以才这样做

久伴轻尘

2019-06-11 17:30

@JFinal 嗯嗯,老大,我这样做原本是为了有个醒目的效果 ,"list" 这个sql也是生成的 enjoy模板用的真的很是舒服

JFinal

2019-06-11 17:40

@久伴轻尘 你这个也是动态生成的,那么字符 `` 就是必须的了

真正懂 jfinal 的人,jfinal 拿在手里就是效率利器

久伴轻尘

2019-06-11 17:56

@JFinal 嗯嗯,老大。我现在把controller层做了一个封装后,然后将超类注入,单表增删改查都可以不用再写代码,只用修改下sql模板里面的查询条件,十分简单,db+record 真的爽

JFinal

2019-06-11 17:58

@久伴轻尘 对自己的项目,有针对、有方向性的去封装,能将效率再提升一个层次,有很多人都是你这么来封装的,超爽

JFinal

2019-06-11 18:06

@久伴轻尘 关于 Db + Record 的用法,我见过一个最让我映象深刻的用法

有个同学使用 Db + Record 做了一个通用的查询系统,通用到何等程度:
1:头部是一系列的下拉,可以选择表名、字段名、查询条件

2:头部还提供了输入框,针对于 sql 的 where 子句,可以输入查询条件

3:查询条件可以手动输,也可以通过下拉的方式选择字段、大于小于等于这些条件,连输入条件也可以省去

4:可以将某个搜索使用的条件保存下来,并为这个查询起个名次,下次查询的时候不必重复选择和输入查询数据
例如,他发现某个查询经常要去做,那么保存为 “今日订单”、“本周销售总额”,那么下次要查询的时候选择一下这个查询就可以省去手动输的麻烦

5:这位同学希望查询出来的结果是按 select 后的次序来显示的,所以配置了这个:
arp.setContainerFactory(new OrderedFieldContainerFactory());

有了这个查询系统,任何人都可以无比灵活地去查询整个库中的数据。 这个公司有了这个通用的查询系统,再也不必单独开发这样一个项目了,节省了很多成本

jiaoshuren

2019-06-11 18:34

@JFinal 在哪里哦,请求观摩

久伴轻尘

2019-06-11 19:44

@JFinal 嗯嗯,老大,我也在慢慢扩展,让系统做的更加人性化,体验更好,目前前端准备自己搞ant design ,做好了准备开源出来

JFinal

2019-06-11 20:05

@jiaoshuren 几年前 jfinal 老群里面的一位同学做的项目

jfinal4cyy

2019-06-12 15:20

GUI版演示https://www.bilibili.com/video/av55354505/

jfinal4cyy

2019-06-12 15:21

https://www.jfinal.com/share/1662 分享介绍

blankkai

2019-06-14 18:01

@久伴轻尘 @山东小木
我好像懂了一点儿这样用的原因了。
通过enjoy引擎生成sql模板和通用的java代码,每次只需要修改生成的sql模板就可以快速完成模块的基本搭建工作。是这样不?

JFinal

2019-06-14 21:29

@blankkai enjoy 可以用 #define 定义一些函数,可以将本该用 java 写的代码转移到模板中来

久伴轻尘

2019-06-15 17:41

@blankkai 嗯嗯这样完全可以提高开发效率,简易的增删改查,基本上套路都一样,全局做好异常处理,sql有规范性的定义,便与以后调整,我对自己的要求是java里不出现sql语句,controller里面不出现任何业务处理,只做转发

jfinal4cyy

2019-06-16 17:50

@JFinal 实现了一个雏形版,https://www.bilibili.com/video/av55790950/

blankkai

2019-06-17 09:21

@JFinal 谢谢波总指导
@久伴轻尘 感谢分享
现在是在别的框架的基础上加的jfianl的enjoy引擎和Db+Record模式,主要是数据库操作很方便。
其他人不会用jfinal,所以只让他们写sql好维护一些

Dull

2019-08-31 16:32

@山东小木 你这个#@where的内容是什么呢

热门分享

扫码入社