2019-11-02 15:29
@dzofmine 参考这个文档:
https://www.jfinal.com/doc/4-8
配置一下:
me.setToCglibProxyFactory();
2019-11-01 19:01
@Final新手 先独立用好 sql 模板,然后再通过客户端传参的方式将参数传对, 然后两者衔接即可,不要跳跃
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 方案,让它们去实现我前面讲来的嵌套功能,感受一下
2019-11-01 16:56
@117know 使用单步调试法,把玩一下 exprList 、stat、scope、writer、env 这五个变量,想要的功能基本就有数了
2019-11-01 16:19
@万里 如果你使用 jfinal 生成器生成过 getter 方法,到前台可以是驼峰格式
生成器在首页下载 jfinal_demo_for_maven 可以获取里面的用法
2019-11-01 16:15
@smileForLife 尽量避开了这种设计, Wrapper 设计唯一的好处是写 java 代码比写 sql 安全感强一点点,但缺点太多,以前谈过多次,不再赘述
2019-11-01 11:39
在 exec 方法中通过下面的代码获取 id 与 num 变量的值:
Integer id = (Integer)exprList.getExpr(0).eval(scope);
Integer num = (Integer)exprList.getExpr(1).eval(scope);
也可以这样来获取:
Object[] values = exprList.evalExprList();
Integer id = values[0];
Integer num = values[1];
在扩展的时候,把玩一下 exprList 、stat、scope、writer、env 这五个变量,基本上可以实现所有功能