jdbc exception handling how handle sql exceptions
hvordan lage java åpne jar-filer
Denne opplæringsveiledningen for JDBC-unntak forklarer måter å håndtere SQL-unntak ved hjelp av programmeringseksempler:
I JDBC Transaction Management opplæring av JDBC opplæringsserie , vi lærte JDBC-transaksjonstyper, datatyper, transaksjonsadministrasjonsmetoder og hvordan du bruker dem i Java-programmer.
I denne veiledningen vil vi lære om unntak i JDBC og hvordan du håndterer dem. I JDBC, hvis unntaket skjedde på grunn av databasetilkobling eller noe relatert til DB, vil det komme under SQLException. Her vil vi se mer informasjon om SQLExceptions.
La oss gjøre oss klare til å lære om unntak i JDBC.
Hva du vil lære:
JDBC Unntakshåndtering
Unntak oppstår når det er en feil eller advarsel i gjennomføringen av programmet. Når et unntak oppstår, vil den normale strømmen av programmet bli forstyrret, og programmet vil bli avsluttet unormalt. Det gode med unntaket er at vi kan håndtere det ved å bruke en prøvefangst-blokkering eller kaster nøkkelord. Alle unntak og feil er underklassene i klassen Throwable. Kastbar klasse er basisklassen for alle unntak og feil.
Java Exception Handling Keywords
Det er fem nøkkelord i Java Exception Handling. De er som følger:
- Prøve: Programuttalelser som kan heve unntaket, bør holdes innenfor en prøveblokk.
- Å fange: Hvis det oppstår unntak i prøveblokken, blir den kastet. Vi kan fange det unntaket ved hjelp av Catch-blokken og håndtere det i koden.
- Kaste: Systemgenererte unntak kastes automatisk av JVM. For å kaste unntakene manuelt, bør vi bruke et nøkkelordkast.
- Kaster: Ethvert unntak som er kastet ut av en metode, bør spesifiseres av en kast-klausul.
- Endelig: Eventuelle programerklæringer som må utføres etter prøveblokken, bør oppbevares i den endelige blokken.
>> Klikk her for mer informasjon om unntak i Java.
SQLException
I JDBC kan vi få unntak når vi utfører eller oppretter spørringen. Unntak som oppstår på grunn av databasen eller driveren, er under SQL-unntak. Ved å bruke Unntakshåndtering kan vi håndtere SQL Unntak som vi håndterer det normale unntaket.
SQLException er tilgjengelig i java.sql-pakken. Det utvider Exception-klassen, noe som betyr at vi også kan bruke metodene som er tilgjengelige i Exception-klassen i SQLException-klassen.
Eksempel for SQL-unntak
Syntaksfeil i SQL-setningen kan føre til SQL-unntak. Når et slikt unntak oppstår, vil et objekt av SQLException-klassen bli sendt til fangstblokken. Ved å bruke informasjonen i SQLException-objektet, kan vi fange det unntaket og fortsette programmet.
SQLException-objektet har følgende metoder:
Metodenavn | Beskrivelse |
---|---|
getErrorCode () | Det returnerer feilnummeret |
getMessage () | Den returnerer feilmeldingen |
getSQLState () | Den returnerer SQLState til SQLException-objektet. Det kan også returnere null. For databasefeil vil den returnere XOPEN SQL State |
getNextException () | Det returnerer neste unntak i unntakskjeden. |
printStackTrace () | Det skriver ut det nåværende unntaket og dets tilbakespor til en standard feilstrøm |
setNextException (SQLEXception ex) | Den brukes til å legge til et annet SQL-unntak i kjeden |
Hvordan håndtere unntak
JDBC-relatert unntak kaster hovedsakelig SQLException, og det er et merket unntak, så vi må enten fange det eller kaste det. All forretningslogikk og forpliktelsesdata skal gjøres i en prøveblokk. Hvis noe unntak skjedde i blokken, bør vi fange og håndtere den i fangstblokken. Basert på unntakstypen, bør vi gjøre tilbakestillinger eller begå i Catch-blokken.
Kategorier av SQLException
Noen ganger kan JDBC-driveren kaste underklassen til SQLException som representerer en vanlig SQL-tilstand eller en vanlig feiltilstand som spesifikt ikke er assosiert med en bestemt SQL-statusklasseverdi. Det vil få deg til å håndtere unntaket på en mer spesifikk måte, og vi kan håndtere det i koden vår. Disse typer unntak kommer under underklassene til ett av følgende unntak:
- SQLNonTransientException: Denne typen unntak blir kastet når en forekomst der et nytt forsøk på den samme operasjonen mislykkes med mindre årsaken til SQLException har blitt rettet.
- SQLTransientException: Denne typen unntak blir kastet når en tidligere mislykket operasjon er i stand til å lykkes når vi prøvde operasjonen på nytt uten noen endring / inngripen.
- SQLRecoverableException: Denne typen unntak blir kastet når en tidligere mislykket operasjon kan lykkes når vi prøvde operasjonen på nytt med endringer / inngrep fra applikasjonen. Mens du gjør det, bør den nåværende forbindelsen lukkes og den nye forbindelsen skal åpnes.
Andre underklasser av SQLException:
Følgende er underklassene til SQLException:
- BatchUpdateException: Denne typen unntak blir kastet hvis det har oppstått feil under batchoppdateringsoperasjonen. I tillegg til informasjonen om SQLException, gir BatchUpdateException status for utsagnene som er utført / oppdatert før feilen har oppstått.
- SQLClientInfoException: Denne typen unntak blir kastet hvis en eller flere informasjonsegenskaper ikke kunne settes på en forbindelse. Foruten SQLException-informasjonen, viser SQLClientInfoException en liste over klientinformasjonsegenskaper som ikke ble angitt.
I denne opplæringen vil vi se normal SQLException, og så vil vi se BatchUpdateException. Du kan utøve de resterende underklassene til SQLException på systemet ditt.
I det følgende eksemplet vil vi utdype hvordan unntaket skal håndteres.
Alle programmene er skrevet i Java, i denne opplæringen. Vi har brukt Java 8-versjonen og Oracle DB.
>> Klikk her for å laste ned Oracle-programvaren
>> Klikk her for å laste ned Java versjon 8
Den har trinnvis Java-installasjonsprosess.
Unntak Eksempel Program
package com.STH.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Exception_Example { public static void main(String() args) throws ClassNotFoundException { // TODO Auto-generated method stub String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011'; //Update query to set the email id for the employee whose empNUM is 10011 Class.forName('oracle.jdbc.driver.OracleDriver'); try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); ResultSet rs1 =null; statemnt1 = conn.createStatement(); System.out.println('Executing Update query using executeUpdate method'); int return_rows = statemnt1.executeUpdate(update_query); System.out.println('No. of Affected Rows = '+ return_rows); } catch(SQLException sqe) { System.out.println('Error Code = ' + sqe.getErrorCode()); System.out.println('SQL state = ' + sqe.getSQLState()); System.out.println('Message = ' + sqe.getMessage()); System.out.println('printTrace /n'); sqe.printStackTrace(); } } }
Produksjon:
Forklaring:
#1) Opprettet ett valgt spørsmål som har kolonnenavnet som ikke er i tabellen EMPLOYEE_DETAILS.
Opprett spørring:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#to) Opprettet tilkobling, uttalelse og utført velg QUERY i prøveblokken.
# 3) I Catch-blokken håndterte vi unntaket.
# 4) Vi viser feilen i unntaket ved hjelp av getError () -metoden, SQLState av unntaket ved hjelp av getSQLState () -metoden, meldingen om unntaket ved hjelp av getMessage () -metoden, og skriver ut stakkespor av unntaket ved hjelp av printStackTrace-metoden.
Eksempel på BatchUpdateException
Vi har laget en ny tabell for å illustrere BatchUpdateException-eksemplet. Tabellens navn er ANSATT. Den har 3 kolonner.
De er:
- ID som er en primærnøkkel
- ETTERNAVN
- FORNAVN
Syntaks for å lage en tabell i ORACLE DB:
CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255) );
Java-program:
package com.STH.JDBC; import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Statement_ExecuteBatch_Example { public static void main(String() args) throws ClassNotFoundException, SQLException { //Inserting the following 3 rows in EMPLOYEE_DETAILS Table String insert_query1 = 'insert into employee values(101,'Patterson','Tony')'; String insert_query2 = 'insert into employee values(102,'Potter','Harry')'; String insert_query3 = 'insert into employee values(102,'Wong','Jane')'; Class.forName('oracle.jdbc.driver.OracleDriver'); //Opening Oracle DB Connection try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); //Adding the 3 insert queries into the Statement object using addBatch method statemnt1.addBatch(insert_query1); statemnt1.addBatch(insert_query2); statemnt1.addBatch(insert_query3); int No_of_Afffected_Rows()= statemnt1.executeBatch(); //After inserting the data System.out.println('No of rows affected = ' +No_of_Afffected_Rows.length); } //Catching the BatchUpdateException catch(BatchUpdateException be) { //getting the updated rows status before the exception has occurred int() updateCount = be.getUpdateCounts(); int count = 1; for (int i : updateCount) { //Using for loop, printing the statement which has been successfully executed if (i == Statement.EXECUTE_FAILED) { System.out.println('Error on Statement ' + count +': Execution failed'); } else { System.out.println('Statement ' + count +': is executed'); } count++; //Incrementing the count to display the next updated row no. } //System.out.println('Error on statemet '+be.getUpdateCounts()); be.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }
PRODUKSJON:
Forklaring:
Det vi har gjort i det ovennevnte programmet, er at vi har opprettet 3 INSERT-spørsmål og lagt det til i en batch og utført det. 3rdspørringen har samme ID-verdi på 1St.spørring siden ID-kolonnen er en primærnøkkel i EMPLOYEE-tabellen, har programmet kastet et BatchUpdateException.
- Opprettet de tre innføringsspørsmålene for å sette det inn i ANSATTE-tabellen. Den første og tredje spørringen har samme ID-verdi. ID-kolonnen er en primærnøkkel til EMPLOYEE-tabellen.
- Opprettet uttalelsesobjekt og la til disse 3 spørsmålene i det ved hjelp av addBatch () -metoden. Så kalt executeBatch () -metoden for å utføre den.
- Siden den første og tredje spørringen har samme ID-verdi. Når executeBatch () prøvde å utføre den tredje spørringen, vil den kaste BatchUpdateException.
- I fangstblokken BatchUpdateException kalte vi metoden getUpdateCounts () for å få status for den oppdaterte raden.
- Ved hjelp av for loop kontrollerer vi en etter en om statusen til den bestemte utsagnet blir utført mislykket eller ikke. Hvis den spesielle utsagnet ikke mislykkes, vil det skrive ut radnummeret til utsagnet.
- Etter det vil den skrive ut printStackTrace av BatchUpdateException.
- I eksemplet ovenfor, siden unntaket skjedde på grunn av den tredje utsagnet, er utsagnet 1 og 2 skrevet ut. Da er hele sporet av unntaket skrevet ut i utgangskonsollen.
Poeng å huske:
- Unntaket som skjedde på grunn av databasen vil komme under SQLException.
- Unntak i Java kan håndteres ved hjelp av prøveblokk.
- SQLException er det avmerkede unntaket, slik at vi kan håndtere det ved hjelp av try: catch block.
- Vi har noen underklasser av SQLException. De er SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException og SQLClientInfoException.
ofte stilte spørsmål
Q # 1) Hva er et SQL-unntak?
Svar: Et unntak skjedde på grunn av databasen er kjent som SQL Exception. Et unntak som gir informasjon om databaserelatert er også kjent som SQL Exception. Vi har en SQLException-klasse i Java, som brukes til å gi informasjon om unntaket. Den har følgende metoder:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
Q # 2) Hvordan håndterer jeg unntaket i SQL?
Svar: Skriv forretningslogikken i prøveblokken. Hvis det har oppstått feil eller unntak i den, kan du fange den i fangstblokken og skrive riktig melding for å finne unntaket enkelt.
Try – Catch block brukes til å håndtere unntaket.
Q # 3) Når SQLException kan forekomme i Java?
Svar: SQLException oppstår hvis det er en feil i databasetilgangen eller andre feil relatert til databasen. Når SQLException oppstår, vil et objekt av typen SQLException bli sendt til fangstklausulen. Vi kan takle det i fangstblokken.
Spørsmål nr. 4) Hva er Exception-kjeden i Java, og hva er bruken av den?
Svar: Et unntak som forårsaker et annet unntak er kjent som Exception Chain eller Chained Exception. I de fleste tilfeller må vi kjede unntaket slik at et unntak er relatert til et annet unntak, det vil gjøre loggene klare og enkle å spore. Det vil være nyttig for programmereren i feilsøkingsprosessen.
For eksempel:
Tenk på en metode som kaster et aritmetisk unntak på grunn av å dele med null. Den faktiske årsaken til unntaket er en I / O-feil, som gjør at skillelinjen er null. Metoden vil bare kaste et aritmetisk unntak til programmereren. Slik at den som ringer / programmerer ikke får vite om den faktiske årsaken til unntaket. I denne typen situasjoner kan vi bruke et lenket unntak.
Konklusjon
Unntak kan håndteres ved hjelp av en forsøksblokk eller ved å kaste den. Unntak som skjedde på grunn av databasen er kjent som SQLException. Vi har en egen klasse for SQLException, som er en underklasse av Unntak. Vi har metodene for å bli kjent med SQL-unntaket mer spesifikt.
Metodene er getMessage (), getErrorCode (), getSQLState (), getNextException og printStackTace. getNextException vil bli brukt i Exception Chained-saken.
Anbefalt lesing
- Java-unntak og unntakshåndtering med eksempler
- Topp 10 selen unntak og hvordan du håndterer disse (nøyaktig kode)
- Komplett guide til PL SQL Unntakshåndtering med eksempler
- C # Exception Handling Tutorial med kodeeksempler
- Unntakshåndtering i C ++
- Hvordan håndtere unntak i SoapUI Groovy Scripts - SoapUI Tutorial # 11
- PL SQL Tutorial for nybegynnere med eksempler Hva er PL / SQL
- PL SQL-pakke: Oracle PL / SQL-pakkeveiledning med eksempler