CallableStatement
A JDBC-nek van egy másik felülete a még bonyolultabb forgatókönyvekhez. A PreparedStatementből öröklődik , és CallableStatement néven hívják .
Az adatbázisban tárolt eljárások meghívására (hívásra) szolgál. Az ilyen hívás sajátossága, hogy a ResultSet eredmény mellett paraméterek is átadhatók egy ilyen tárolt eljárásnak.
Mi az új, kérdezed? A PreparedStatementnek ResultSet eredménye is van , és paramétereket is átadhat neki. Igen, ez így van, de a tárolt eljárások sajátossága, hogy a paramétereken keresztül nem csak fogadni, hanem visszaadni is tudnak adatokat.
A tárolt eljárást IN , OUT és INOUT paraméterekkel hívják meg . Egy vagy több ResultSet objektumot ad vissza . A Connection.prepareCall() metódus egy CallableStatement objektum létrehozására szolgál .
Képzelje el, hogy van egy tárolt ADD eljárása, amely elfogadja az a, b és c paramétereket. Ez az eljárás összeadja a-t és b-t, és az összeadás eredményét a c változóba helyezi.
Írjuk be a kódot, ahol megpróbáljuk hívni:
// 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();
A munka majdnem olyan, mint a PreparedStatementnél , csak van egy árnyalat. Az ADD függvényünk az összeadás eredményét adja vissza a harmadik paraméterben. Csak a CallableStatement objektum nem tud erről semmit. Ezért ezt kifejezetten elmondjuk neki a registerOutParameter() metódus meghívásával :
registerOutParameter(parameter number, Parameter type)
Ezt követően meghívhatja az eljárást az execute() metóduson keresztül , majd a harmadik paraméter adatait a getInt() metódussal olvashatja ki .
Kötegelési kérelmek
Valós projektekben gyakran adódik olyan helyzet, amikor sok azonos típusú lekérdezést kell végrehajtani (a leggyakoribb ebben az esetben a PreparedStatement ), például több tíz vagy száz rekordot kell beszúrni.
Ha minden kérést külön hajt végre, az sok időt vesz igénybe, és csökkenti az alkalmazás teljesítményét. Ennek elkerülésére használhatja a kötegelt beszúrási módot. Ez abban rejlik, hogy felhalmoz egy puffert a kéréseihez, majd azonnal végrehajtja azokat.
Íme egy kódrészlet példaként:
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();
A lekérdezés végrehajtása helyett az execute() metódussal, az addBatch() metódussal kötegeljük .
És akkor, ha több száz kérés van, az executeBatch() parancs meghívásával egyszerre elküldheti őket a szervernek .
Egészséges. Az executeBatch() metódus egész számokból álló tömböt ad vissza – int[]. A tömb minden cellája tartalmaz egy számot, amely a megfelelő lekérdezés által módosított sorok számát jelzi. Ha a köteg 3-as számú kérése 5 sort változtatott, akkor a tömb 3. cellája az 5-ös számot fogja tartalmazni.
GO TO FULL VERSION