1.批量執行SQL語句
當需要成批插入或者更新記錄時,可以采用Java的批量更新機制,這一機制允許多條語句一次性提交給數據庫批量處理。通常情況下比單獨提交處理更有效率
JDBC的批量處理語句包括下面三個方法:
- addBatch(String):添加需要批量處理的SQL語句或是參數;
- executeBatch():執行批量處理語句;
- clearBatch():清空緩存的數據
通常我們會遇到兩種批量執行SQL語句的情況:
- 多條SQL語句的批量處理;
- 一個SQL語句的批量傳參;
2 .高效的批量插入
舉例:向數據表中插入20000條數據
- 數據庫中提供一個goods表。創建如下:
3.代碼實現
package com.atguigu5.blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.Test;
import com.atguigu3.util.JDBCUtils;
/* * 使用PreparesStatement實現批量數據操作 * upadte delete本身就具有批量操作的效果 * 此時的批量操作主要指的是批量插入,使用PreparedStatement如何實現更高效的批量插入 * * 題目:向goods中插入20000條數據 * CREATE TABLE goods( id INT PRIMARY KEY auto_increment, NAME VARCHAR(25) ); * 方式一:使用Statement * Connection conn=JDBCUtils.getConnection; * Statement st= conn.createStatement(); * for(int i=1;i<=20000;i++){ * String sql="insert into goods(name)values('name_"+i+"')"; * st.execute(sql); * } * * * * */
public class InsertTest {
//批量插入的方式二:使用PreparesStatement
@Test
public void testInsert1() {
Connection conn=null;
PreparedStatement ps=null;
try {
long start = System.currentTimeMillis();
conn = JDBCUtils.getConnection();
String sql="insert into goods(name)values(?)";
ps = conn.prepareStatement(sql);
for (int i = 0; i < 20000; i++) {
ps.setObject(1,"name_"+i);
ps.execute();
}
long end = System.currentTimeMillis();
System.out.println("花費的時間為:"+(end-start));
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.closeResource(conn, ps);
}
}
/* *批量插入的方式三: *addBatch(String):添加需要批量處理的SQL語句或是參數; *executeBatch():執行批量處理語句; *clearBatch():清空緩存的數據 *2、mysql服務器默認是關閉批處理的,我們需要通過一個參數,讓mysql開啟批處理的支持。 * ?rewriteBatchedStatements=true 寫在配置文件的url后面 * */
@Test
public void testInsert2() {
Connection conn = null;
PreparedStatement ps = null;
try {
long start = System.currentTimeMillis();
conn = JDBCUtils.getConnection();
String sql = "insert into goods(name)values(?)";
ps = conn.prepareStatement(sql);
for(int i = 1;i <= 1000000;i++){
ps.setObject(1, "name_" + i);
//1."攢"sql
ps.addBatch();
if(i % 500 == 0){
//2.執行batch
ps.executeBatch();
//3.清空batch
ps.clearBatch();
}
}
long end = System.currentTimeMillis();
System.out.println("花費的時間為:" + (end - start));//20000:83065 -- 565
} catch (Exception e) { //1000000:16086
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, ps);
}
}
//批量插入的方式四:設置連接不允許自動提交數據
@Test
public void testInsert3() {
Connection conn = null;
PreparedStatement ps = null;
try {
long start = System.currentTimeMillis();
conn = JDBCUtils.getConnection();
//設置不允許自動提交
conn.setAutoCommit(false);
String sql = "insert into goods(name)values(?)";
ps = conn.prepareStatement(sql);
for(int i = 1;i <= 1000000;i++){
ps.setObject(1, "name_" + i);
//1."攢"sql
ps.addBatch();
if(i % 500 == 0){
//2.執行batch
ps.executeBatch();
//3.清空batch
ps.clearBatch();
}
}
//提交數據
conn.commit();
long end = System.currentTimeMillis();
System.out.println("花費的時間為:" + (end - start));//20000:83065 -- 565
} catch (Exception e) { //1000000:16086
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, ps);
}
}
}