2019-11-02 17:38
@dzofmine 如果是 JDK 并且环境变量配置正确,那么就可以确定是 resin 的问题
jfinal 更早期的版本在 tomcat 下也有这个问题,原因是 tomcat 启动时无法正确加载 CLASSPATH 环境变量,jfinal 新版本解决了这个问题
使用 me.setToCglibProxyFactory() 就挺好的,多一个 jar 包,但功能是完全没问题的
2019-11-02 16:05
@hb963724769 前半部分是对的,后半部分是错误的,业务层其它方法调用也可以触发拦截器
业务层拦截器的触发简单来说就是两种:
1:在 controller 中通过 @Inject 注入
2: 通过 Aop.get(...) 获取的对象
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 这五个变量,想要的功能基本就有数了