条件构造器

JFinal中有没有类似于Mybatis_plus中Wrapper这样可以拼接sql条件的条件构造器啊

评论区

zhangtianxiao

2019-11-01 14:02

sql 是王道

smileForLife

2019-11-01 14:15

JFinal

2019-11-01 16:15

@smileForLife 尽量避开了这种设计, Wrapper 设计唯一的好处是写 java 代码比写 sql 安全感强一点点,但缺点太多,以前谈过多次,不再赘述

smileForLife

2019-11-01 18:06

@JFinal 好的,感谢大佬

smileForLife

2019-11-01 18:07

@JFinal 有没有之前说过的文档的链接,我想看一下缺点在哪

smileForLife

2019-11-01 18:08

@smileForLife 刚接触jfinal没多久,萌新一枚

JFinal

2019-11-01 18:34

@smileForLife 缺点大致:
1:复杂度高的 sql 无法实现,要知道 sql 是一门语言,可以无限嵌套,可以有各种判断、关联

2:where 条件如果来点 and or 以及 "小括号" 的组合,优先级就不好处理,例如下面的 sql:
select * from t where a = x and b = y or c = z and ( c not in d or d = e) or f != g
以上 sql 中的 or 的优先级比 and 低,小括号中 or 的优先级需要被改变,这种 where 条件用 wrapper 设计来实现很繁索,不如直接 sql 来得爽快,你可以试着用 wrapper 用法来表达上面的 where 条件

3:不同数据库有不同的 sql 方言,wrapper 实现面向 java 代码,无法做到兼容各种数据库

4:引入一套新的概念,增加了学习成本

5:最终还是需要将 wrapper 实现翻译成 sql, 这个翻译的过程容易出 bug,对于嵌套 sql 复杂度急剧升级,例如,下面的 sql 你可以试着来用 wrapper 来表达一下:
select * from t1 where id in ( select id from t2 where x = a and y = b) inner join t3 on t1.tid = t3.tid
无论是用户使用 warpper 的 API,还是你将 wrapper 翻译成 sql ,都很麻烦,sql 嵌套一下,where 来点 优先级与嵌套,复杂度将指数组上升

6:从 API 的使用上,wrapper 并不比 sql 直观,代码量甚至比 sql 要多,以下是对比:
Db.find("select * from t whre x=a and y=b or z=c");
Db.select("*").from("t").where("x", a).and("y", b).or("z", c).find();
wrapper 用法只带来一点虚幻的安全感,而且这种安全感只对那些 sql 功底不过关的同学有吸引力

7:还有其它一堆设计思维层面问题,不再赘述

wrapper 方案折腾了半天,最终带来的将是无穷无尽的麻烦,实际好处并没有。这就是我们的古人所说的世上本无事,庸人自扰之的典型

你自己可以考察一下那些已经存在的 wrapper 方案,让它们去实现我前面讲来的嵌套功能,感受一下

热门反馈

扫码入社