批處理指的是一次操作中執行多條SQL語句,相比於一次一次執行效率會提高很多
- 批處理主要是分兩步:
- 將要執行的SQL語句保存
- 執行SQL語句
Statement和PreparedStatement都支持批處理操作,PreparedStatement的批處理方式:
- 方法:
- void addBatch():將要執行的SQL先保存起來,先不執行,這個方法在設置完所有的占位符之后調用
- int[] executeBatch():這個方法用來執行SQL語句,這個方法會將批處理中所有SQL語句執行
mysql默認批處理是關閉的,所以還需要去打開mysql的批處理:
rewriteBatchedStatements=true
需要將以上的參數添加到mysql的url地址中,不加的話,也能執行,但並不是真正的批處理,很慢。
注意:低版本的mysql-jdbc驅動也不支持批處理,一般都是在修改的時候使用批處理,查詢的時候不使用!(mysql-connector-java-5.1.7-bin.jar不支持,mysql-connector-java-5.1.42.jar支持)
1、創建一張新的數據表
CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(50) )
2、引入批處理
1 @Test//測試批處理 2 public void testBatch(){ 3 //向student表中插入10000條數據 4 //准備兩個變量 5 Connection connection = null; 6 PreparedStatement ps = null; 7 try { 8 conn = DBUtil.getConn();//獲取數據庫連接 9 String sql = "INSERT INTO student(NAME) VALUES(?)";//准備SQL模板 10 ps = conn.prepareStatement(sql);//獲取PrepareStatement 11 //創建一個for循環,來設置占位符 12 for(int i = 0; i < 1000 ;i++){ 13 ps.setString(1,"stu"+i);//填充占位符 14 ps.addBatch();//添加到批處理方法中,調用無參的方法,有參的是Statement來調用的! 15 } 16 17 long start = System.currentTimeMillis();//獲取一個時間戳 18 ps.executeBatch();//執行批處理 19 long end = System.currentTimeMillis();//獲取一個時間戳 20 System.out.println("用時:"+(end-start)); 21 } catch (SQLException e) { 22 e.printStackTrace(); 23 } 24 }
批處理執行效率高,資源利用率好!
插入1000條數據(沒有開啟批處理):13120ms
插入1000條數據(開啟批處理):517ms
DBUtil工具類 --->資源目錄--->工具類--->數據庫操作工具類
mysql-connector-java-5.1.42.jar --->資源目錄--->jar包資源--->mysqlConnection jar包