jdbc exception handling how handle sql exceptions
intervjufrågor om maven och jenkins
Denna handledning om JDBC-undantagshantering förklarar sätt att hantera SQL-undantag med hjälp av programmeringsexempel:
I JDBC Transaction Management handledning av JDBC-handledningsserie , vi lärde oss JDBC-transaktionstyper, datatyper, transaktionshanteringsmetoder och hur man använder dem i Java-program.
I den här handledningen lär vi oss undantag i JDBC och hur man hanterar dem. I JDBC, om undantaget inträffade på grund av databasanslutning eller något relaterat till DB, kommer det att falla under SQLException. Här ser vi mer information om SQLExceptions.
Låt oss bli redo att lära oss om undantag i JDBC.
Vad du kommer att lära dig:
JDBC Undantagshantering
Undantag inträffar när det finns ett fel eller en varning i genomförandet av programmet. När ett undantag inträffar störs det normala flödet av programmet och programmet avslutas onormalt. Det som är bra med undantaget är att vi kan hantera det med hjälp av ett try-catch-block eller kastar nyckelord. Alla undantag och fel är underklasserna i klass Throwable. Kastbar klass är basklassen för alla undantag och fel.
Java Exception Handling Keywords
Det finns fem nyckelord i Java Exception Handling. De är som följer:
- Prova: Programuttalanden som kan höja undantaget bör hållas inom ett försöksblock.
- Fånga: Om något undantag inträffar i försöksblocket kastas det. Vi kan fånga det undantaget med hjälp av Catch-blocket och hantera det i koden.
- Kasta: Systemgenererade undantag kastas automatiskt av JVM. För att manuellt kasta undantagen bör vi använda ett nyckelordskast.
- Kastar: Alla undantag som har kastats ut ur en metod bör specificeras av en kastklausul.
- Till sist: Alla programuttalanden som måste köras efter försöksblocket ska förvaras i det slutliga blocket.
>> Klicka här för mer information om undantag i Java.
SQLException
I JDBC kan vi få undantag när vi kör eller skapar frågan. Undantag som uppstår på grund av databasen eller drivrutinen omfattas av SQL-undantag. Med hjälp av Exception-hantering kan vi hantera SQL Exception som vi hanterar det normala undantaget.
SQLException finns i paketet java.sql. Det utvidgar Exception-klassen vilket innebär att vi också kan använda metoderna som finns i Exception-klassen i SQLException-klassen.
Exempel för SQL-undantag
Syntaxfel i SQL-satsen kan resultera i SQL-undantag. När ett sådant undantag inträffar kommer ett objekt av SQLException-klassen att skickas till fångsten. Genom att använda informationen i SQLException-objektet kan vi fånga det undantaget och fortsätta programmet.
SQLException-objektet har följande metoder:
Metodens namn | Beskrivning |
---|---|
getErrorCode () | Det returnerar felnumret |
getMessage () | Det returnerar felmeddelandet |
getSQLState () | Den returnerar SQLState för SQLException-objektet. Det kan också returnera null. För databasfel returnerar den XOPEN SQL State |
getNextException () | Det returnerar nästa undantag i undantagskedjan. |
printStackTrace () | Det skriver ut det aktuella undantaget och dess spårning till en standardfelström |
setNextException (SQLEXception ex) | Det används för att lägga till ytterligare ett SQL-undantag i kedjan |
Hur man hanterar undantag
JDBC-relaterat undantag kastar mestadels SQLException, och det är ett kontrollerat undantag så vi måste antingen fånga det eller kasta det. All affärslogik och åtagandedata ska göras i ett försöksblock, om något undantag inträffade i blocket skulle vi fånga och hantera det i fångstblocket. Baserat på undantagstypen bör vi göra återställningar eller begå i Catch-blocket.
Kategorier av SQLException
Ibland kan JDBC-drivrutinen kasta underklassen av SQLException som representerar ett gemensamt SQL-tillstånd eller ett vanligt feltillstånd som specifikt inte är associerat med ett visst SQL-tillståndsklassvärde. Det får dig att hantera undantaget på ett mer specifikt sätt, och vi kan hantera det i vår kod. Dessa typer av undantag faller under underklasserna i ett av följande undantag:
- SQLNonTransientException: Denna typ av undantag kastas när en instans där ett nytt försök av samma operation skulle misslyckas om inte orsaken till SQLException har rättats.
- SQLTransientException: Denna typ av undantag kastas när en tidigare misslyckad operation kan lyckas när vi försökte operationen igen utan någon förändring / ingripande.
- SQLRecoverableException: Denna typ av undantag kommer att kastas när en tidigare misslyckad operation kan lyckas när vi försökte operationen igen med någon ändring / ingripande av applikationen. Samtidigt bör den nuvarande anslutningen stängas och den nya anslutningen ska öppnas.
Andra underklasser av SQLException:
Följande är underklasserna till SQLException:
- BatchUpdateException: Denna typ av undantag kastas om något fel har inträffat när batchuppdateringen utförs. Förutom SQLException-informationen ger BatchUpdateException status för de uttalanden som har utförts / uppdaterats innan felet inträffade.
- SQLClientInfoException: Denna typ av undantag kastas om en eller flera informationsegenskaper inte kunde ställas in på en anslutning. Förutom SQLException-informationen innehåller SQLClientInfoException en lista över klientinformationsegenskaper som inte har ställts in.
I den här handledningen ser vi normal SQLException och sedan ser vi BatchUpdateException. Du kan utöva de återstående underklasserna av SQLException på ditt system.
I följande exempel kommer vi att utveckla hur man hanterar undantaget.
Alla program är skrivna i Java, i denna handledning. Vi har använt Java 8-versionen och Oracle DB.
>> Klicka här för att ladda ner Oracle-programvaran
>> Klicka här för att ladda ner Java version 8
Den har den stegvisa Java-installationsprocessen.
Undantagsexempelprogram
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(); } } }
Produktion:
Förklaring:
# 1) Skapade en markeringsfråga som har kolumnnamnet som inte finns i tabellen EMPLOYEE_DETAILS.
Skapa fråga:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#två) Skapade anslutning, uttalande och körde välj QUERY i försöksblocket.
# 3) I Catch-blocket hanterade vi undantaget.
# 4) Vi visar Fel i undantaget med getError () -metoden, SQLState i undantaget med getSQLState () -metoden, meddelandet om undantaget med getMessage () -metoden och skriver ut stapelspåret för undantaget med printStackTrace-metoden.
BatchUpdateException Exempel
Vi har skapat en ny tabell för att illustrera exemplet BatchUpdateException. Tabellens namn är ANSTÄLLDA. Den har tre kolumner.
Dom är:
- ID som är en primär nyckel
- EFTERNAMN
- FÖRNAMN
Syntax för att skapa 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(); } } }
PRODUKTION:
Förklaring:
Vad vi har gjort i ovanstående program är att vi har skapat 3 INSERT-frågor och lagt till det i en sats och kört det. 3rdfrågan har samma id-värde 1stfråga eftersom ID-kolumnen är en primär nyckel i tabellen EMPLOYEE, har programmet kastat en BatchUpdateException.
- Skapade de tre infogningsfrågorna för att infoga den i tabellen ANSTÄLLDA. Den första och tredje frågan har samma ID-värde. Id-kolumnen är en primär nyckel till tabellen EMPLOYEE.
- Skapade uttalandeobjekt och lade till dessa 3 frågor i det med metoden addBatch (). Då kallas executeBatch () -metoden för att utföra den.
- Eftersom den första och tredje frågan har samma ID-värde. När executeBatch () försökte utföra den tredje frågan kommer den att kasta BatchUpdateException.
- I BatchUpdateException-fångstblocket kallade vi metoden getUpdateCounts () för att få status för den uppdaterade raden.
- Med hjälp av for loop kontrollerar vi en efter en om statusen för det specifika uttalandet misslyckades eller inte. Om det specifika uttalandet inte misslyckas, kommer det att skriva ut radnumret för uttalandet.
- Därefter kommer den att skriva ut printStackTrace av BatchUpdateException.
- I ovanstående exempel har undantaget inträffat på grund av det tredje uttalandet, så uttalandet 1 och 2 har skrivits ut. Sedan har hela spåret av undantaget skrivits ut i utgångskonsolen.
Poäng att komma ihåg:
- Undantaget som inträffade på grund av databasen kommer att omfattas av SQLException.
- Undantag i Java kan hanteras med try: catch block.
- SQLException är det markerade undantaget så att vi kan hantera det med try: catch block.
- Vi har några underklasser av SQLException. De är SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException och SQLClientInfoException.
Vanliga frågor
F # 1) Vad är ett SQL-undantag?
Svar: Ett undantag inträffade på grund av databas kallas SQL Exception. Ett undantag som ger information om databasrelaterat kallas också SQL Exception. Vi har en SQLException-klass i Java, som används för att ge information om undantaget. Den har följande metoder:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
F # 2) Hur hanterar du undantaget i SQL?
Svar: Skriv affärslogiken i försöksblocket. Om något fel eller undantag har inträffat i det, fånga det i Catch-blocket och skriv lämpligt meddelande för att enkelt hitta undantaget.
Try – Catch block används för att hantera undantaget.
F # 3) När SQLException kan förekomma i Java?
Svar: SQLException uppstår om det finns ett fel i databasåtkomst eller andra fel relaterade till databasen. När SQLException inträffar kommer ett objekt av typen SQLException att skickas till fångstklausulen. Vi kan hantera det i Catch-blocket.
F # 4) Vad är Exception-kedjan i Java och vad är användningen av den?
Svar: Ett undantag som orsakar ett annat undantag är känt som Exception Chain eller Chained Exception. I de flesta fall måste vi kedja undantaget så att ett undantag relateras till ett annat undantag, det gör loggarna tydliga och enkla att spåra. Det kommer att vara till hjälp för programmeraren i felsökningen.
Till exempel:
Tänk på en metod som ger ett aritmetiskt undantag på grund av att dividera med noll. Den faktiska orsaken till undantaget är ett I / O-fel, vilket gör att delaren är noll. Metoden kommer bara att kasta ett aritmetiskt undantag för programmeraren. Så att den som ringer / programmerar inte kommer att få veta om den faktiska orsaken till undantaget. I denna typ av situation kan vi använda ett kedjat undantag.
Slutsats
Undantag kan hanteras med ett försök-fångstblock eller genom att kasta det. Undantag inträffade på grund av databasen kallas SQLException. Vi har en separat klass för SQLException som är en underklass av Undantag. Vi har metoderna för att lära känna SQL-undantaget mer specifikt.
Metoderna är getMessage (), getErrorCode (), getSQLState (), getNextException och printStackTace. getNextException kommer att användas i fallet Undantagskedjad.
Rekommenderad läsning
- Java-undantag och undantagshantering med exempel
- Topp 10 selenundantag och hur man hanterar dessa (exakt kod)
- Komplett guide till PL SQL-undantagshantering med exempel
- C # Exception Handling Tutorial med kodexempel
- Undantagshantering i C ++
- Hur man hanterar undantag i SoapUI Groovy Scripts - SoapUI-handledning # 11
- PL SQL-handledning för nybörjare med exempel | Vad är PL / SQL
- PL SQL-paket: Oracle PL / SQL-pakethandledning med exempel