CallableStatement
JDBC มีอินเทอร์เฟซอื่นสำหรับสถานการณ์ที่ซับซ้อนมากยิ่งขึ้น ซึ่งสืบทอดมาจากPreparedStatementและเรียกว่าCallableStatement
ใช้สำหรับเรียก (Call) โพรซีเดอร์ที่เก็บไว้ในฐานข้อมูล ความไม่ชอบมาพากลของการโทรดังกล่าวคือ นอกเหนือจาก ผลลัพธ์ของ ResultSetแล้ว ยังสามารถส่งผ่านพารามิเตอร์ไปยังโพรซีเดอร์ที่จัดเก็บดังกล่าวได้อีกด้วย
มีอะไรใหม่คุณถาม? PreparedStatementยังมี ผลลัพธ์ ResultSetและคุณยังสามารถส่งพารามิเตอร์ไปยังผลลัพธ์ได้อีกด้วย ใช่ ถูกต้อง แต่ลักษณะเฉพาะของโพรซีเดอร์ที่เก็บไว้คือผ่านพารามิเตอร์ที่ไม่เพียงรับได้ แต่ยังสามารถส่งคืนข้อมูลได้ด้วย
โพรซีเดอร์ที่เก็บ ไว้ ถูกเรียกใช้ด้วย พารามิเตอร์IN , OUTและINOUT จะส่งกลับวัตถุ ResultSet ตั้งแต่หนึ่งรายการขึ้นไป เมธอด Connection.prepareCall()ใช้เพื่อสร้าง วัตถุ CallableStatement
ลองจินตนาการว่าคุณมี ADD ของกระบวนงานที่เก็บไว้ซึ่งยอมรับพารามิเตอร์ a, b และ c ขั้นตอนนี้เพิ่ม a และ b และวางผลลัพธ์ของการบวกในตัวแปร c
ลองเขียนโค้ดที่เราจะลองเรียกมันว่า:
// Connect to the server
Connection connection = DriverManager.getConnection("jdbc:as400://mySystem");
// Create a CallableStatement object. It does preprocessing
// calling a stored procedure. Question marks
// indicate where the input parameters should be substituted, and where the output ones
// The first two parameters are input,
// and the third one is a day off.
CallableStatement statement = connection.prepareCall("CALL MYLIBRARY.ADD (?, ?, ?)");
// Setting up input parameters. Passing 123 and 234 to the procedure
statement.setInt (1, 123);
statement.setInt (2, 234);
// Registering the output parameter type
statement.registerOutParameter (3, Types.INTEGER);
// Run stored procedure
statement.execute();
// Get the value of the output parameter
int sum = statement.getInt(3);
// Close CallableStatement and Connection
statement.close();
connection.close();
การทำงานเกือบจะเหมือนกับPreparedStatementมีเพียงความแตกต่างเล็กน้อยเท่านั้น ฟังก์ชัน ADD ของเราส่งคืนผลลัพธ์ของการบวกในพารามิเตอร์ที่สาม เฉพาะ วัตถุ CallableStatement เท่านั้น ที่ไม่รู้เรื่องนี้ ดังนั้นเราจึงบอกเขาอย่างชัดเจนโดยเรียก เมธอด registerOutParameter() :
registerOutParameter(parameter number, Parameter type)
หลังจากนั้น คุณสามารถเรียกใช้โพรซีเดอร์ผ่านเมธอดexecute()แล้วอ่านข้อมูลจากพารามิเตอร์ที่สามโดยใช้เมธอดgetInt()
คำขอแบทช์
ในโครงการจริง สถานการณ์มักเกิดขึ้นเมื่อคุณจำเป็นต้องสร้างข้อความค้นหาประเภทเดียวกันจำนวนมาก (ที่พบมากที่สุดในกรณีนี้คือPreparedStatement ) เช่น คุณต้องแทรกเรคคอร์ดหลายสิบหรือหลายร้อยเรคคอร์ด
หากคุณดำเนินการแต่ละคำขอแยกกัน จะใช้เวลานานและลดประสิทธิภาพของแอปพลิเคชัน เพื่อป้องกันสิ่งนี้ คุณสามารถใช้โหมดการแทรกเป็นชุด มันอยู่ในความจริงที่ว่าคุณสะสมบัฟเฟอร์กับคำขอของคุณแล้วดำเนินการทันที
นี่คือตัวอย่างโค้ดบางส่วน:
PreparedStatement stmt = con.prepareStatement(
"INSERT INTO jc_contact (first_name, last_name, phone, email) VALUES (?, ?, ?, ?)");
for (int i = 0; i < 10; i++) {
// Fill in the request parameters
stmt.setString(1, "FirstName_" + i);
stmt.setString(2, "LastNAme_" + i);
stmt.setString(3, "phone_" + i);
stmt.setString(4, "email_" + i);
// The request is not executed, but fits into the buffer,
// which is then executed immediately for all commands
stmt.addBatch();
}
// Execute all requests at once
int[] results = stmt.executeBatch();
แทนที่จะเรียกใช้คิวรีด้วยเมธอดexecute()เราแบทช์ด้วย เมธอด addBatch()
จากนั้น เมื่อมีคำขอหลายร้อยรายการ คุณสามารถส่งคำขอทั้งหมดไปยังเซิร์ฟเวอร์พร้อมกันได้โดยการเรียกคำ สั่ง executeBatch()
สุขภาพดี. เมธอดexecuteBatch()จะส่งคืนอาร์เรย์ของจำนวนเต็ม — int[] แต่ละเซลล์ในอาร์เรย์นี้มีตัวเลขที่ระบุจำนวนแถวที่แก้ไขโดยคิวรีที่เกี่ยวข้อง หากคำขอหมายเลข 3 ในชุดเปลี่ยนแปลง 5 แถว เซลล์ที่ 3 ของอาร์เรย์จะมีหมายเลข 5
GO TO FULL VERSION