2019-10-27 21:43
@chcode 你的这个方法是 public ,其他人可以直接调用该方法
原则上是谁获取谁关闭,几乎没有特例
2019-10-27 16:32
@yunqi JDBC 要求 sql 语句 in 子句中问号的数量与参数个数相同,有几个参数就需要几个问号
回到你的下面这行代码:
and s.oper_type in (#para(oper_type))
如果 oper_type 值为 0, 1, 2 那么生成的 String sql 与 Object[] paras 值如下:
1:生成的 sql 片段:and s.oper_type in ( ? )
2:#para (oper_type) 对应的参数:0, 1, 2
也就是说,你的 sql in 中就一个问号,但参数却有三个,必然出错,这个错误不是 jfinal 干预的,而是 JDBC 的规则
具体的解决办法,需要改正 sql 模板的写法:
sql 代码:
#sql("getSysLogs")
select * from sys_log s where 1=1
#if (oper_type)
and s.oper_type in (
#for ( x : oper_type.split(","))
#para(x) #if(!for.last) , #end
#end
)
#end
order by oper_time desc
#end
如上所示,通过将参数按逗号分隔出来,然后在 in 内部使用 for 循环生成问号,使得参数个数与问号个数相等
2019-10-26 17:44
@柳志龙 用上一两次就彻底掌握了,#para 指令的规则就两个:
1:生成问号
2:将问号所代表的参数值放入数组
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-25 19:57
@tuxming 建立对象池,让对象用完以后可以回收,下次需要用的时候不用重新申请内存,而是从池里面取用
当然,池中的对象多少要控制好,不让无限制增长
2019-10-25 19:01
@tuxming 内存占用突发性增大挺危险,因为 JVM 的垃圾回收本身就有延迟问题
想办法控制内存占用的速度小于回收的速度