25.【批處理及PreparedStatement物件】
阿新 • • 發佈:2018-12-13
批處理
當向資料庫傳送多條不同的SQL語句時,可以使用Statement實現批處理。Statement通過addBatch()方法新增一條SQL語句,通過executeBatch()方法批量執行SQL語句。
public static void main(String[] args) { Connection conn=null; Statement stmt=null; try { conn=JDBCUtils.getConnection(); stmt=conn.createStatement(); //sql語句 String sql1="drop table if exists school"; String sql2="create table school(id int,name varchar(20))"; String sql3="insert into school values(2,'傳智播客')"; String sql4="update school set id=1"; //Statement批處理SQL語句 stmt.addBatch(sql1); stmt.addBatch(sql2); stmt.addBatch(sql3); stmt.addBatch(sql4); stmt.executeBatch(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally{ JDBCUtils.release(null, stmt,conn); } }
PreparedStatement物件
Statement物件每次執行SQL語句時,都會對其進行編譯。當相同的SQL語句執行多次時,Statement物件就會使資料庫頻繁編譯相同的SQL語句,從而降低資料庫的訪問效率。。為了解決這個問題,PreparedStatement應運而生。也就是說,當相同的SQL語句再次執行時,資料庫只需要使用緩衝區中的資料,而不需要對SQL語句再次編譯,從而有效提高資料的訪問效率。 這個介面可以傳入引數化的SQL語句,防止SQL注入.
public static void main(String[] args) throws SQLException { Connection conn = null; PreparedStatement preStmt = null; try { // 載入資料庫驅動 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/jdbc"; String username = "root"; String password = "root"; // 建立應用程式與資料庫連線的Connection物件 conn = DriverManager.getConnection(url, username, password); // 執行的SQL語句 String sql = "INSERT INTO users(name,password,email,birthday)" + "VALUES(?,?,?,?)"; // 建立執行SQL語句的PreparedStatement 物件 preStmt = conn.prepareStatement(sql); preStmt.setString(1, "zl"); preStmt.setString(2, "123456"); preStmt.setString(3, "
[email protected]"); preStmt.setString(4, "1989-12-23"); preStmt.executeUpdate(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { // 釋放資源 if (preStmt != null) { try { preStmt.close(); } catch (SQLException e) { e.printStackTrace(); } preStmt = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } }
PreParedStatement批處理
當向同一個資料表中批量更新資料時,如果使用Statement,需要書寫很多SQL語句,這時,為了避免重複程式碼的書寫,可以使用PreparedStatement實現批處理。與Statement相比,PreparedStatement靈活許多,它既可以使用完整的SQL,也可以使用帶引數的不完整SQL.但是,對於不完整的SQL,其具體的內容是用“?”佔位符形式出現的,設定時要按照“?”順序設定具體 的內容。
public static void main(String[] args) throws SQLException {
Connection conn = null;
PreparedStatement preStmt = null;
try {
// 載入資料庫驅動
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "root";
// 建立應用程式與資料庫連線的Connection物件
conn = DriverManager.getConnection(url, username, password);
// 執行的SQL語句
String sql = "INSERT INTO users(name,password,email,birthday)" + "VALUES(?,?,?,?)";
preStmt = conn.prepareStatement(sql);
for (int i = 0; i < 5; i++) {
preStmt.setString(1, "name" + i);
preStmt.setString(2, "password" + i);
preStmt.setString(3, "email" + i + "@itcast.cn");
preStmt.setDate(4, Date.valueOf("1989-02-19"));
preStmt.addBatch();
}
preStmt.executeBatch();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally { // 釋放資源
if (preStmt != null) {
try {
preStmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
preStmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}