1. 程式人生 > >javaweb學習筆記(十六):JDBC(2)

javaweb學習筆記(十六):JDBC(2)

批處理

當需要向資料庫傳送一批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);
	}
}

結果: