jfinal为什么不提供batchDelete方法。

对于不同数据库,当表结构中具有联合主键时,批量删除的SQL语句就会发生变化。jfinal有没有极简的方法来批量删除这种数据

评论区

JFinal

2016-08-18 12:09

Db.batchUpdate(...) 已然提供了支持,因为 update 这个词不仅意味着可以 delete 还意味着可以 update。
此外,通常批量删除满足条件的数据就是一个 sql 的事,这样: Db.update("delete from table where a=? and b=? and c=?", x, y, z);

十三牧

2016-08-19 08:34

好的 谢谢

zz210891470

2017-09-10 16:40

@JFinal 假如我有一个id 数组, Db.update怎么批量删除数组中id对应的所有记录

jiren

2018-07-14 09:35

@JFinal StrKit.join(...) 这种方式不行呀,int update = Db.update("update bx_edums_schedule set is_deleted = '1' where c_id = ? and id in (?)",p_campusId, StrKit.join(ids,","));

JFinal

2018-07-14 15:52

@jiren 有多少个问号就要有多少个参数,此外,你后面的 p_campusld 与 StrKit.join(...) 生成的所有参数应该处于同一个 Object[] 数组里面,不能分开写

你的 StrKit.join(ids,",") 这个代码最终生成的是一个字符串,里面有很多个参数直接放在 in 里面去,否则你的 in 里面就可拼接出同样数量的问号来对应

你这个情况比较复杂,我直接说一下正确的使用结果,假定一共有三个参数:
Object[] paras = new Object[3];
paras[0] = p_campusId;
paras[1] = ids[0];
paras[2] = ids[1];

Db.update("update bx_edums_schedule set is_deleted = '1' where c_id = ? and id in (?, ?)", paras);

注意看上面,问号是三个,参数 paras 数组正好是三个元素。而且特别重要是的 p_campusId 与 ids 这两个参数是要合并到同一个数组中去的,除非你的 ids 不是数组,可以这样:
Db.update("update bx_edums_schedule set is_deleted = '1' where c_id = ? and id in (?, ?)", p_campusId, id1, id2);

如果是数组,可以这样:
Db.update("update bx_edums_schedule set is_deleted = '1' where c_id = ? and id in (?, ?)", p_campusId, ids[0], ids[1]);

这个问题你得明白Java 中的 Object... paras 可变参数规则

jiren

2018-07-14 16:16

@JFinal 感谢回答,已经理解!只是这样很不灵活,因为 ids 是不定长的,比如批量修改,这个id数量不固定,所以这种方式不能满足,我看一下用 sql管理来处理吧,

JFinal

2018-07-14 16:26

@jiren 用 sql 管理就很方便了,例如:

先定义一个函数 genIn , 专用于生成 in 内部的问号与参数
#define genIn(idList)
in(
#for (x : idList)
#(for.first ? "", ",") #para(x)
#end
)
#end

然后在任何地方都可以像这样来使用 genIn() 函数:
#sql("find")
update bx_edums_schedule set is_deleted = '1' where c_id = #para(c_id) and id #@genIn(idList)
#end

java 代码变成这样:
Kv cond = Kv.by("c_id", p_campusId).set("idList", ids);
SqlPara sp = Db.getSqlPara("find", cond);
Db.update(sp);

或者: Db.update(sp.getSql(), sp.getPara());

JFinal

2018-07-14 16:27

关键是上面定义的 #define genIn(idList) 在任何这种生成 in(?, ?, ?...) 的场景都可以使用

jiren

2018-07-14 20:40

@JFinal 完美解决,模板真是强大!赞

剑客

2020-02-29 00:57

@JFinal 写错了 #(for.first ? "" : ",") #para(x)

JFinal

2020-02-29 02:23

@剑客 好眼力,赞

热门反馈

扫码入社