CallableStatement

JDBC har en anden grænseflade til endnu mere komplekse scenarier. Det arver fra PreparedStatement og kaldes CallableStatement .

Den bruges til at kalde (Call) lagrede procedurer i databasen. Det særlige ved et sådant opkald er, at ud over ResultSet- resultatet kan parametre også overføres til en sådan lagret procedure.

Hvad er nyt, spørger du? PreparedStatement har også et ResultSet- resultat , og du kan også sende parametre til det. Ja, det er rigtigt, men det særlige ved lagrede procedurer er, at de gennem parametre ikke kun kan modtage, men også returnere data.

Den lagrede procedure kaldes med IN , OUT og INOUT parametre . Det returnerer et eller flere ResultSet- objekter . Metoden Connection.prepareCall() bruges til at oprette et CallableStatement- objekt .

Forestil dig her, at du har en lagret procedure ADD, som accepterer parametrene a, b og c. Denne procedure tilføjer a og b og placerer resultatet af tilføjelsen i variablen c.

Lad os skrive koden, hvor vi vil prøve at kalde den:

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

Arbejdet er næsten som med PreparedStatement , kun der er en nuance. Vores ADD-funktion returnerer resultatet af tilføjelsen i den tredje parameter. Kun CallableStatement- objektet ved intet om dette. Derfor fortæller vi ham dette eksplicit ved at kalde registerOutParameter() metoden :

registerOutParameter(parameter number, Parameter type)

Derefter kan du kalde proceduren gennem execute()- metoden og derefter læse dataene fra den tredje parameter ved hjælp af getInt()- metoden .

Batching anmodninger

I rigtige projekter opstår der ofte en situation, hvor du skal lave en masse af den samme type forespørgsler (den mest almindelige i dette tilfælde er PreparedStatement ), for eksempel skal du indsætte flere tiere eller hundredvis af poster.

Hvis du udfører hver anmodning separat, vil det tage meget tid og reducere applikationens ydeevne. For at forhindre dette kan du bruge batchindsættelsestilstanden. Det ligger i, at du akkumulerer noget buffer med dine anmodninger, og derefter udfører dem med det samme.

Her er et stykke kode som et eksempel:

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

I stedet for at udføre forespørgslen med execute()- metoden , batcherer vi den med addBatch()- metoden .

Og så, når der er flere hundrede anmodninger, kan du sende dem alle på én gang til serveren ved at kalde kommandoen executeBatch() .

Sund og rask. executeBatch() -metoden returnerer en matrix af heltal — int[]. Hver celle i dette array indeholder et tal, der angiver antallet af rækker, der er ændret af den tilsvarende forespørgsel. Hvis anmodning nummer 3 i batch ændrede 5 rækker, vil den 3. celle i arrayet indeholde nummer 5.