Tencent/APIJSON

希望批量插入新增insert into values()()();

xuefei5 opened this issue · 9 comments

Description

现在的批量插入生成的sql都是insert into,insert into,有没有哪种模式支持insert into values(数据1)(数据2)(数据3),或者有没有考虑新增这个功能,现在批量插入100条都要好久

需要调整 AbstractObjectParser.onTableArrayParse 的逻辑,把
result = (JSONObject) onChildParse(0, "" + i, req);
改成添加到一个 List<List> values,
然后
cfg.setValues(values)

result = parser.executeSQL(cfg, false);

IDE 和 GitHub 关于 tab 用几个空格不一致,导致缩进不统一没对齐,可以顺便格式化代码
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractObjectParser.java#L713-L800
image

改了后麻烦提交 PR 贡献代码,开源要大家一起参与贡献才会更美好~
https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md

image

@TommyLemon
这个目前做了吗?

没做呢,我周一简单看了下,不可以直接执行executeSQL,这样会失去平台的扩展性,等空下来再说吧

@TommyLemon @xuefei5
我梳理了一下代码, 实现思路如下(暂时还没有细化,测试):
批量新增、修改
1、生成每条sql语句,判断是否为最后一次执行,如果不是, 则将sql语句拼接 暂存到map(列不一样,key区分,map 同时缓存 setArgument valueList)
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L4419
2、中间生成sql语句不执行 executeUpdate, 生成最后一条sql 执行 executeUpdate (列不一样, 会执行多次)
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java#L240
3、PreparedStatement 支持statement.addBatch();
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java#L1142-L1146

@cloudAndMonkey 这也是一个方案,判断是否为最后一条可以通过实际数组数量来判断

没做呢,我周一简单看了下,不可以直接执行executeSQL,这样会失去平台的扩展性,等空下来再说吧

少部分地方确实可能有影响,不过批量新增/修改,比较少会多表一起操作,影响应该不大。
不过也可以按 cloudAndMonkey 的方案试试

@cloudAndMonkey 这也是一个方案,判断是否为最后一条可以通过实际数组数量来判断
我来弄吧
按照你上面的解决方案,代码调整的地方有点多, 代码执行流程,是for 数组长度, 按照一条一条json对象生成sql语句,预编译执行.
需要解析为一条一条sql语句,不执行 sql 预编译, 最后组装完成后执行sql

按照你上面的解决方案,代码调整的地方有点多, 代码执行流程,是for 数组长度, 按照一条一条json对象生成sql语句,预编译执行.

我上面的方案,应该每张表只需要一条 SQL,值都拼接在 VALUES(...) 中