CallableBildirimi

JDBC'nin daha da karmaşık senaryolar için başka bir arabirimi vardır. ReadyedStatement öğesinden miras alır ve CallableStatement olarak adlandırılır .

Veritabanındaki saklı yordamları çağırmak (Call) için kullanılır. Böyle bir çağrının özelliği, ResultSet sonucuna ek olarak parametrelerin de böyle bir saklı yordama geçirilebilmesidir.

Yeni ne var, soruyorsun? PreparedStatement ayrıca bir ResultSet sonucuna sahiptir ve buna parametreler de iletebilirsiniz. Evet, bu doğru, ancak saklı yordamların özelliği, parametreler aracılığıyla yalnızca veri alamamaları, aynı zamanda verileri de döndürebilmeleridir.

Saklı yordam IN , OUT ve INOUT parametreleriyle çağrılır . Bir veya daha fazla ResultSet nesnesi döndürür . Connection.prepareCall() yöntemi, bir CallableStatement nesnesi oluşturmak için kullanılır .

Burada, a, b ve c parametrelerini kabul eden bir saklı yordam ADD'niz olduğunu hayal edin. Bu prosedür a ve b'yi ekler ve toplamanın sonucunu c değişkenine yerleştirir.

Şimdi onu çağırmaya çalışacağımız kodu yazalım:

// 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();

İş neredeyse PreparedStatement gibidir , sadece bir nüans vardır. ADD fonksiyonumuz, üçüncü parametredeki toplamanın sonucunu döndürür. Yalnızca CallableStatement nesnesi bu konuda hiçbir şey bilmez. Bu nedenle, registerOutParameter() yöntemini çağırarak bunu ona açıkça söylüyoruz :

registerOutParameter(parameter number, Parameter type)

Bundan sonra, executive() yöntemi aracılığıyla yordamı çağırabilir ve ardından getInt() yöntemini kullanarak üçüncü parametredeki verileri okuyabilirsiniz .

Toplu İstekler

Gerçek projelerde, genellikle aynı türde çok sayıda sorgu yapmanız gerektiğinde (bu durumda en yaygın olanı PreparedStatement ) , örneğin, onlarca veya yüzlerce kayıt eklemeniz gerektiğinde bir durum ortaya çıkar.

Her isteği ayrı ayrı yürütürseniz, çok zaman alacak ve uygulamanın performansını düşürecektir. Bunu önlemek için toplu ekleme modunu kullanabilirsiniz. İsteklerinizle bir miktar arabellek biriktirmeniz ve ardından onları hemen yürütmeniz gerçeğinde yatmaktadır.

İşte örnek olarak bir kod parçası:

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

Yürütme() yöntemiyle sorguyu yürütmek yerine , onu addBatch() yöntemiyle toplu hale getiriyoruz .

Ardından, birkaç yüz istek olduğunda, bunları tek seferde ExecutBatch() komutunu çağırarak sunucuya gönderebilirsiniz .

Sağlıklı. executBatch() yöntemi, bir tamsayı dizisi döndürür — int[]. Bu dizideki her hücre, karşılık gelen sorgu tarafından değiştirilen satır sayısını gösteren bir sayı içerir. Partideki 3 numaralı istek 5 satırı değiştirirse, dizinin 3. hücresinde 5 sayısı yer alır.