精确搜索+模糊搜索

#sql("getByPage")
	select *
	from table
	#for(x:conds)
		#(for.first ? "where": "and") 
			#if(x.key.substring(0,1) != "_")
				#(x.key) like concat('%',#para(x.value),'%')
			#else
				#(x.key.substring(1)) = #para(x.value)
			#end
	#end
#end#


评论区

Moonights

2021-01-12 16:34

根据请求字段开头是否为“_”判断是否精确搜索

JFinal

2021-01-12 17:25

#(for.first ? "where": "and") 用得极好,以前没想过这么用

以前这么用过:
#(for.first ? "where": "")
#if (...)
and ...
#end

你这个将 and 都放在了三元表达式,更简洁,赞

此外,like 用了 #para 会生成问号占位符,天然防 sql 注入, 收藏了,谢谢分享

JFinal

2021-01-12 17:28

这里面还有玄机没说,字符 "_" 前缀实现精确与模糊条件,这个也很妙

key 是条件名称,value 是条件值, key 值是否是 "_" 前缀实现精确模糊条件,极短的代码极其方便简洁地实现了很多实用功能,妙不可言

JFinal

2021-01-12 17:34

我建议做点小改进, #if(x.key.substring(0,1) != "_") 可以改成:
#if(x.key.startsWith("_"))
这样可以性能会好点

此外,我建议这个 if 判断的逻辑倒过来,一般精确查询会更多,所以改成下面这样:
#if( x.key.startsWith("_") )
#(x.key.substring(1)) like concat('%',#para(x.value),'%')
#else
#(x.key) = #para(x.value)
#end

Moonights

2021-01-12 18:27

zzutligang

2021-01-12 18:48

能得到波总的称赞,确实很精彩的代码。收藏了!

sioui

2021-01-12 19:32

@Moonights 有个疑问,程序能判断出用户是进行精确或模糊搜索?

JFinal

2021-01-12 20:04

@sioui 这个与业务与 UI 紧密相关了

canca

2021-01-13 15:31

怎么没看出有多妙。

快乐的蹦豆子

2021-01-14 09:54

但是我的key里面第一个字母就是_不是要模糊查询呢

sioui

2021-01-14 10:39

还没用过模板,我自己封装了一个小插件,用来实现where条件后面有值查询,无值自动跳过,比如

SqlKit sql = SqlKit.create("select symbol, side, price, amount from t_order ").andEq("member_id", memberid).andGt("price", side).andIn("state", "on,off").orderByDesc("id").limit(12);

List list = Db.find(sql.toSql(), sql.toParams());

Moonights

2021-01-14 11:39

@快乐的蹦豆子 "_"只是一个标记,可以改为其他的,像“keyLIKE”、“Likekey”这样用"LIKE"作为标记。

JFinal

2021-01-14 13:39

@sioui 这个相当于是 sql 生成辅助了,对于一般简单需求来说可以用,但复杂嵌套 sql 不好处理

复杂 sql 我建议用 enjoy 模板,这个就是模板的场景

将 .sql 文件放在 .java 同一级目录极好管理,下载最新的 jfinal club 版本,可以看到这种用法

sioui

2021-01-14 22:36

@JFinal 没有用enjoy模板还有一个原因是我在整合jfinal和groovy,所有的业务都在groovy里实现,可以动态配置路由,一个请求对应一个groovy脚本,这样后面改任何业务都不用重启服务。

steven_lhcb_9527

2021-01-21 15:27

不愧是得到了波总的盛赞,确实很精彩。收藏了!

或是的话

2021-01-22 13:57

where 1=1 就可以了 不需要判断 where and