Java 3種批量插入更新操作的效率橫向比較
(1)三種插入操作的方法
1.1 利用for迴圈的批量插入
示例xml
<insert id="insertUser">
insert into test_user (u_name,create_date) value (#{userName},SYSDATE())
</insert>
示例程式碼:
for (int i = 1; i <= num; i++) {
User user = new User();
user.setUserName("a" + i);
user.setCreateDate(new Date());
userDao.insertUser(user);
}
2. 採用jdbc
示例程式碼:
Connection conn;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://192.168.0.200:3306/xxx", "root", "root");
conn.setAutoCommit(false);
String sql = "insert into test_user (u_name,create_date) value (?,SYSDATE())" ;
PreparedStatement prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
conn.setAutoCommit(false);
for (int i = 1; i <= 100; i++) {
prest.setString(1, "a" + i);
prest.addBatch ();
}
prest.executeBatch();
conn.commit();
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
資料量分別是10,100,300,1000,5000條資料
資料量:10
批量更新耗時:279
非批量更新耗時:1522
jdbc批量更新耗時:255
資料量:100
批量更新耗時:720
非批量更新耗時:3391
jdbc批量更新耗時:1912
資料量:300
批量更新耗時:987
非批量更新耗時:9827
jdbc批量更新耗時:7616
資料量:500
批量更新耗時:1649
非批量更新耗時:16253
jdbc批量更新耗時:10475
資料量:1000
批量更新耗時:2552
非批量更新耗時:33048
jdbc批量更新耗時:20793
資料量:5000
批量更新耗時:19066
非批量更新耗時:239127
jdbc批量更新耗時:103273
綜上分析,效率排比如下
mybatis批量更新 > jdbc批量更新 > 迴圈呼叫update語句
(2)三種批量更新的方法
2.1 利用for迴圈批量更新
示例xml
<update id="updateUser">
update test_user set test_user.u_name = (#{updateUserName}) where test_user.u_name = (#{userName})
</update>
- 1
- 2
- 3
示例程式碼
for (int i = 1; i <= num; i++) {
User user = new User();
user.setUserName("a" + i);
user.setUpdateUserName("b" + i);
userDao.updateUser(user);
}
2.2 jdbc 批量更新
示例程式碼
Connection conn;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://192.168.0.200:3306/xxx", "root", "root");
conn.setAutoCommit(false);
// 儲存當前自動提交模式
boolean autoCommit = conn.getAutoCommit();
// 關閉自動提交
conn.setAutoCommit(false);
Statement stmt =conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
for (int i = 1; i <= num; i++) {
stmt.addBatch("update test_user set test_user.u_name = ('d"+i+"') where test_user.u_name = ('c"+i+"')");
}
stmt.executeBatch();
conn.commit();
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
2.3 mybatis 批量更新
其實是利用了mysql的批量更新的語法
case when的語法
詳見 【case when 語法】
示例xml
<update id="batchUpdateList">
update test_user
<trim prefix="set" suffixOverrides=",">
<trim prefix="u_name =case" suffix="end,">
<foreach item="item" collection="userList">
when test_user.u_name = (#{item.userName})
then #{item.updateUserName}
</foreach>
</trim>
</trim>
where
<foreach item="item" collection="userList" separator="or">
(test_user.u_name = (#{item.userName}))
</foreach>
</update>
示例程式碼
for (int i = 1; i <= num; i++) {
User user = new User();
user.setUserName("a" + i);
user.setUpdateUserName("b" + i);
userList.add(user);
}
userDao.batchUpdateList(userList);
資料量分別是10,100,300,1000,5000條資料
資料量:10
批量更新耗時:279
非批量更新耗時:1522
jdbc批量更新耗時:255
資料量:100
批量更新耗時:720
非批量更新耗時:3391
jdbc批量更新耗時:1912
資料量:300
批量更新耗時:987
非批量更新耗時:9827
jdbc批量更新耗時:7616
資料量:500
批量更新耗時:1649
非批量更新耗時:16253
jdbc批量更新耗時:10475
資料量:1000
批量更新耗時:2552
非批量更新耗時:33048
jdbc批量更新耗時:20793
資料量:5000
批量更新耗時:19066
非批量更新耗時:239127
jdbc批量更新耗時:103273
綜上分析,效率排比如下
mybatis批量更新 > jdbc批量更新 > 迴圈呼叫update語句