这三种解决方案在批更新定义和性能方面有什么区别:
1)
Insert into table1 values ('A','A1'),('B','B1'),('C','C1'), ....
2)
Transaction.begin();
insert into table1 values('A','A1'); insert into table1
values('B','B1'); insert into table1 values('C','C1'); ... ... ...
Transaction.commit();
3)
PreparedStatement.addBatch(...);
PreparedStatement.executeBatch();
或在MyBatis配置中设置Batch=true
假设您的数据库将语法1视为有效(例如MS-SQL 2008),并假设#1和#2都在本机数据库的SQL实现中。。。
那么对于你问题的表演部分。。。
#1是最快的,因为它将被解析/准备一次,并作为单个原子事务执行一次。
#2将是下一个表演。每个插入有两个语句(txn-begin)和(txn-end)以及一个语句。
#2a(我建议)工作得更快。根据服务器支持的语法,您可以"准备"一个参数化SQL,并将每个值作为参数重复调用准备好的语句(execute)。这样,实际语句只解析一次。例如
Transaction.begin();
Stmt.Prepare("insert into table1 values(:Var1, :Var2)");
Stmt.Execute('A','A1');
Stmt.Execute('B','B1');
Stmt.Execute('C','C1');
Transaction.commit();
#3是基于ORM框架的,因此它将有自己的开销,并且将比#1和#2a慢。但可能比#2更快,这取决于它的实现方式。在极少数情况下,#3可能比#1和#2a都快,"IF">ORM框架内部足够智能,可以将这种重复插入更改为特定于数据库的批量加载调用。
对于您问题中的批量更新定义部分。。。
这基本上也是一个由多部分组成的决定
#一种主观的品味选择
#B它能胜任手头的工作吗。。
我个人喜欢#2a,因为它和#1一样快,但可读性更强,还可以接受更大的数据集,或者可以放入循环中,从流/文件等中读取值并插入它们,而#1有时会受到特定DBMS实现的最大SQL语句大小的限制。#3和其他变体实际上取决于您正在使用的ORM框架,因此很难获得更具体的内容。
这是一个宽泛的问题,所以我也保持了宽泛的答案。如果有什么具体的不清楚,请发表评论,我很乐意扩大。