2021-01-14 15:55

同一个 controler 内不用传参,直接
getInt(..)
get(...)
getBoolean(...)

记住 getParaToInt 可以改为 getInt, 使用新的 API,更短更省事

2021-01-14 15:53

@joneJson Model 是不能注入的,因为 @Inject 默认是单例, 你每次注入的是同一个对象,然后对同一个对象 xxx.save(), 必然出问题

且不说 id 重复,既便 id 不得复,在多线程情况下,数据就乱掉了

model 你要 save ,可以这样:
Icon icon = new Icon();
icon.setXxx(...)
.setYyyy(...)
.setZzz(...)
.save();

2021-01-14 15:05

@joneJson 你的 baseIcon 对象,每次 new 出来就没事

我前面说的你试一试 baseIcon.remove("id").save(); 只是让你验证错误的原因,并不是主张你这么用

baseIcon 你要让线程独享,不能多线程共享,否则数据就会混乱,这是 java 多线程模型规定的,不是 jfinal 的使用规则

也就是说,这是 java 基础知识,jfinal 不干预

2021-01-14 14:47

你试一下这样:
baseIcon.remove("id").save();

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 注入, 收藏了,谢谢分享