一、介紹
批量操作(batch):當需要成批插入或者更新記錄時。可以採用Java的批量更新機制.
這一機制允許多條語句一次性提交給數據庫批量處理。通常情況下比單獨提交處理更有效率.
JDBC的批量處理語句包括下面兩個方法:
addBatch(String sql):添加需要批量處理的SQL語句或是參數;
executeBatch();執行批量處理語句;
通常我們會遇到兩種批量執行SQL語句的情況:
多條SQL語句的批量處理; :Statement
一個SQL語句的批量傳參; :PreparedStatement
Statement 批處理: 一次性可以執行多條sql語句,需要編譯多次。
應用場景:系統初始化 (創建表,創建數據等)
添加sql語句,st.addBatch(sql) --添加sql語句
批量處理sql語句,int[] st.executeBatch()
清除緩存: st.clearBatch();
採用Statement.addBatch(sql)方式實現批處理:
• 優點:可以向數據庫發送多條不同的SQL語句。
• 缺點:
lSQL語句沒有預編譯。
l當向數據庫發送多條語句相同,但僅參數不同的SQL語句時,需重複寫上很多條SQL語句。例如:
Insert into user(name,password)values(‘aa’,’111’);
Insert into user(name,password)values(‘bb’,’222’);
Insert into user(name,password)values(‘cc’,’333’);
Insert into user(name,password)values(‘dd’,’444’);
-------------------------------------------------------------------------
PreparedStatement 批處理: 執行一條sql語句,編譯一次,執行sql語句的參數不同。
應用場景:表數據初始化
添加批量參數:psmt.addBatch() --添加實際參數,執行之前,需要執行psmt.setXxx()
設置實際參數
執行批處理:int[] psmt.executeBatch()
清除緩存:pstm.clearBatch();
採用PreparedStatement.addBatch()實現批處理
• 優點:發送的是預編譯後的SQL語句,執行效率高。
• 缺點:只能應用在SQL語句相同,但參數不同的批處理中。因此此種形式的批處理經常用於在同一個表中批量插入數據,或批量更新表的數據。
二、用法
實例:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.hbsi.utils.DBManager;
public class Demo3 {
public static void main(String[] args) {
Demo3 d=new Demo3();
d.testBatch();
}
public void testBatch(){
Connection con=null;
Statement st=null;
ResultSet rs=null;
try {
con=DBManager.getConnection();
String sql1="insert intotestbatch value(1,'aaa')";
String sql2="insert intotestbatch value(1,'aaa')";
String sql3="select fromtestbatch where id=1";
st=con.createStatement();//st對象中有一個集合對象list
//向批中添加sql語句
st.addBatch(sql1);
st.addBatch(sql2);
st.addBatch(sql3);
//提交給批
st.executeBatch();//影響行數
st.clearBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBManager.release(con, st, rs);
}
}
public void testBatch2(){
Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
con=DBManager.getConnection();
String sql="inster intotestbatch value(?,?)";
st=con.prepareStatement(sql);
for(int i=3;i<10000004;i++){
st.setInt(1, i);
st.setString(2, "aa"+i);//已經形成了一條完整的sql語句
st.addBatch();
//可防止outofmemoryError異常,但是Mysql插入時比較慢。
if(i%1000==0){
st.executeBatch();
st.clearBatch();
}
st.executeBatch();
st.clearBatch();
}
st.executeBatch();
st.clearBatch();
// st.setInt(1, 3);
// st.setString(1, "qq");//已經形成了一條完整的sql語句
// st.addBatch();
// st.setInt(1, 4);
// st.setString(2, "ddd");//有形成了第二條完整的sql語句
// st.addBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBManager.release(con, st, rs);
}
}
}
三、使用addBatch進行批處理操作的幾種方式
public static void exeBatch(Connection conn) {
try {
String sql = "insert into t_example (code, name) values (?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "java2");
pstmt.setString(2, "java");
//添加一次預定義參數
pstmt.addBatch();
pstmt.setString(1, "360sdn");
pstmt.setString(2, "軟件開發技術網");
//再添加一次預定義參數
pstmt.addBatch();
//批量執行預定義SQL
pstmt.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection(conn);
}
}
方式二、批量執行混合模式的SQL、有預定義的,還有靜態的
//批量執行混合模式的SQL、有預定義的,還有靜態的
public static void exeBatchMixedSQL( Connection conn) {
PreparedStatement pstmt =null;
try {
String sql = "insert into t_example (code, name) values (?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "java");
pstmt.setString(2, "360sdn");
//添加一次預定義參數
pstmt.addBatch();
pstmt.setString(1, "360sdn");
pstmt.setString(2, "軟件開發技術網");
//再添加一次預定義參數
pstmt.addBatch();
//添加一次靜態SQL
pstmt.addBatch("update t_example set code= '360.com' where code='360sdn'");
//批量執行預定義SQL
pstmt.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection(conn);
}
}
方式三、執行批量靜態的SQL
//執行批量靜態的SQL
ublic static void exeBatchSQL(Connection conn) {
try {
Statement stmt = conn.createStatement();
//連續添加多條靜態SQL
stmt.addBatch("insert into t_example (code, name) values ('java', '360sdn.com')");
stmt.addBatch("insert into t_example (code, name) values ('360', '360sdn')");
stmt.addBatch("delete from t_example where code='java'");
stmt.addBatch("update t_example set kind = '360data' where kind='360'");
//批量執行不支持Select語句
// stmt.addBatch("select count(*) from t_example");
//執行批量執行
stmt.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection(conn);
}
}