java jdbc transaction management with example
In deze zelfstudie worden JDBC-transactietypen, gegevenstypen en transactiebeheermethoden uitgelegd en hoe u deze in het Java-programma kunt gebruiken:
In de JDBC ResultSet tutorial van de JDBC-tutorialserie hebben we geleerd JDBC ResultSet te gebruiken om gegevens op te halen.
In deze tutorial bespreken we de transactietypen in JDBC. In onze vorige tutorials hebben we een korte introductie van de transactietypen gezien. Hier zullen we op een gedetailleerde manier zien. We zullen ook bespreken wat de gegevenstypen in JDBC zijn en hoe u deze in het Java-programma kunt gebruiken.
De database heeft verschillende gegevenstypen en Java heeft verschillende gegevenstypen. JDBC zal deze differentiatie beheren. Laten we ons voorbereiden op het belangrijke onderwerp in JDBC.
Wat je leert:
JDBC-transactiebeheer
De reeks acties (SQL-instructies) wordt behandeld als een enkele eenheid die bekend staat als een transactie. Transactiebeheer is belangrijk voor RDBMS-georiënteerde applicaties om de gegevensintegriteit en -consistentie te behouden.
Tijdens het uitvoeren van de transactie zullen we de methoden getXXX en setXXX gebruiken om de gegevens in het ResultSet-object op te halen en in te stellen. XXX staat voor de gegevenstypen van de kolommen. In deze tutorial bespreken we de transactie- en gegevenstypen van JDBC.
Transactietypen
In JDBC wordt elke SQL-query als een transactie beschouwd. Wanneer we een databaseverbinding in JDBC maken, wordt deze uitgevoerd in de modus voor automatisch vastleggen (waarde voor automatisch vastleggen is WAAR). Na uitvoering van de SQL-instructie wordt deze automatisch vastgelegd.
Soms willen we de transactie vastleggen na het uitvoeren van wat meer SQL-instructies. Op dat moment moeten we de auto-commit waarde op False zetten. Zodat de gegevens niet worden vastgelegd voordat alle zoekopdrachten zijn uitgevoerd. Als we een uitzondering in de transactie krijgen, kunnen we wijzigingen terugdraaien () en maken zoals voorheen. Transactiebeheer kan goed worden uitgelegd - met behulp van ACID-eigenschappen.
ACID betekent
- A – Atomiciteit -> Als alle zoekopdrachten succesvol zijn uitgevoerd, worden de gegevens vastgelegd, anders niet.
- C – Consistentie -> DB moet na elke transactie in een consistente staat zijn.
- I– Isolatie -> De transactie is geïsoleerd van andere transacties.
- D – Duurzaamheid -> Als de transactie eenmaal is vastgelegd, blijft deze altijd gecommitteerd.
Er zijn drie belangrijkste functies in Transactiebeheer. Zij zijn:
verschil tussen agile en waterval testen
- Vastleggen: Na het uitvoeren van de SQL-statements willen we de wijzigingen permanent maken in de Database. We zouden de methode commit () moeten aanroepen. Normaal gesproken betekent vastleggen dat het de wijzigingen permanent in de database zal aanbrengen. We kunnen de wijzigingen niet ongedaan maken / intrekken. Maar we kunnen de gegevens in de database wijzigen.
- Terugrollen: Rollback maakt de wijzigingen ongedaan tot de laatste vastlegging of genoemd opslagpunt. Soms willen we de wijzigingen ongedaan maken. Bijvoorbeeld, we hebben één geneste zoekopdracht, het ene deel is met succes uitgevoerd en het andere heeft een uitzondering gegenereerd. Op dat moment willen we de wijzigingen ongedaan maken die door het eerste deel zijn aangebracht, we moeten de methode Rollback () aanroepen om dat te doen als er een uitzondering is opgetreden.
- Opslagpunt: Savepoint helpt om een checkpoint in een transactie te creëren en maakt het mogelijk om een rollback naar dat specifieke savepoint uit te voeren. Elk opslagpunt dat voor een transactie is gemaakt, wordt automatisch vernietigd en wordt ongeldig zodra de transactie is vastgelegd of teruggedraaid.
Tot nu toe hebben we gezien wat commit, rollback en savepoint en zijn bewerkingen is. Hieronder zullen we de methoden ervan zien en hoe u het in het programma kunt gebruiken.
Methoden voor transactiebeheer
De verbindingsinterface biedt 5 methoden voor transactiebeheer. Ze zijn als volgt:
# 1) setAutoCommit () - methode
Standaard is de waarde van AutoCommit-waarde TRUE. Na uitvoering van de SQL-instructie wordt deze automatisch vastgelegd. Door de setAutoCommit () methode te gebruiken, kunnen we de waarde instellen op AutoCommit.
# 2) Commit () -methode
De vastleggingsmethode wordt gebruikt om de gegevens vast te leggen. Na het uitvoeren van de SQL-instructie kunnen we de commit () aanroepen. Het legt de wijzigingen vast die door de SQL-instructie zijn aangebracht.
Syntaxis: conn.commit ();
# 3) Rollback () -methode
De rollback-methode wordt gebruikt om de wijzigingen ongedaan te maken totdat de laatste commit heeft plaatsgevonden. Als we een probleem of uitzondering tegenkomen in de uitvoeringsstroom van de SQL-instructies, kunnen we de transactie ongedaan maken.
Syntaxis: conn.rollback ();
# 4) setSavepoint () methode
Savepoint geeft je extra controle over de transactie. Wanneer u een opslagpunt in de transactie instelt (een groep SQL-instructies), kunt u de methode rollback () gebruiken om alle wijzigingen tot het opslagpunt of na het opslagpunt () ongedaan te maken. De methode setSavepoint () wordt gebruikt om een nieuw opslagpunt te maken.
# 5) releaseSavepoint () - methode
Het wordt gebruikt om het aangemaakte opslagpunt te verwijderen.
In het onderstaande programma leert u meer over deze methoden en leert u ook hoe u deze in het Java-programma kunt gebruiken.
In deze tutorial zijn alle programma's geschreven in Java. We hebben de Java 8-versie en Oracle DB gebruikt.
>> Klik hier om de Oracle-software te downloaden.
>> Klik hier om de Java-versie 8 te downloaden.
Het heeft het stapsgewijze Java-installatieproces.
Transactie voorbeeldprogramma
Uitgang:
Uitleg:
Wat we in het bovenstaande transactiebeheerprogramma hebben gedaan, is de waarden van de gegeven werknemer in de tabel EMPLOYEE_DETAILS bijwerken en de gegevens vastleggen. Als er een fout of uitzondering is opgetreden, hebben we de bewerking rollback () uitgevoerd. Nu gaan we de volledige uitleg van het programma zien.
# 1) 2 Selecteer query gemaakt voor 2 werknemers op basis van hun EMPID
Hieronder staan de 2 geselecteerde zoekopdrachten.
#twee) Twee update-queries gemaakt voor 2 werknemers op basis van hun EMPID
Twee bijgewerkte zoekopdrachten:
# 3) Open Connection, voer de selectiequery uit en geef de gegevens van EMPNUM = 2001 weer.
# 4) Gebruik de methode setAutoCommit () om de waarde van autoCommit in te stellen op false.
# 5) De update-query van EMPNUM = 2001 uitgevoerd en een andere verbinding gemaakt voor dezelfde Database en de waarde van EMPNUM = 2001 geselecteerd.
# 6) De resulterende gegevens van de werknemer wiens EMPNUM = 2001 niet de bijgewerkte gegevens zijn. Omdat we de bewerking commit () niet hebben uitgevoerd. Als u dezelfde verbinding heeft gebruikt als waarmee u deze hebt bijgewerkt, zou deze u de bijgewerkte gegevens hebben getoond. Nu de gegevens vastgelegd. De gegevens zijn weergegeven in de tabel.
# 7) Er is één opslagpunt gemaakt na de vastlegbewerking.
# 8) Gebruik van de selectiequery om gegevens van het EMPNUM = 2002 weer te geven. Het salaris van die werknemer gewijzigd met behulp van een update-query. Daarna werden de gegevens van de EMPNUM = 2002 weergegeven met dezelfde verbinding. Het zou de bijgewerkte gegevens moeten tonen.
# 9) Rollback uitgevoerd tot het laatste opslagpunt met behulp van de rollback-methode. Als we nu de gegevens van die werknemer hebben weergegeven met dezelfde verbinding, heeft deze de oude gegevens omdat rollback de wijzigingen ongedaan maakt tot het laatste opslagpunt als we het opslagpunt anders vermelden bij de laatste vastlegging.
# 10) We hebben een methode gemaakt die de gegevens weergeeft, omdat we hier vaak gegevens weergeven.
JDBC-gegevenstypen
Databases hebben SQL-gegevenstypen en Java heeft Java-gegevenstypen. Er zou een mechanisme moeten zijn voor het lezen en schrijven van gegevens tussen een Java-applicatie en een database. Verschillende databases ondersteunen SQL-typen, maar met enkele variaties in de naam.
Bijvoorbeeld, de meeste databases ondersteunen grote binaire waarden, Oracle noemt het LONG RAW, Sybase noemt het IMAGE, Informix noemt het BYTE en DB2 noemt het LONG VARCHAR FOR BIT DATA.
Bij het schrijven van het JDBC-programma hoeven we ons geen zorgen te maken over SQL-gegevenstypen die door de doeldatabase worden gebruikt. JDBC heeft een set algemene SQL-type-ID's in de klasse java.sql.Types. Deze typen zijn ontworpen om de meeste algemene SQL-gegevenstypen te ondersteunen. Bij het schrijven van een JDBC-programma zullen we alleen JDBC-gegevenstypen gebruiken.
JDBC-stuurprogramma converteert de Java-gegevenstypen heen en weer naar databasegegevenstypen. U kunt de methode java.sql.DatabaseMetaData.getTypeInfo gebruiken om te controleren welke SQL-typen daadwerkelijk worden ondersteund door een bepaalde database en vervolgens een programma schrijven. JDBC gebruikt een standaardtoewijzing voor de meeste gegevenstypen.
Bijvoorbeeld, de Java-string wordt geconverteerd naar een SQL VARCHAR-type.
We zullen zien hoe de toewijzing wordt gedaan in de setXXX-, getXXX- en updateXXX-methode van de voorbereideStatement- of CallableStatement- of ResultSet-interfaces in de volgende tabel:
SQL-TYPE | JAVA / JDBC-TYPE | setXXX | getXXX | updateXXX |
---|---|---|---|---|
GEHEEL GETAL | int | setInt | getInt | updateInt |
CHAR | java.lang.String | setString | getString | updateString |
VARCHAR | java.lang.String | setString | getString | updateString |
LONGVARCHAR | java.lang.String | setString | getString | updateString |
BEETJE | boolean | setBoolean | getBoolean | updateBoolean |
NUMERIEK | java.math.BigDecimal | setBigDecimal | getBigDecimal | UpdateBigDecimal |
KLEIN | kort | setShort | getShort | updateShort |
GROOT | lang | setLong | getLong | updateLong |
ECHT | vlotter | setFloat | getFloat | updateFloat |
VLOTTER | vlotter | setFloat | getFloat | updateFloat |
DUBBELE | dubbele | setDouble | getDouble | updateDouble |
BINAIR | byte() | setBytes | getBytes | updateBytes |
DATUM | java.sql.Datum | setDate | krijg datum | updateDate |
TIJD | java.sql.Time | tijd instellen | krijg tijd | update tijd |
TIJDSTAMP | java.sql.Timestamp | setTimestamp | getTimestamp | updateTimeStamp |
CLOB | java.sql.Clob | setClob | getClob | updateClob |
BLOB | java.sql.Blob | setBlob | getBlob | updateBlob |
ARRAY | Array | setArray | getArray | updateArray |
XML | Xml | setSQLXML | getSQLXML | updateSQLXML |
Gestructureerd type | Voorwerp | setObject | getObject | updateObject |
We hebben de methode setXXX, getXXX en updateXXX voor basisgegevenstypen in onze vorige tutorials. Daar kun je naar verwijzen.
Hier hebben we clob- en blob-typen uitgelegd in het volgende voorbeeld.
BLOB-voorbeeldprogramma
Uitgang:
Het bestand is met succes opgeslagen in het opgegeven pad.
Uitleg:
In het bovenstaande programma hebben we gedaan. Eerst hebben we een afbeelding in de map gemaakt / opgeslagen 'D: \ Bhakiya \ Bhakiya \ JDBC' Deze locatie is slechts een voorbeeld. U kunt uw eigen bestandspad in uw systeem maken. De naam van het bestand is een softwaretestfoto. Vervolgens hebben we een Java-programma gemaakt om die afbeelding in de DB-tabel op te slaan en de afbeelding uit de tabel op te halen en op te slaan in het lokale systeem.
Tot nu toe hebben we het overzicht van de taak besproken. Nu zullen we zien hoe we het hebben bereikt in het programma.
# 1) Maak een tabel in DB om de afbeelding op te slaan.
Syntaxis:
In de bovenstaande zoekopdracht hebben we 2 kolommen.
- PicName - varchar2 -> Het wordt gebruikt om de naam van de afbeelding op te slaan
- picture - BLOB -> Het wordt gebruikt om de Picture in Table op te slaan.
Het BLOB-gegevenstype wordt gebruikt om de afbeelding / afbeelding in de databasetabel op te slaan.
#twee) Verbinding en instructie zijn gemaakt en de uitvoeringsmethode aangeroepen om de CREATE Query uit te voeren.
# 3) Vervolgens hebben we de invoegquery gemaakt en deze uitgevoerd met PreparedStatement.
PreparedStatement-syntaxis:
# 4) Gebruik setString () - stel de naam van de afbeelding in.
# 5) Om de afbeelding in te stellen, gebruikt u de klasse FileInputStream om de afbeeldingslocatie door te geven.
Syntaxis:
Vervolgens kunnen we met behulp van de methode setBlob () de afbeelding instellen in het object PreparedStatement. Daarna de execute-methode van PreparedStatement genoemd. Dat zal de gegeven gegevens in de tabel invoegen.
Na het uitvoeren van de invoegquery, halen we met behulp van het ResultSet-object de gegevens op uit de tabel (met behulp van Select Query).
# 6) Door de getString-methode te gebruiken, kunnen we de waarde van de PicName Column krijgen.
# 7) Volg de onderstaande stappen om de afbeelding te krijgen:
- Maak een Blob-object en wijs de retourwaarden toe van de getBlob-methode van het ResultSet-object.
- Syntaxis daarvoor is: Blob blob1 = rs.getBlob ();
- Maak een byte-array-object en haal de waarde van het Blob-object op als bytes.
- Maak een object FileOutputStream-object en geef het volledige pad door om de afbeelding in dat pad op te slaan. Roep de methode write () van het FileOutputStream-object aan, waarmee de afbeelding wordt opgeslagen.
- Daarna is het programma met succes uitgevoerd.
# 8) Ga naar de locatie van de Output-afbeelding en controleer of de input en output hetzelfde zijn.
CLOB Voorbeeldprogramma
Uitgang:
Invoer bestand:
Het bestand is met succes opgeslagen in het opgegeven pad.
Uitvoerbestand:
Uitleg:
In het bovenstaande programma hebben we eerst een tekstbestand 'file1.txt' aangemaakt / opgeslagen in de map 'D: \ Bhakiya \ Bhakiya \ JDBC'. Deze locatie is slechts een voorbeeld. U kunt uw eigen bestandspad in uw systeem maken. Vervolgens hebben we een Java-programma gemaakt om dat bestand op te slaan in de DB-tabel en dat bestand uit de tabel op te halen en op te slaan in het lokale systeem.
Tot nu toe hebben we het overzicht van de taak besproken. Nu zullen we zien hoe we het hebben bereikt in het programma.
# 1) Maak een tabel in DB om de afbeelding op te slaan.
Hieronder staat de syntaxis van de CREATE TABLE-query:
In de bovenstaande zoekopdracht hebben we 2 kolommen.
- Bestandsnaam - varchar2 -> Het wordt gebruikt om de naam van de afbeelding op te slaan.
- StoreFile - CLOB -> Het wordt gebruikt om het bestand in de tabel op te slaan.
CLOB-gegevenstype wordt gebruikt om het tekentype van binaire gegevens op te slaan in de databasetabel
#twee) Verbinding en instructie zijn gemaakt en de uitvoeringsmethode aangeroepen om de CREATE Query uit te voeren.
# 3) Vervolgens hebben we de invoegquery gemaakt en deze uitgevoerd met PreparedStatement.
PreparedStatement-syntaxis:
# 4) Gebruik setString () - stel de naam van de bestandsnaam in.
# 5) Om het bestand in te stellen / op te slaan, gebruikt u de FileReader-klasse om het bestand met de vullocatie door te geven.
Syntaxis:
Vervolgens kunnen we met de methode setClob () het bestand instellen in het object PreparedStatement. Daarna de execute-methode van PreparedStatement genoemd. Dat zal de gegeven gegevens in de tabel invoegen.
Na het uitvoeren van de invoegquery, met behulp van het ResultSet-object, halen we de gegevens op uit de tabel (met behulp van een selectiequery).
Selecteer zoekopdracht:
# 6) Met behulp van de getString-methode kunnen we de waarde van de FileName Column krijgen.
# 7) Om het bestand te krijgen, we hebben de onderstaande stappen gevolgd:
- Maak een Clob-object en wijs de retourwaarden toe van de getClob-methode van het ResultSet-object.
- Syntaxis daarvoor is: Clob clob1 = rs.getClob ();
- Maak een Reader-object en verkrijg de waarde van het Clob-object als Character.
- Maak een FileWriter-object en geef het volledige pad door om het bestand in dat pad op te slaan. Roep de methode write () van het FileWrite-object aan - waarmee de gegevens in het bestand op de locatie worden geschreven.
- Daarna is het programma met succes uitgevoerd.
# 8) Ga naar de locatie van het uitvoerbestand en controleer of de invoer- en uitvoerbestanden hetzelfde zijn.
Punten om te onthouden:
- ACID Properties legt Transaction Management in Database uit.
- Commit (), rollback () en savepoint zijn de belangrijkste bewerkingen in transactiebeheer.
- Commit maakt de wijzigingen permanent in DB, Rollback maakt de wijzigingen ongedaan tot de laatste commit of het genoemde savepoint en Savepoint helpt om een checkpoint te creëren.
- Database onderhoudt SQL-gegevenstypen en Java onderhoudt Java-gegevenstypen. JDBC-stuurprogramma wordt gebruikt om deze conversie af te handelen.
- Het JDBC-stuurprogramma heeft zelf een aantal SQL-type ID's, dus de programmeur hoeft zich geen zorgen te maken over gegevenstypen.
Veel Gestelde Vragen
V # 1) Wat is het JDBC-gegevenstype?
Antwoord: Java heeft zijn gegevenstypen en de database heeft zijn gegevenstypen. JDBC-stuurprogramma converteert het Java-gegevenstype naar het juiste SQL-gegevenstype dat door de database wordt geaccepteerd. ResultSet-objecten bieden ook setXXX () - methoden en getXXX () - methoden die beschikbaar zijn voor de juiste gegevenstypen.
Vraag 2) Wat is het gegevenstype voor de datum in Java?
Antwoord: De datum in Java is niet alleen een gegevenstype, maar ook een klasse. Een datum in Java heeft de datum, de tijd, het jaar, de naam van de dag, de dag van de week en de tijdzone. De datumklasse heeft de juiste methoden om de relevante gegevens op te halen.
V # 3) Wat is het verschil tussen java.util.Date en java.sql.Date?
Antwoord: Het belangrijkste verschil is java.util.Date heeft ook informatie over datum en tijd. Maar java.sql.Date heeft alleen de informatie over de datum. Dit is het belangrijkste verschil dat we java.util.Date niet rechtstreeks kunnen toewijzen aan java.sql.Date.
Vraag 4) Hebben we een klasse in Java die het TIME- en TIMESTAMP-type voor SQL vertegenwoordigt?
Antwoord: Ja, we hebben een klasse voor TIME en TIMESTAMP-type voor SQL. java.sql.Time klasse vertegenwoordigt TIJD-gerelateerde informatie. java.sql.timestamp-klasse vertegenwoordigt TIMESTAMP-gerelateerde informatie.
V # 5) Hoe start ik een transactie in JDBC?
Antwoord: De JDBC-verbinding begint met de modus voor automatisch vastleggen ingeschakeld, waarbij elke SQL-instructie wordt beschouwd als een transactie. Er is geen specifiek proces om een transactie in JDBC te starten. Wanneer u een verbinding maakt en de SQL-instructie begint uit te voeren, is daar de transactie gestart.
V # 6) Wat is de methode commit () in Java?
Antwoord: De methode Commit () in Java wordt gebruikt om de wijzigingen op te slaan die zijn gemaakt sinds de laatste commit (). De methode Commit () is beschikbaar in de verbindingsinterface. Met behulp van een verbindingsobject kunnen we de commit () aanroepen.
V # 7) Wat is de rollback-methode in Java?
Antwoord: Als er na de laatste commit () problemen zijn opgetreden, kunnen we de methode rollback () aanroepen om alle aangebrachte wijzigingen ongedaan te maken totdat de laatste methode commit.rollback () beschikbaar is in de interface van Connection. Met behulp van een verbindingsobject kunnen we de methode rollback () aanroepen.
Gevolgtrekking
Hier hebben we de gegevenstypen in Java en DB behandeld en hoe het JDBC-stuurprogramma ermee omgaat. We hebben ACID-eigenschappen besproken. Dat is het belangrijkste voor de banksector. Het zal erg nuttig zijn voor je carrière. In de sectie Transactiebeheer hebben we methoden voor vastleggen en terugdraaien besproken, zoals commit (), rollback (), setAutoCommit (), setSavepoint () en releaseSavepoint ().
Aanbevolen literatuur
- Java JDBC-zelfstudie: wat is JDBC (Java Database Connectivity)
- Zelfstudie voor Java JDBC-verbinding met programmeervoorbeeld
- JDBC DriverManager, JDBC PreparedStatement en Statement
- JDBC ResultSet: hoe u Java ResultSet gebruikt om gegevens op te halen
- Java-gegevenstypes, loops, arrays, switch en beweringen
- Java String length () Methode met voorbeelden
- Hoe de Java toString-methode te gebruiken?
- Selenium-databasetests (met behulp van WebDriver en JDBC API)