Computer >> Máy Tính >  >> Lập trình >> MySQL

Tại sao Báo cáo chuẩn bị trong JDBC nhanh hơn Báo cáo? Giải thích?

Trong khi thực thi các câu lệnh bằng đối tượng Statement, đặc biệt là các câu lệnh insert, mỗi khi thực hiện một truy vấn, toàn bộ câu lệnh sẽ được biên dịch và thực thi lặp đi lặp lại ở đó, điểm khác biệt duy nhất giữa các câu lệnh này là giá trị của các câu lệnh.

Trong khi đó, câu lệnh chuẩn bị sẵn là một câu lệnh được biên dịch trước, tức là truy vấn được biên dịch và lưu trữ trong cơ sở dữ liệu, sử dụng các trình giữ chỗ (?) Thay vì các giá trị và giá trị cho các trình giữ chỗ này sẽ được cung cấp sau đó.

Do đó, tránh việc biên dịch không cần thiết và thực hiện lại câu lệnh.

Ví dụ

Giả sử, chúng ta có một bảng có tên Tập dữ liệu trong cơ sở dữ liệu với các cột mobile_brand unit_sale , nếu chúng ta muốn chèn các bản ghi vào bảng này bằng cách sử dụng đối tượng câu lệnh, mã sẽ như sau:

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)");

Và đối với mọi executeUpdate () lệnh gọi phương thức toàn bộ câu lệnh trong nó được biên dịch và thực thi. Tại đây, nếu bạn chỉ quan sát thấy các giá trị của câu lệnh đang được thay đổi và truy vấn còn lại đang được biên dịch một cách không cần thiết.

Nếu bạn viết truy vấn chèn bằng cách sử dụng câu lệnh đã chuẩn bị để chèn cùng một dữ liệu trong cùng một bảng, mã sẽ giống như sau:

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 nếu bạn quan sát thấy truy vấn chèn được chuẩn bị với các trình giữ chỗ (?) Và truy vấn này được biên dịch và lưu trữ trong cơ sở dữ liệu và sau đó, các giá trị được chuyển bằng cách sử dụng các phương thức setter của giao diện PreparedStatement, do đó, tránh việc thực thi câu lệnh không cần thiết.