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