现在的批量插入生成的sql都是insert into,insert into,有没有哪种模式支持insert into values(数据1)(数据2)(数据3),或者有没有考虑新增这个功能,现在批量插入100条都要好久
j8yoct9x1#
需要调整 AbstractObjectParser.onTableArrayParse 的逻辑,把result = (JSONObject) onChildParse(0, "" + i, req);改成添加到一个 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
9lowa7mx2#
改了后麻烦提交 PR 贡献代码,开源要大家一起参与贡献才会更美好~https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md
ax6ht2ek3#
@TommyLemon这个目前做了吗?
xfb7svmp4#
没做呢,我周一简单看了下,不可以直接执行executeSQL,这样会失去平台的扩展性,等空下来再说吧
sauutmhj5#
@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#L44192、中间生成sql语句不执行 executeUpdate, 生成最后一条sql 执行 executeUpdate (列不一样, 会执行多次)https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java#L2403、PreparedStatement 支持statement.addBatch();https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java#L1142-L1146
cyvaqqii6#
@cloudAndMonkey 这也是一个方案,判断是否为最后一条可以通过实际数组数量来判断
nwsw7zdq7#
少部分地方确实可能有影响,不过批量新增/修改,比较少会多表一起操作,影响应该不大。不过也可以按 cloudAndMonkey 的方案试试
mec1mxoz8#
@cloudAndMonkey 这也是一个方案,判断是否为最后一条可以通过实际数组数量来判断我来弄吧按照你上面的解决方案,代码调整的地方有点多, 代码执行流程,是for 数组长度, 按照一条一条json对象生成sql语句,预编译执行.需要解析为一条一条sql语句,不执行 sql 预编译, 最后组装完成后执行sql
8oomwypt9#
按照你上面的解决方案,代码调整的地方有点多, 代码执行流程,是for 数组长度, 按照一条一条json对象生成sql语句,预编译执行.
我上面的方案,应该每张表只需要一条 SQL,值都拼接在 VALUES(...) 中
9条答案
按热度按时间j8yoct9x1#
需要调整 AbstractObjectParser.onTableArrayParse 的逻辑,把
result = (JSONObject) onChildParse(0, "" + i, req);
改成添加到一个 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
9lowa7mx2#
改了后麻烦提交 PR 贡献代码,开源要大家一起参与贡献才会更美好~
https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md
ax6ht2ek3#
@TommyLemon
这个目前做了吗?
xfb7svmp4#
没做呢,我周一简单看了下,不可以直接执行executeSQL,这样会失去平台的扩展性,等空下来再说吧
sauutmhj5#
@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
cyvaqqii6#
@cloudAndMonkey 这也是一个方案,判断是否为最后一条可以通过实际数组数量来判断
nwsw7zdq7#
没做呢,我周一简单看了下,不可以直接执行executeSQL,这样会失去平台的扩展性,等空下来再说吧
少部分地方确实可能有影响,不过批量新增/修改,比较少会多表一起操作,影响应该不大。
不过也可以按 cloudAndMonkey 的方案试试
mec1mxoz8#
@cloudAndMonkey 这也是一个方案,判断是否为最后一条可以通过实际数组数量来判断
我来弄吧
按照你上面的解决方案,代码调整的地方有点多, 代码执行流程,是for 数组长度, 按照一条一条json对象生成sql语句,预编译执行.
需要解析为一条一条sql语句,不执行 sql 预编译, 最后组装完成后执行sql
8oomwypt9#
按照你上面的解决方案,代码调整的地方有点多, 代码执行流程,是for 数组长度, 按照一条一条json对象生成sql语句,预编译执行.
我上面的方案,应该每张表只需要一条 SQL,值都拼接在 VALUES(...) 中