2021-01-14 14:47

关键在于 baseIcon 这个对象内的 id 值是从何来的

如果你上次 baseIcon.save() 过了一次, 下次再给它的其它字段赋值,再 save() 的话,其中的 id 值还是用的上一次的,必定出错

2021-01-14 14:15

我估计你是用了 dao.save(....) 这种

代码贴全一些

2021-01-14 13:40

jfinal 的 active record 模式就是没有属性的,只有 setter getter 方法

2021-01-14 13:39

@sioui 这个相当于是 sql 生成辅助了,对于一般简单需求来说可以用,但复杂嵌套 sql 不好处理

复杂 sql 我建议用 enjoy 模板,这个就是模板的场景

将 .sql 文件放在 .java 同一级目录极好管理,下载最新的 jfinal club 版本,可以看到这种用法

2021-01-13 20:51

单步调试一下,看哪个对象是 null 引起的异常

2021-01-13 12:32

@yuwen01 jetty 启动依赖 web.xml , 会起作用,注意配置正确

2021-01-12 20:04

@sioui 这个与业务与 UI 紧密相关了

2021-01-12 20:03

@zzutligang 数据多不会一次性读取,而是分批次读取,批次大小取决于你 mysql 配置的缓冲区

当然,上面讲的偏向于 JDBC 与数据库这一端,如果你的代码这一端一次性读很多数据肯定是会 OOM 的

2021-01-12 17:34

我建议做点小改进, #if(x.key.substring(0,1) != "_") 可以改成:
#if(x.key.startsWith("_"))
这样可以性能会好点

此外,我建议这个 if 判断的逻辑倒过来,一般精确查询会更多,所以改成下面这样:
#if( x.key.startsWith("_") )
#(x.key.substring(1)) like concat('%',#para(x.value),'%')
#else
#(x.key) = #para(x.value)
#end

2021-01-12 17:28

这里面还有玄机没说,字符 "_" 前缀实现精确与模糊条件,这个也很妙

key 是条件名称,value 是条件值, key 值是否是 "_" 前缀实现精确模糊条件,极短的代码极其方便简洁地实现了很多实用功能,妙不可言

2021-01-12 17:25

#(for.first ? "where": "and") 用得极好,以前没想过这么用

以前这么用过:
#(for.first ? "where": "")
#if (...)
and ...
#end

你这个将 and 都放在了三元表达式,更简洁,赞

此外,like 用了 #para 会生成问号占位符,天然防 sql 注入, 收藏了,谢谢分享

2021-01-12 16:06

@chcode 本末倒置了,满足了你这个需求, 原有的需求无法满足

2021-01-12 15:55

@chcode 简单说就是 ReultSet 并不是一开始就知道共有多少条记录被查出来,那么 isLast() 就需要有 io 操作,强制得到所有数据才能得到 isLast(),这样的话,就算数据量再大也要一次性得到所有数据,性能会拉低

也可能是由于这类原因,不同的数据库对 JDBC 规范的实现有差异,有些干脆不去实现

便如,jfinal 在开发 active record 模块的 generate 模块的时候,获取一些 meta 信息生成 model、baseModel 时,有些数据库行为就是不一样,造成很多麻烦

2021-01-12 15:46

@chcode 不同数据库可能不支持, JDBC 底层的很多东东都不靠谱, 而且针对每条记录都判断一次 isLast(), 这个对性能肯定是有影响的,而且大概率影响很大

因为 ResultSet 中的数据不是一次性从数据库读出来的,是不断有 io 操作的

2021-01-12 15:22

补充一下,代码不要发截图,社区发文功能提供了输入代码的功能,认真尝试一下,第二个按钮就是代码按钮