CallableStatement
JDBC-də daha mürəkkəb ssenariləri icra etmək üçün başqa bir interfeys var. O, PreparedStatement-dən irsən alınır və CallableStatement adlanır.
Bu, bazada saxlanılan prosedurların çağırılması üçün istifadə olunur. Belə bir çağırışın özəlliyi odur ki, ResultSet nəticəsindən əlavə həmin prosedura parametrləri də ötürmək mümkündür.
Niyə bu yenidir, soruşa bilərsən? PreparedStatement da ResultSet nəticəsinə malikdir və ona parametrlər ötürmək mümkündür. Bəli, düz deyirsən, amma saxlanılan prosedurların özəlliyi odur ki, parametrlər vasitəsilə həm almaq, həm də məlumatı geri qaytarmaq mümkündür.
Saxlanılan prosedur IN, OUT və INOUT parametrləri ilə çağırılır. O, bir və ya bir neçə ResultSet obyektini qaytarır. CallableStatement obyektinin yaradılması üçün Connection.prepareCall() metodu nəzərdə tutulub.
Təsəvvür elə, sənin ADD adlı bir saxlanılan prosedurun var, o a, b və c parametrlərini qəbul edir. Bu prosedur a və b-nin cəmini hesablayır və nəticəni c dəyişəninə yerləşdirir.
Gəlin onu necə çağıracağımızı göstərən kod yazaq:
// Serverə qoşulma
Connection connection = DriverManager.getConnection("jdbc:as400://mySystem");
// CallableStatement obyektinin yaradılması. O, saxlanılan prosedurun ilkin emalını aparır.
// Sual işarələri hansı yerlərə giriş parametrlərinin,
// hansı yerlərə çıxış parametrlərinin qoyulacağını göstərir.
// İlk iki parametr girişdir,
// üçüncüsü isə çıxışdır.
CallableStatement statement = connection.prepareCall("CALL MYLIBRARY.ADD (?, ?, ?)");
// Giriş parametrlərinin konfiqurasiyası. Prosedura 123 və 234 verilir
statement.setInt (1, 123);
statement.setInt (2, 234);
// Çıxış parametrinin tipinin qeydiyyatı
statement.registerOutParameter (3, Types.INTEGER);
// Saxlanılan prosedurun işə salınması
statement.execute();
// Çıxış parametrinin dəyərinin alınması
int sum = statement.getInt(3);
// CallableStatement və Connection-un bağlanması
statement.close();
connection.close();
PreparedStatement ilə demək olar ki, eyni cür işləyir, amma bir fərq var. Bizim ADD funksiyamız üçüncü parametrdə cəmi qaytarır. CallableStatement obyekti bunun fərqində deyil. Buna görə də, biz ona bunu aydın şəkildə bildiririk, registerOutParameter() metodunu çağıraraq:
registerOutParameter(parametrNömrəsi, parametrTipi)
Bundan sonra proseduru execute() metodu ilə işə salmaq və üçüncü parametrdən getInt() metodu ilə məlumatları oxumaq mümkündür.
Sorğuların toplu icrası
Reallıqda layihələrdə tez-tez bir çox eyni tip sorğular etmək lazım gəlir (əksər hallarda PreparedStatement ilə rast gəlinir), misal üçün, bir neçə onlarla və ya yüzlərlə qeydi daxil etmək lazım olur.
Hər bir sorğunu ayrı-ayrılıqda icra etsən, bu çox vaxt alar və tətbiqin performansını azaldar. Bunu etməkdən qaçmaq üçün batch-modu istifadəyə etmək olar. Bu, sorğuları bir tamponda yığmaq və sonra hamısını birdən-birə icra etməkdən ibarətdir.
Məsələn, kod parçacığı təqdim edim:
PreparedStatement stmt = con.prepareStatement(
"INSERT INTO jc_contact (first_name, last_name, phone, email) VALUES (?, ?, ?, ?)");
for (int i = 0; i < 10; i++) {
// Sorğunun parametrlərini doldururuq
stmt.setString(1, "FirstName_" + i);
stmt.setString(2, "LastNAme_" + i);
stmt.setString(3, "phone_" + i);
stmt.setString(4, "email_" + i);
// Sorğu icra olunmur, əldə saxlanır və
// sonra bütün komandalar üçün bir anda icra olunur
stmt.addBatch();
}
// Bütün sorğuları birdən icra edirik
int[] results = stmt.executeBatch();
Sorğunu execute() metodu ilə icra etmək yerinə, onu addBatch() metodu ilə paketa yığırıq.
Daha sonra, yüzlərlə sorğu toplandıqda, onları birdən serverə göndərmək olar, executeBatch() komandasını çağıraraq.
Faydalıdır. executeBatch() metodu bütöv rəqəmlərdən ibarət bir massiv int[] qaytarır. Bu massivdəki hər hüceyrə müvafiq sorğu tərəfindən dəyişdirilən sətir sayını göstərir. Əgər batch-dəki 3-cü sorğu 5 sətir dəyişdiribsə, massivdəki 3-cü hüceyrədə 5 rəqəmi olacaq.
GO TO FULL VERSION