javaweb學習筆記(十六):JDBC(2)
阿新 • • 發佈:2018-11-08
批處理
當需要向資料庫傳送一批SQL語句執行時,應避免向資料庫一條條的傳送執行,而應採用JDBC的批處理機制,以提升執行效率。
實現批處理有兩種方式:
①Statement.addBatch(sql) :新增批處理命令。
優點:可以向資料庫傳送多條不同的SQL語句。
缺點:SQL語句沒有預編譯。當向資料庫傳送多條語句相同,但僅引數不同的SQL語句時,需重複寫上很多條SQL語句。
②PreparedStatement.addBatch()
優點:傳送的是預編譯後的SQL語句,執行效率高。
缺點:只能應用在SQL語句相同,但引數不同的批處理中。因此此種形式的批處理經常用於在同一個表中批量插入資料,或批量更新表的資料。
執行批處理SQL語句
executeBatch()方法:執行批處理命令。
clearBatch()方法:清除批處理命令。
例:
student.java :student實體
package entity; public class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } }
StuDao.java:封裝所有與資料庫的操作
package day1105; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import entity.Student; import util.jdbcUtil; public class StuDao { private Connection conn=null; private PreparedStatement stmt=null; private ResultSet rs=null; public void save(List<Student> list) { try { //獲取連線 conn=jdbcUtil.getConnection(); //SQL語句 String sql="INSERT INTO student(NAME,age) VALUES(?,?)"; //預編譯SQL語句 stmt=conn.prepareStatement(sql); for(int i=0;i<list.size();i++) { Student stu=list.get(i); stmt.setString(1, stu.getName()); stmt.setInt(2, stu.getAge()); //新增批處理 stmt.addBatch(); //每5條執行一次批處理 if(i%5==0) { //批量執行,批量處理 stmt.executeBatch(); stmt.clearBatch(); } } stmt.executeBatch(); stmt.clearBatch(); }catch(Exception e) { e.printStackTrace(); throw new RuntimeException(e); }finally { jdbcUtil.close(conn, stmt,rs); } } }
TestBatch.java:測試批處理
package day1105;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import entity.Student;
public class TestBatch {
@Test
//測試批處理
public void testBatch()throws Exception{
List<Student> list=new ArrayList<Student>();
//模擬資料
for(int i=1;i<50;i++) {
Student stu=new Student();
stu.setName("xiaohua"+i);
stu.setAge(i);
list.add(stu);
}
//儲存
StuDao dao=new StuDao();
dao.save(list);
}
}
結果: