CallableStatement
JDBC har et annet grensesnitt for enda mer komplekse scenarier. Det arver fra PreparedStatement og kalles CallableStatement .
Den brukes til å kalle opp (Call) lagrede prosedyrer i databasen. Det særegne med et slikt kall er at i tillegg til ResultSet- resultatet , kan parametere også sendes til en slik lagret prosedyre.
Hva er nytt, spør du? PreparedStatement har også et ResultSet- resultat , og du kan også sende parametere til det. Ja, det er riktig, men det særegne ved lagrede prosedyrer er at de gjennom parametere ikke bare kan motta, men også returnere data.
Den lagrede prosedyren kalles med IN , OUT og INOUT parametere . Den returnerer ett eller flere ResultSet- objekter . Connection.prepareCall()- metoden brukes til å lage et CallableStatement- objekt .
Tenk deg her at du har en lagret prosedyre ADD som aksepterer parameterne a, b og c. Denne prosedyren legger til a og b og plasserer resultatet av addisjonen i variabelen c.
La oss skrive koden der vi skal prøve å kalle 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();
Arbeid er nesten som med PreparedStatement , bare det er en nyanse. Vår ADD-funksjon returnerer resultatet av addisjonen i den tredje parameteren. Bare CallableStatement- objektet vet ingenting om dette. Derfor forteller vi ham dette eksplisitt ved å kalle registerOutParameter()- metoden :
registerOutParameter(parameter number, Parameter type)
Etter det kan du kalle frem prosedyren gjennom execute()- metoden og deretter lese dataene fra den tredje parameteren ved å bruke getInt()- metoden .
Batching forespørsler
I virkelige prosjekter oppstår det ofte en situasjon når du må lage mye av samme type spørringer (det vanligste i dette tilfellet er PreparedStatement ), for eksempel må du sette inn flere titalls eller hundrevis av poster.
Hvis du utfører hver forespørsel separat, vil det ta mye tid og redusere ytelsen til applikasjonen. For å forhindre dette kan du bruke batch-innsettingsmodus. Det ligger i det faktum at du akkumulerer litt buffer med forespørslene dine, og deretter utfører dem umiddelbart.
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 å utføre spørringen med execute()- metoden , batcher vi den med addBatch()- metoden .
Og så, når det er flere hundre forespørsler, kan du sende dem alle samtidig til serveren ved å kalle kommandoen executeBatch() .
Sunn. executeBatch()- metoden returnerer en rekke heltall — int[]. Hver celle i denne matrisen inneholder et tall som indikerer antall rader som er endret av den tilsvarende spørringen. Hvis forespørsel nummer 3 i batch endret 5 rader, vil den tredje cellen i matrisen inneholde nummer 5.