JDBC Java Data Base Connectivity 1 Introductie n
JDBC Java Data. Base Connectivity 1
Introductie n JDBC: platform onafhankelijke toegang tot relationele databanken via SQL n De JDBC API maakt een connectie naar een datasource mogelijk, zendt queries en update statements en verwerkt resultaten n JDBC is gebouwd op ODBC 2
JDBC implementatie 3
Driver types 4
Driver types 1 JDBC-ODBC bridge en ODBC driver: De Java Software bridge product voorziet in JDBC toegang via ODBC drivers. De ODBC binaire code, en meestal de database client code, moet op elke client geladen worden. Deze architectuur is best geschikt voor bedrijven waar de client installatie onder controle is. 2 Native-API partly-Java driver: Deze driver converteert JDBC calls in calls voor de API van Oracle, Sybase, Informix, IBM DB 2, . . Opmerking, de operating systeem-specifieke binaire code moet geladen worden op elke client. 3 JDBC-Net pure Java driver: Deze driver converteert JDBC calls in een DBMS-onafhankelijk net protocol, die dan door de server wordt geconverteerd in het DBMS protocol. Pure Java clients kunnen zo connecteren op verschillende databases. Het protocol is afhankelijk van de leverancier. Algemeen is dit het meest flexibele alternatief voor JDBC. Meestal zijn de producten geschikt voor intranets. 4 Native-protocol pure Java driver: Deze driver converteert JDBC calls direct in een netwerk protocol dat gebruikt wordt door de DBMS-en. De client communiceert rechtstreeks met de DBMS, geschikt voor het intranet. De meeste van deze protocollen zijn proprietary, de database leveranciers leveren hun eigen drivers. De volgende zijn momenteel verkrijgbaar: Oracle, Sybase, Informix, IBM DB 2, Inprise Inter. Base, and Microsoft SQL Server. 5
Basisstappen: De 4 basisstappen: n Registeren van een databasedriver n Connectie met een databank maken n Creatie van een Statement object n Uitvoeren van een query, een update, … 6
Registreren van databasedriver n n De databasedriver registreren kan door het manueel laden van de klasse met Class. for. Name(“drivernaam”); Bij gebruik van de JDBC-ODBC Bridge driver, wordt dit: Class. for. Name("sun. jdbc. odbc. Jdbc. Odbc. Driver"); 7
Connectie met databank maken n Een Connection object beheert de sessie met de server Connection con = Driver. Manager. get. Connection(url, "my. Login", "my. Password"); Voorbeeld: String url = "jdbc: odbc: film"; String user = “gebruiker 1”; String pwd = “pwd 1”; Connection con = Driver. Manager. get. Connection(url, user, pwd); 8
De connectie n De JDBC URL is de URL voor de databank n De algemene vorm is <protocol>: <sub-naam> n Het <protocol> staat eerst en is steeds jdbc n Het <sub-protocol> is naam van de driver of de naam van het databank connectiviteit mechanisme. Een voorbeeld van een subprotocol is odbc. n De sub-naam verwijst naar de ODBC-DSN. De sub-naam film is een lokale ODBC-DSN. 9
Data Source Name n Deze Data. Source name wordt aangemaakt in Windows 2000 via Control Panel -> Administrative Tools -> Data Sources (ODBC). In Windows XP via configuratiescherm -> prestaties en onderhoud -> systeembeheer -> gegevensbronnen (ODBC): selecteer Microsoft Access Driver, geef de locatie & naam van de databank (via knop selecteren), vb films. mdb en vul een naam (voor dit voorbeeld films) in bij naam van de gegevensbron. Onder deze naam zal de ODBCdriver-koppeling bereikbaar zijn vanuit de JAVA code. n Je kan de ODBC registratie automatisch laten gebeuren door bij de URL een extra parameter door te geven: “jdbc: odbc: MS Access-database; DBQ=film” 10
De connectie n n n String user n De database logon ID String pwd n De database logon wachtwoord De connectie is een open connectie die je kan gebruiken om JDBC statements te maken die SQL opdrachten doorsturen naar de DBMS 11
De Driver. Manager n Driver. Manager beheert de JDBC drivers n Drivers registreren zichzelf bij de Driver. Manager als de driver wordt geladen n Wanneer een connectie aanvraag gebeurt, dan test de Driver. Manager elke gekende driver om de verbinding op te bouwen. De eerste die reageert maakt de verbinding. n Alle methoden van de klasse Driver. Manager zijn static n De constructor van de klasse Driver. Manager is private! 12
Voorbeeld: Driver. Manager import java. sql. *; public class App 1 { public static void main (String args[]) { Connection con=null; String dsn =“film"; String user=""; String pwd=""; System. out. println("starting"); try { Class. for. Name("sun. jdbc. odbc. Jdbc. Odbc. Driver"); con = Driver. Manager. get. Connection("jdbc: odbc: "+dsn, user, pwd ); } catch(Class. Not. Found. Exception cnfe) { System. out. println("jdbc-odbc driver bridge not found”); } catch(SQLException sqle) { System. out. println("connection refused to ODBC DSN”); } } } 13
Verzenden van SQL-statements n Eens de connectie is opgebouwd, kunnen commando's naar de databank worden verzonden. n Het Connection object beschikt over 3 methoden om SQL- statements te verzenden: n create. Statement creëert een Statement object voor het n n verzenden van statische SQL-statements prepare. Statement creëert een Prepared. Statement object. De Prepared. Statement interface wordt gebruikt om precompiled statements uit te voeren. De interface heeft methoden om de IN parameters in te vullen. prepare. Call creëert een Callable. Statement object. De Callable. Statement interface wordt gebruikt om stored procedures uit te voeren. De interface heeft bovendien methoden om de OUT en INOUT parameters in te vullen 14
Het Statement object n n n Dient om een statisch SQL-statement te verzenden Een Statement object wordt gecreëerd door het uitvoeren van de methode create. Statement() van een Connection object De argumenten van connection. create. Statement(): public Statement create. Statement(int result. Set. Type, int result. Set. Concurrency) throws SQLException n n result. Set. Type n TYPE_FORWARD_ONLY: cursor kan enkel voorwaarts bewegen n TYPE_SCROLL_INSENSITIVE: cursor kan in beide richtingen bewegen. Wijzigingen in de database worden pas merkbaar nadat de query opnieuw wordt geactiveerd. n TYPE_SCROLL_SENSITIVE: cursor kan in beide richtingen bewegen. Wijzigingen in de database worden direct merkbaar. result. Set. Concurrency n CONCUR_READ_ONLY: de result. Set kan de database niet wijzigen n CONCUR_UPDATABLE: de result. Set kan de database wijzigen 15
Het Statement object n De belangrijkste methoden zijn n n execute. Query() execute. Update() 16
Het Statement object Result. Set execute. Query( String SQL-query) nthrows SQLException n. Alleen select statements ! nreturnt een Result. Set object 17
Het Statement object int execute. Update( String SQL-query) n throws SQLException n Alleen insert, update, delete of DDL statements ! n. DDL = create table, drop table, alter table, . . . n returnt het aantal gewijzigde rijen, bij DDL statements is het aantal gewijzigde rijen steeds 0 18
Het Statement object Result. Set. Meta. Data get. Meta. Data() n throws SQLException 19
Voorbeeld: execute. Query() try { if(con != null) { Statement s = con. create. Statement(); Result. Set rs = s. execute. Query(“select * from films”); //zie verderbij voorbeeld resultset } } catch(SQLException sqle) { sqle. print. Stack. Trace(); } 20
De Result. Set n Een Result. Set object bevat de rijen en kolomen die voldoen aan het select statement. n De data in een Result. Set is toegankelijk rij per rij. n De cursor in de Result. Set geeft de huidige rij aan. De cursor wordt verplaatst met de next() methode. n De standaard cursor beweegt alleen voorwaarts. Dit kan gewijzigd worden door een ander soort Result. Set in te stellen. Het standaard type is Result. Set. TYPE_FORWARD_ONLY 21
De Result. Set n De cursor staat bij een nieuw Result. Set object vóór de eerste rij. n De kolomen zijn toegankelijk met de methode get. Object() of met de specifieke methoden get. Int(), get. Float(), get. Double(), get. String(), . . Al deze methoden bestaan in 2 varianten: n get. Type( int kolomnummer ) kolom 0 bestaat niet ! n get. Type ( String kolomnaam ) n Een Result. Set die gecreëerd is door een de parameterloze versie van create. Statement() is niet aanpasbaar en kan slechts in 1 richting worden doorlopen. 22
Voorbeeld: Result. Set while ( rs. next() ) { System. out. println(rs. get. String(1)+ ” “+rs. get. String(2)); } Op deze wijze kunnen we door alle records lopen 23
Result. Set. Meta. Data n Deze klasse bevat kolomnamen, datatypes, . . . van de Result. Set (metadata=gegevens over de gegevens) n Gebruik Result. Set. get. Meta. Data() om het Result. Set. Meta. Data object te creëren. n Enkele methoden: n get. Column. Name( int kolom ) n get. Column. Count() n get. Column. Class. Name(int kolom ) returnt de naam van de meest geschikte java klasse om de data in op te vragen. 24
Voorbeeld: Result. Meta. Data. Set Result. Set. Meta. Data rsmd = rs. get. Meta. Data(); String. Buffer resultaat = new String. Buffer("<HTML>n<BODY>n<TABLE BORDER=10>n"); int col. Count = rsmd. get. Column. Count(); //start vanaf 1 !!!!! resultaat. append("<TR>"); for(int i=1; i<=col. Count; i++) { resultaat. append("<TH>"+rsmd. get. Column. Name(i)+"</TH>"); } resultaat. append("</TR>n"); while (rs. next()) { resultaat. append("<tr>"); for(int i=1; i<=col. Count; i++) resultaat. append("<td>"+rs. get. String(i)+"</td>"); resultaat. append("</tr>"); voor gebruik binnen HTML } worden al de hier gebruikte resultaat. append("</TABLE>n</BODY>n</HTML>n"); types ingelezen als String sql. View. Pane. set. Text(resultaat. to. String()); JEditor. Pane content. Type = text/html 25
Lezen uit de Result. Set 26
Exception handling n n De code moet in een try catch blok staan. Mogelijke exceptions zijn: n SQLException n Bij interactie met de databank n Class. Not. Found. Exception n Als de driver niet gevonden wordt In een finally blok geven we de resources vrij die eveneens weer een SQLException kunnen gooien: s. close(); c. close(); 27
Voorbeeld: execute. Update() Statement s = con. create. Statement(); int row. Count = s. execute. Update("update films set jaar = ‘ 2010’"); switch(row. Count) { case 0: JOption. Pane. show. Message. Dialog(this, "There are no rows affected"); break; case 1: JOption. Pane. show. Message. Dialog(this, "There's one row affected"); break; default : JOption. Pane. show. Message. Dialog(this, "There are "+row. Count+" rows affected"); break; } 28
Voorbeeld: Display. Authors n n n We raadplegen de databank books We vragen de tabel authors op We tonen de gegevens in een JText. Area 29
De databank books author. ISBN 1 8 author. ID 1 titles isbn author. ID 8 first. Name title isbn edition. Number last. Name copyright 8 publishers 1 publisher. ID image. File publisher. Name price Fig. 23. 11 Table relationships in books. 30
1 2 3 4 5 6 7 8 9 10 n 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Fig. 23. 26: Display. Authors. java // Displaying the contents of the authors table. import java. awt. *; java. sql. *; java. util. *; javax. swing. *; Importeer de package java. sql, die klassen en interfaces bevat voor de JDBC API. public class Display. Authors extends JFrame { // JDBC driver name and database URL static final String JDBC_DRIVER = "sun. jdbc. odbc. Jdbc. Odbc. Driver"; static final String DATABASE_URL = "jdbc: odbc: books"; // declare Connection and Statement for accessing // and querying database private Connection connection; private Statement statement; // constructor connects to database, queries database, processes // results and displays results in window public Display. Authors() { super( "Authors Table of Books Database" ); 31
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 try { // connect to database books and query database // load database driver class Class. for. Name( JDBC_DRIVER ); Laad de klasse definitie voor de databank driver. // establish connection to database connection = Driver. Manager. get. Connection( DATABASE_URL, ””); // create Statement for querying database statement = connection. create. Statement(); Roept de methode create. Statement aan om een object te // query database krijgen dat de interface Statement implementeert. Result. Set result. Set = statement. execute. Query( "SELECT * FROM authors" ); Voert de query uit om alle gegevens uit de tabel authors op te halen // process query results String. Buffer results = new String. Buffer(); Result. Set. Meta. Data meta. Data = result. Set. get. Meta. Data(); int number. Of. Columns = meta. Data. get. Column. Count(); get. Meta. Data() haalt de metadata op van de Result. Set De methode get. Column. Count levert het aantal kolommen van de Result. Set 32 af
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 for ( int i = 1; i <= number. Of. Columns; i++ ) results. append( meta. Data. get. Column. Name( i ) + "t" ); Voeg de namen van de kolommen toe aan String. Buffer results. append( "n" ); while ( result. Set. next() ) { for ( int i = 1; i <= number. Of. Columns; i++ ) results. append( result. Set. get. Object( i ) + "t" ); results. append( "n" ); } Voeg de gegevens van elke rij uit de Result. Set toe aan de String. Buffer results. // set up GUI and display window JText. Area text. Area = new JText. Area( results. to. String() ); Container container = get. Content. Pane(); container. add( new JScroll. Pane( text. Area ) ); set. Size( 300, 100 ); set. Visible( true ); } // end try // set window size // display window Creeer de GUI die de String. Buffer results toont, stel de grootte van het applicatie window en toon het applicatie window. 33
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 // detect problems interacting with the database catch ( SQLException sql. Exception ) { JOption. Pane. show. Message. Dialog( null, sql. Exception. get. Message(), "Database Error", JOption. Pane. ERROR_MESSAGE ); System. exit( 1 ); } // detect problems loading database driver catch ( Class. Not. Found. Exception class. Not. Found ) { JOption. Pane. show. Message. Dialog( null, class. Not. Found. get. Message(), "Driver Not Found", JOption. Pane. ERROR_MESSAGE ); System. exit( 1 ); } // ensure statement and connection are closed properly finally { try { statement. close(); connection. close(); } Sluit het Statement en de databank Connection. 34
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 // handle exceptions closing statement and connection catch ( SQLException sql. Exception ) { JOption. Pane. show. Message. Dialog( null, sql. Exception. get. Message(), "Database Error", JOption. Pane. ERROR_MESSAGE ); System. exit( 1 ); } } } // end Display. Authors constructor // launch the application public static void main( String args[] ) { Display. Authors window = new Display. Authors(); window. set. Default. Close. Operation( JFrame. EXIT_ON_CLOSE ); } } // end class Display. Authors 35
Prepare. Statement n n n De query wordt op de server gecompileerd en alleen de parameters moeten telkens worden ingevuld Prepare. Statement() is aanzienlijk sneller dan het klassieke Statement() Wordt gecreërd door prepare. Statement( query ) n n n query is een string die een of meerdere parameters bevat in de query-string worden de parameters voorgesteld door een vraagteken die parameters worden ingevuld m. b. v. de methoden set. XXX(), zie tabel van get. XXX() methoden 36
Voorbeeld: Prepare. Statement int film. Nummer = 12; prepared. Statement ps = con. prepare. Statement( select * from films where filmnr = ? ); ps. set. Int(1 , film. Nummer ); Parameter 1 Parameterindex rs = ps. execute. Query(); . . . . ps. set. Int( 1 , 13 ); rs = ps. execute. Query(); 37
Callable. Statement n n Hierdoor worden stored procedures uitgevoerd De query wordt op de server gecompileerd en alleen de parameters moeten ingevuld worden Callable. Statement() is aanzienlijk sneller dan het klassieke Statement() Wordt gecreërd door prepare. Call( query ) n n n query is een string die een of meerdere parameters bevat in de query-string worden de parameters voorgesteld door een vraagteken de parameters worden ingevuld m. b. v. de methoden set. XXX(), zie tabel van get. XXX() methoden 38
Callable. Statement n De query string bevat volgt de volgende syntax “{call <naam_van_procedure>([? [, ? ]])}” n Een voorbeeld “{call zoek. Film(? , ? )}” Het eerste vraagteken zou het jaar van de film kunnen zijn en het tweede vraagteken de naam van de regisseur van de film De parameters worden ingevuld, genummerd vanaf één tot het aanwezige aantal vraagtekens. Nadien kan de query worden uitgevoerd. 39
Transactions n n n Het Connection object beheert de transaction Default staat dit in auto-commit-mode Deze mode kan gewijzigd worden met de methode set. Auto. Commit(boolean) n n Het begin van de transactie wordt door het Connection object vastgesteld De transactie beëindigen, gebeurt met behulp van de methode commit() of rollback() 40
Transacties Wanneer auto. Commit op true staat, worden alle statements onmiddellijk bevestigd. Wanneer een stored procedure wordt uitgevoerd, wordt elk statement op zich binnen de stored procedure bevestigd. Wanneer het laatste statement van een groep misloopt, is de database corrupt! Wanneer auto. Commit op false staat, wordt automatisch een transactie gestart bij elk statement behalve commit() of rollback(). Wanneer de commit() mislukt, treedt een SQLException op, waarbij in het catch blok de rollback() plaats vindt. 41
Transactions n De Connection interface heeft een methode om de mate van beveiliging van transacties in te stellen. Connection. set. Transaction. Isolation(level) n Volgende levels worden ondersteund, sommige DBMS-en kennen er nog andere. n n TRANSACTION_READ_UNCOMMITTED Dit niveau laat toe dat een rij wordt gewijzigd door de ene transactie, vervolgens wordt gelezen door een andere transactie zonder dat de eerste transactie is bevestigd. Dit noemt men een “dirty read”. Als de eerste transactie een rollback uitvoert heeft de tweede transactie foute data gelezen. TRANSACTION_READ_COMMITTED “Ditry reads” worden voorkomen. TRANSACTION_REPEATABLE_READ “Dirty reads” en “non-repeatable reads” worden voorkomen. Een “non-repeatable read” treedt op als tussen twee leesoperaties van een transaction de rij wordt gewijzigd en bevestigd door een tweede transactie TRANSACTION_SERIALIZABLE “Dirty reads”, “non-repeatable reads” en “phantom reads” worden voorkomen. Een “phantom read” treedt op als twee identieke selecties na elkaar een ander resultaat 42 opleveren.
Transactions, dirty read n n Transaction 1 begin transaction update…. Transaction 2 n hhh n n rollback begin transaction select …. Data is nu foutief Een dirty read treedt op wanneer data gelezen wordt tussen wijziging en een commit 43
Transactions, non-repeatable reads n n Transaction 1 begin transaction select…. Transaction 2 n hhh n n select…. Ander resultaat ! n begin transaction update …. commit Een non-repeatable read treedt op wanneer twee dezelfde leesopdrachten een verschillende waarde opleveren 44
Transactions, phantom reads n n Transaction 1 begin transaction select…. where Transaction 2 n hhh n update…. where Ander resultaat ! n n begin transaction update …. commit Een phantom read treedt op wanneer twee dezelfde leesopdrachten een verschillende dataset opleveren 45
Voorbeeld n Gebruik van JTable en Table. Model: n n De gebruiker kan een Query intypen en activeren. Het resultaat wordt getoond met behulp van een JTable. 46
47
import java. sql. *; import java. util. *; import javax. swing. table. *; Javax. swing. Abstract Table. Model voorziet een default implementatie voor de methoden van de interface Table. Model // opgelet Result. Set rijen en kolommen worden vanaf 1 geindexeerd // opgelet JTable rijen en kolommen worden vanaf 0 geindexeerd public class Result. Set. Table. Model extends Abstract. Table. Model { private Connection connection; private Statement statement; private Result. Set result. Set; private Result. Set. Meta. Data meta. Data; private int number. Of. Rows; private boolean connected. To. Database = false; 48
public Result. Set. Table. Model( String driver, String url, String query ) throws SQLException, Class. Not. Found. Exception { // maak verbinding en initialiseer result. Set, meta. Data en aantal rows (methode set. Query) Class. for. Name( driver ); connection = Driver. Manager. get. Connection( url ); statement = connection. create. Statement( Result. Set. TYPE_SCROLL_INSENSITIVE, Result. Set. CONCUR_READ_ONLY ); connected. To. Database = true; set. Query( query ); } 49
// levert een Class object die het kolomtype voorstelt public Class get. Column. Class( int column ) throws Illegal. State. Exception { if ( !connected. To. Database ) throw new Illegal. State. Exception( "Not Connected to Database" ); try // bepaal Java class van de kolom { String class. Name = meta. Data. get. Column. Class. Name( column + 1 ); return Class. for. Name( class. Name ); } catch ( Exception exception ) { exception. print. Stack. Trace(); } // bij problemen, veronderstel type Object return Object. class; } 50
// levert het aantal kolommen in de Result. Set public int get. Column. Count() throws Illegal. State. Exception { if ( !connected. To. Database ) throw new Illegal. State. Exception( "Not Connected to Database" ); try { return meta. Data. get. Column. Count(); } catch ( SQLException sql. Exception ) { sql. Exception. print. Stack. Trace(); } // bij problemen, veronderstel 0 kolommen return 0; } 51
// levert de naam van een bepaalde kolom in de Result. Set public String get. Column. Name( int column ) throws Illegal. State. Exception { if ( !connected. To. Database ) throw new Illegal. State. Exception( "Not Connected to Database" ); try { return meta. Data. get. Column. Name( column + 1 ); } catch ( SQLException sql. Exception ) { sql. Exception. print. Stack. Trace(); } // bij problemen, veronderstel lege string als kolomnaam return ""; } 52
// levert het aantal rijen in de Result. Set public int get. Row. Count() throws Illegal. State. Exception { if ( !connected. To. Database ) throw new Illegal. State. Exception( "Not Connected to Database" ); return number. Of. Rows; } // levert de waarde van een bepaalde cel (rij, kolom) uit de Result. Set public Object get. Value. At( int row, int column ) throws Illegal. State. Exception { if ( !connected. To. Database ) throw new Illegal. State. Exception( "Not Connected to Database" ); try { result. Set. absolute( row + 1 ); return result. Set. get. Object( column + 1 ); } catch ( SQLException sql. Exception ) { sql. Exception. print. Stack. Trace(); } // bij problemen, veronderstel lege string als value return ""; } 53
// set nieuwe database query string en activeer public void set. Query( String query ) throws SQLException, Illegal. State. Exception { if ( !connected. To. Database ) throw new Illegal. State. Exception( "Not Connected to Database" ); result. Set = statement. execute. Query( query ); meta. Data = result. Set. get. Meta. Data(); result. Set. last(); // zet cursor op laatste rij number. Of. Rows = result. Set. get. Row(); // get rij nummer fire. Table. Structure. Changed(); // notify JTable dat het model is gewijzigd ! } public void disconnect. From. Database() { try { statement. close(); connection. close(); } catch ( SQLException sql. Exception ) { sql. Exception. print. Stack. Trace(); } finally { connected. To. Database = false; } } } 54
import java. awt. *; import java. awt. event. *; import java. sql. *; import java. util. *; import javax. swing. table. *; public class Display. Query. Results extends JFrame { static final String JDBC_DRIVER = " sun. jdbc. odbc. Jdbc. Odbc. Driver"; static final String DATABASE_URL = "jdbc: odbc: books"; static final String DEFAULT_QUERY = "SELECT * FROM authors"; private Result. Set. Table. Model table. Model; private JText. Area query. Area; 55
public Display. Query. Results() { super( "Displaying Query Results" ); try // create Result. Set. Table. Model and display database table { Class. for. Name(JDBC_DRIVER); table. Model = new Result. Set. Table. Model( JDBC_DRIVER, DATABASE_URL, DEFAULT_QUERY ); query. Area = new JText. Area( DEFAULT_QUERY, 3, 100 ); query. Area. set. Wrap. Style. Word( true ); query. Area. set. Line. Wrap( true ); JScroll. Pane scroll. Pane = new JScroll. Pane( query. Area, Scroll. Pane. Constants. VERTICAL_SCROLLBAR_AS_NEEDED, Scroll. Pane. Constants. HORIZONTAL_SCROLLBAR_NEVER ); JButton submit. Button = new JButton( "Submit Query" ); Box box = Box. create. Horizontal. Box(); box. add( scroll. Pane ); box. add( submit. Button ); JTable result. Table = new JTable( table. Model ); Container c = get. Content. Pane(); 56
submit. Button. add. Action. Listener( new Action. Listener() { public void action. Performed( Action. Event event ) // geef de query door aan het table model { try { table. Model. set. Query( query. Area. get. Text() ); } catch ( SQLException e ) { JOption. Pane. show. Message. Dialog( null, e. get. Message(), "Database error", JOption. Pane. ERROR_MESSAGE ); // try to recover from invalid user query by executing default query try { table. Model. set. Query(DEFAULT_QUERY ); query. Area. set. Text(DEFAULT_QUERY ); } catch ( SQLException e ) { JOption. Pane. show. Message. Dialog(null, e. get. Message(), "Database error", JOption. Pane. ERROR_MESSAGE); table. Model. disconnect. From. Database(); System. exit( 1 ); } } 57
set. Size( 500, 250 ); set. Visible( true ); } catch ( Class. Not. Found. Exception class. Not. Found ) { JOption. Pane. show. Message. Dialog( null, "Cloudscape driver not found", "Driver not found", JOption. Pane. ERROR_MESSAGE ); System. exit( 1 ); } catch ( SQLException sql. Exception ) { JOption. Pane. show. Message. Dialog( null, sql. Exception. get. Message(), "Database error", JOption. Pane. ERROR_MESSAGE ); table. Model. disconnect. From. Database(); System. exit( 1 ); } set. Default. Close. Operation( DISPOSE_ON_CLOSE ); // default is HIDE_ON_CLOSE add. Window. Listener( new Window. Adapter() { public void window. Closed( Window. Event event ) { table. Model. disconnect. From. Database(); System. exit( 0 ); } } ); } public static void main( String args[] ) { new Display. Query. Results(); 58 }
- Slides: 58