Oproepbare verklaring

JDBC heeft een andere interface voor nog complexere scenario's. Het erft van PreparedStatement en heet CallableStatement .

Het wordt gebruikt om opgeslagen procedures in de database aan te roepen (Call). Het bijzondere van een dergelijke aanroep is dat naast het ResultSet- resultaat ook parameters kunnen worden doorgegeven aan een dergelijke opgeslagen procedure.

Wat is er nieuw, vraag je? PreparedStatement heeft ook een ResultSet- resultaat en u kunt er ook parameters aan doorgeven. Ja, dat klopt, maar de bijzonderheid van opgeslagen procedures is dat ze via parameters niet alleen gegevens kunnen ontvangen, maar ook kunnen retourneren.

De opgeslagen procedure wordt aangeroepen met IN- , OUT- en INOUT- parameters . Het retourneert een of meer ResultSet- objecten . De methode Connection.prepareCall() wordt gebruikt om een ​​object CallableStatement te maken .

Stel je hier voor dat je een opgeslagen procedure ADD hebt die de parameters a, b en c accepteert. Deze procedure voegt a en b toe en plaatst het resultaat van de optelling in de variabele c.

Laten we de code schrijven waar we het zullen proberen te noemen:

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

Werk is bijna zoals met PreparedStatement , alleen is er een nuance. Onze ADD-functie retourneert het resultaat van de optelling in de derde parameter. Alleen het object CallableStatement weet hier niets van. Daarom vertellen we hem dit expliciet door de methode registerOutParameter() aan te roepen :

registerOutParameter(parameter number, Parameter type)

Daarna kunt u de procedure aanroepen via de methode execute() en vervolgens de gegevens van de derde parameter lezen met de methode getInt() .

Groepsaanvragen

In echte projecten doet zich vaak een situatie voor waarin u veel van hetzelfde type query's moet maken (de meest voorkomende in dit geval is PreparedStatement ), u moet bijvoorbeeld enkele tientallen of honderden records invoegen.

Als u elk verzoek afzonderlijk uitvoert, kost dit veel tijd en vermindert het de prestaties van de toepassing. Om dit te voorkomen kunt u gebruik maken van de batch invoegmodus. Het ligt in het feit dat u een buffer opbouwt met uw verzoeken en deze vervolgens onmiddellijk uitvoert.

Hier is een stukje code als voorbeeld:

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

In plaats van de query uit te voeren met de methode execute() , voeren we deze in batches uit met de methode addBatch() .

En als er honderden verzoeken zijn, kunt u ze allemaal tegelijk naar de server sturen door de opdracht executeBatch() aan te roepen .

Gezond. De methode executeBatch() retourneert een reeks gehele getallen — int[]. Elke cel in deze matrix bevat een getal dat het aantal rijen aangeeft dat is gewijzigd door de bijbehorende query. Als aanvraagnummer 3 in batch 5 rijen heeft gewijzigd, bevat de 3e cel van de array het nummer 5.