Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tại sao PreparedStatement trong JDBC nhanh hơn Statement? Giải thích?


Khi thực thi câu lệnh bằng đối tượng Statement, đặc biệt là câu lệnh INSERT, mỗi lần truy vấn được thực thi thì toàn bộ câu lệnh được biên dịch và thực thi lại, trong khi chỉ có giá trị của câu lệnh thay đổi.

Ngược lại, PreparedStatement là câu lệnh được biên dịch trước (precompiled) - truy vấn được biên dịch và lưu trong database, sử dụng placeholder (?) thay vì giá trị, và giá trị cho các placeholder được cung cấp sau.

Điều này tránh việc biên dịch và thực thi không cần thiết câu lệnh lặp đi lặp lại.

Ví dụ

Giả sử có bảng Dataset với cột mobile_brand và unit_sale. Chèn bản ghi bằng Statement:

stmt.executeUpdate("insert into Dataset values('Iphone', 3000)"); 
stmt.executeUpdate("insert into Dataset values('Samsung', 4000)"); 
stmt.executeUpdate("insert into Dataset values('Nokia', 5000)"); 
stmt.executeUpdate("insert into Dataset values('Vivo', 1500)"); 
stmt.executeUpdate("insert into Dataset values('Oppo', 9000)"); 
stmt.executeUpdate("insert into Dataset values('MI', 6400)"); 
stmt.executeUpdate("insert into Dataset values('MotoG', 4360)"); 
stmt.executeUpdate("insert into Dataset values('Lenovo', 4100)"); 
stmt.executeUpdate("insert into Dataset values('RedMi', 4000)"); 
stmt.executeUpdate("insert into Dataset values('OnePlus', 6334)");

Mỗi lần gọi executeUpdate(), toàn bộ câu lệnh được biên dịch và thực thi. Chỉ giá trị thay đổi, phần còn lại bị biên dịch thừa.

Nếu dùng PreparedStatement để chèn cùng dữ liệu:

PreparedStatement pstmt = con.prepareStatement("insert into Dataset values(?, ?)"); 
pstmt.setString(1, "Iphone"); pstmt.setInt(2, 3000); pstmt.executeUpdate(); 
pstmt.setString(1, "Samsung"); pstmt.setInt(2, 4000); pstmt.executeUpdate(); 
pstmt.setString(1, "Nokia"); pstmt.setInt(2, 5000); pstmt.executeUpdate(); 
pstmt.setString(1, "Vivo"); pstmt.setInt(2, 1500); pstmt.executeUpdate(); 
pstmt.setString(1, "Oppo"); pstmt.setInt(2, 900); pstmt.executeUpdate(); 
pstmt.setString(1, "MI"); pstmt.setInt(2, 6400); pstmt.executeUpdate(); 
pstmt.setString(1, "MotoG"); pstmt.setInt(2, 4360); pstmt.executeUpdate(); 
pstmt.setString(1, "Lenovo"); pstmt.setInt(2, 4100); pstmt.executeUpdate(); 
pstmt.setString(1, "RedMi"); pstmt.setInt(2, 4000); pstmt.executeUpdate(); 
pstmt.setString(1, "MotoG"); pstmt.setInt(2, 4360); pstmt.executeUpdate(); 
pstmt.setString(1, "OnePlus"); pstmt.setInt(2, 6334); pstmt.executeUpdate();

Ở đây câu lệnh INSERT được chuẩn bị với placeholder (?), được biên dịch và lưu trong database, sau đó giá trị được truyền qua setter methods của PreparedStatement, tránh việc thực thi thừa.