CallableStatement
JDBC има друг интерфейс за още по-сложни сценарии. Той наследява от PreparedStatement и се нарича CallableStatement .
Използва се за извикване (Call) на съхранени proceduresи в базата данни. Особеността на такова извикване е, че в допълнение към резултата ResultSet могат да се предават и параметри на такава запаметена proceduresа.
Какво ново, ще попитате? PreparedStatement също има резултат ResultSet и можете също да подадете параметри към него. Да, така е, но особеността на съхранените proceduresи е, че чрез параметри те могат не само да получават, но и да връщат данни.
Съхранената proceduresа се извиква с параметри IN , OUT и INOUT . Той връща един or повече ResultSet обекти . Методът Connection.prepareCall() се използва за създаване на обект CallableStatement .
Тук си представете, че имате запаметена proceduresа ADD, която приема параметри a, b и c. Тази proceduresа събира a и b и поставя резултата от събирането в променливата c.
Нека напишем codeа, където ще се опитаме да го извикаме:
// 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)
След това можете да извикате proceduresата чрез метода execute() и след това да прочетете данните от третия параметър с помощта на метода getInt() .
Пакетиране на заявки
В реални проекти често възниква ситуация, когато трябва да направите много от същия тип заявки (най-често срещаният в този случай е PreparedStatement ), например, трябва да вмъкнете няколко десетки or стотици записи.
Ако изпълните всяка заявка поотделно, това ще отнеме много време и ще намали производителността на приложението. За да предотвратите това, можете да използвате режима на партидно вмъкване. Той се крие във факта, че натрупвате няHowъв буфер с вашите заявки и след това ги изпълнявате незабавно.
Ето част от codeа като пример:
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