2019-10-26 17:16

最后,有些同学希望能够在 java 代码中使用 sql 模板,而不是在外部文件中使用,所以 jfinal 添加了 templateByString 方法,例如:
String sqlTemplate = "select * from t where id = #p(id)";
Kv kv = Kv.by("id", 123);
Db.templateByString( sqlTemplate, kv ).find();

2019-10-26 17:15

补充,由于 SqlPara 中的 sql + para 可以用于大多数 jfinal 的数据库 API,所以 jfinal 添加了直接接受 SqlPara 类型的 API,例如:
Db.find(sqlPara);

实际使用的时候一般这样:
Kv kv = Kv.by("id", 123);
Db.find( Db.getSqlPara("test", kv));

为了进一步节省代码量,jfinal 后来的版本为了进一步消除 Db.getSqlPara() 的使用,又添加了 template 方法,用法:
Db.template("test", kv).find();

具体多看看文档:
https://www.jfinal.com/doc/5-13

2019-10-26 17:10

@柳志龙 使用 #p 与 ? 生成的最终 sql 是完全一样的,区别在于:
#p 指令在生成问号的同时,会向 SqlPara 对象中的 List paraList 中追加生成的问号所对应的参数值

也就是说 #p 指令能处理参数

例如如下的 sql 模板:
#sql("test")
select * from t where id = #p(id)
#end

java 代码获取:
SqlPara sqlPara = Db.getSqlPara("test", Kv.by("id", 123));
String sql = sqlPara.getSql();
Object[] para = sqlPara.getPara();

上面的代码中,变量 sql 的值为:
select * from t where id = ?
也就是说 #p 指令处永远是生成一个问号

para 中的值为数组:[123]

上面的 sqlPara 对象,可以用于 jfinal 的一系列的数据库操作 API,例如:
Db.find(sqlPara.getSql(), sqlPara.getPara())

因为jfinal 的数据库 API 在设计上都是 String sql + Object para[] 的形式

2019-10-26 16:46

看得出这里没有分页,无缘无故为你加 limit , 肯定是 bug, 找到这个第三方是个什么鬼

2019-10-26 16:45

这个不是用的 jfinal 的数据库操作 API

jfinal 没有 Db.init,只有 Db.use()
没有 Db.selectList(),只有 Db.find、Db.paginate 等等

2019-10-26 10:44

#p 与 #para 指令最终会生成一个问号字符,例如:
select id,name,mobile,sex,duties from ssm_center_admin where id = #p(id)
最终生成值为:
select id,name,mobile,sex,duties from ssm_center_admin where id = ?

#p 与 #para 在生成问号占位字符的同时,将其参数值放入链表中,具体看一下 jfinal 文档:
https://www.jfinal.com/doc/5-13

2019-10-25 21:00

@tuxming 你去掉事务代码,将事务关闭一下,然后看看结果,看数据生成没有

2019-10-25 20:50

这个是细节问题,要细心去调试跟踪

可以打开 arp.setShowSql(true) 看看执行了哪些 sql

此外, sql 与 sql 之间可能有依赖关系,如果后面的 sql 依赖于前面 sql 产生的新记录,那么在事务中会失败,因为事务需要在所有 sql 执行完后才能提交,而前一个生成记录的 sql 虽然执行了,但没提交,数据没真正生成

2019-10-25 19:57

@tuxming 建立对象池,让对象用完以后可以回收,下次需要用的时候不用重新申请内存,而是从池里面取用

当然,池中的对象多少要控制好,不让无限制增长

2019-10-25 19:01

@tuxming 内存占用突发性增大挺危险,因为 JVM 的垃圾回收本身就有延迟问题

想办法控制内存占用的速度小于回收的速度

2019-10-25 18:59

方案简单,代码简洁,谢谢你的分享

2019-10-25 17:09

@hb963724769 按照提示来,如果某个类的对象需要放缓存,让其实现一下 Serializable 接口即可,这个是 java 基础,与 jfinal 是无关的

2019-10-25 16:02

光定制 RenderFactory 无法实现,在当前的基础上,再定制一个 ErrorRender,通过继承 ErrorRender,在其 render() 方法内部通过:
request.getRequestURI();

即可获取到当前请求的 url,然后通过一个 if 判断,决定是返回 json 还是返回页面即可

记得搞定后回来分享

2019-10-25 15:31

注意,这里的 onStart() 就是老版本 jfinal 中的 afterJFinalStart(),老版本的用法现在也支持,建议用 onStart() ,更省代码,也不易打错字母