Download - JDBC en embedded SQL
![Page 1: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/1.jpg)
programma’s verbinden met gegevensbanken Katrien Verbert [email protected]
![Page 2: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/2.jpg)
inhoud
• benaderingen voor gegevensbankprogrammeren • ingebedde SQL • JDBC
2
![Page 3: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/3.jpg)
gebruik van SQL
• Interactief – opdracht wordt aangeboden en onmiddellijk uitgevoerd
• Ingebed gebruik – SQL wordt gebruikt in een programma
3
![Page 4: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/4.jpg)
programmeren met gegevensbanken
gebruikers applicaties gegevensbanken
SQL C/C++, Java, PHP, Perl...
4
![Page 5: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/5.jpg)
benaderingen
1. inbedden SQL opdrachten in een programma • SQL opdrachten worden door een precompiler opgezocht • en omgevormd tot functie-aanroepen van de programmeertaal
2. gebruik van een bibliotheek met functies • die toegang verschaffen tot de gegevensbank • en resultaten beschikbaar stellen aan een programma in een API
3. een (nieuwe) programmeertaal ontwikkelen • die compatibel is met het gegevensmodel en query taal • vb: PL/SQL van Oracle
![Page 6: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/6.jpg)
SQL/Host Language Interface
Func6on call SQL Library
host program
SQL stmt
DBMS
Fetch rows from the cursor
Table
Cursor While(…){ }
Impedance mismatch problem
[Kazuhiro Minami]
![Page 7: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/7.jpg)
Impedance mismatch • verschillen tussen gegevensmodel en model van de programmeertaal
– CHAR, VARCHAR -- String – INTEGER -- int
• bindings voor verschillende programmeertalen
– definieert overeenkomsten van de attribuuttypes met de types in de programmeertaal – bindt resultaat van query (=verzameling van tuples) aan datastructuur van het
programma
7
![Page 8: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/8.jpg)
typische interactie client/server model • het client programma opent een verbinding met de gegevensbankserver
– vereist meestal adres van machine met de server, – en login-naam en paswoord voor gegevensbank
• Interactie tussen het programma en de gegevensbank: – programma biedt queries, updates,… aan – server levert resultaten van de queries,…
• Programma sluit de verbinding met de gegevensbank
8
![Page 9: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/9.jpg)
INGEBEDDE SQL
![Page 10: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/10.jpg)
ingebedde SQL • SQL opdracht kan in een programma ingebed worden • een pre-compiler verwerkt de SQL opdrachten vóór de compilatie van
het programma: – SQL opdrachten worden vervangen door opdrachten (declaraties en
functie-aanroepen) in de programmeertaal • syntaxis verschilt wat naargelang van de programmeertaal
EXEC SQL < embedded SQL statement > END-‐EXEC
EXEC SQL < embedded SQL statement > ;
# SQL { < embedded SQL statement > } ; 10
![Page 11: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/11.jpg)
ingebedde SQL – Connecteren met de gegevensbank:
• slechts één connectie kan actief zijn; • wijzigen van de actieve connectie:
– Verbinding beëindigen:
CONNECT TO < server name > AS < connec6on name > AUTHORIZATION < user account name and password > ;
DISCONNECT < connec6on name > ;
SET CONNECT < connec6on name > ;
11
![Page 12: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/12.jpg)
Ingebed gebruik van SQL
• gemeenschappelijke variabelen – SQL opdrachten kunnen verwijzingen naar variabelen uit het
programma bevatten – dubbele punt (:) als prefix
• de gemeenschappelijke variabelen moeten gedeclareerd worden in een SQL declaratie sectie
12
![Page 13: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/13.jpg)
ingebedde SQL • Eén tupel ophalen uit een gegevensbank
• Voorbeelden: – 1. Declaratie van variabelen (in C):
EXEC SQL BEGIN DECLARE SECTION; varchar dname[16], fname[16], lname[16], char ssn[10], bdate[11], sex[2], minit[2]; float salary, raise; int dno, dnumer; int SQLCODE ; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION;
![Page 14: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/14.jpg)
ingebedde SQL: voorbeeld
– Herhaal een aantal maal: lees het ssn van een werknemer en schrijf (op de uitvoer) gegevens van die werknemer
loop = 1; while (loop) { prompt(“Enter a social security number: “, ssn); EXEC SQL select Fname, Minit, Lname, Address, Salary into :fname, :minit, :lname, :address, :salary from EMPLOYEE where SSN = :ssn; if (SQLCODE == 0) printf(fname, minit, lname, address, salary) else printf(“social sec. numb. does not exist: “, ssn); prompt(“More s.s.numbers (enter 1 for Yes, 0 for No): “, loop) ; }
![Page 15: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/15.jpg)
twee aanpakken
Host language + Embedded SQL
Preprocessor
Host language + Function calls
Host-‐language compiler
Object-code program
SQL library
CLI (Call-level interface)
![Page 16: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/16.jpg)
SQLJ • SQL commando’s ingebed in Java
– SQLJ vertaler zet SQL commando’s om in Java, – commando’s worden uitgevoerd d.m.v. de JDBC interface – JDBC driver moet dus geïnstalleerd worden
• vereist: – importeren van verscheidene klassen
• JDBC en IO klassen • extra klassen
– connecteren met de gewenste gegevensbank • getConnection
16
![Page 17: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/17.jpg)
SQLJ – importeren van de nodige klassen (vb. met Oracle)
– connectie maken
import java.sql.*; import java.io.*; import sqlj.runtime.*; import sqlj.runtime.ref.*; import oracle.sqlj.runtime.*; …
DefaultContext cntxt = oracle.getConnection(“<url name>”,
“<user name>”, “<pasword>”, true); DefaultContext.setDefaultContext(cntxt); …
![Page 18: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/18.jpg)
SQLJ
– Voorbeeld 1: • lees het ssn van een werknemer en schrijf (op de uitvoer) gegevens van
die werknemer
ssn = readEntry(“Enter a social security number: “); try { #sql{select Fname, Minit, Lname, Address, Salary into :fname, :minit, :lname, :address, :salary from EMPLOYEE where Ssn = :ssn}; } catch (SQLException se) { System.out.println(“s.s.number does not exist: “+ ssn); return ; } System.out.println(fname + “ “ + minit + “ “ + lname + “ “
+ “ “ + salary)
18
![Page 19: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/19.jpg)
dname = readEntry(“Enter the department name: “); try { #sql{select Dnumber into :dnumber from DEPARTMENT where Dname = :dname}; } catch (SQLException se) { System.out.println(“department does not exist:“ + dname); return; } System.out.println(“ information for department: “ + dname); #sql iterator Emp(String ssn, String fname, String minit, String lname, double salary); Emp e = null; #sql e = {select ssn, fname, minit, lname, salary from EMPLOYEE where Dno = :dnumber}; while (e.next()) { System,out.println(e.ssn + “ “ “ e.fname + “ “ +
e.minit + “ “ + e.lname + “ “ + e.salary); } ; e.close();
![Page 20: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/20.jpg)
JDBC
![Page 21: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/21.jpg)
JDBC
• Call function interface voor toegang vanuit Java • SQL statements worden dynamisch aangemaakt en
doorgegeven als string • Gebruikt API voor toegang tot DBMS
21
![Page 22: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/22.jpg)
twee aanpakken
Host language + Embedded SQL
Preprocessor
Host language + Function calls
Host-‐language compiler
Object-code program
SQL library
JDBC
![Page 23: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/23.jpg)
JDBC • gestandaardiseerde API (Application Programming Interface)
– geregistreerde naam door Sun Microsystems – Zou niet staan voor ‘Java DataBase Connectivity’
• JDBC driver = een implementatie van de functie-aanroepen die gespecificeerd zijn in de JDBC API
• DBMS leveranciers bieden JDBC drivers aan zodat het mogelijk wordt om gegevensbanken vanuit een Java programma aan te spreken
23
![Page 24: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/24.jpg)
Copyright © 1997 Alex Chaffee
JDBC architectuur
Applica6on JDBC Driver
• Java code roept JDBC library aan • JDBC laadt een driver • Driver spreekt met een gegevensbank
24
![Page 25: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/25.jpg)
JDBC Driver
• PostgreSQL: http://jdbc.postgresql.org/ • Oracle: zie Toledo
25
![Page 26: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/26.jpg)
DriverManager klasse
• een programma kan connecteren met verschillende gegevensbanken
• de klasse DriverManager houdt bij welke drivers geïnstalleerd zijn
• enkele (statische) methodes van DriverManager zijn: – getDriver, registerDriver, deregisterDriver,…
26
![Page 27: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/27.jpg)
stappen in JDBC gebruik
1. importeer het java.sql pakket 2. laad en registreer de driver 3. zorg voor passende variabelen in Java 4. maak een connectie met de gegevensbank 5. creëer een opdracht 6. voer de opdracht uit 7. haal het resultaat (of de resultaten) op 8. sluit de opdracht en de connectie
![Page 28: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/28.jpg)
1. importeer het java.sql pakket
of
import java.sql.*;
import java.sql.Connection; import java.sql.SQLException; import java.sql.DriverManager; import java.sql.Driver; import java.sql.Statement; import java.sql.ResultSet; …
of
28
![Page 29: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/29.jpg)
![Page 30: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/30.jpg)
2. laad en registreer de driver
• dit gebeurt d.m.v. de klasse DriverManager • laden van een specifieke driver gebeurt door de
statische methode registerDriver() op te roepen
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
DriverManager.registerDriver (new org.postgresql.Driver());
30
![Page 31: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/31.jpg)
2. laad en registreer de driver
• alternatief: – gebruik de generieke Java functie om een klasse te laden
Vb: Class.forName(“oracle.jdbc.driver.OracleDriver”);
31
![Page 32: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/32.jpg)
![Page 33: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/33.jpg)
JDBC gebruik
3. zorg voor de passende variabelen in Java
public class Department { private String dname; private String dnumber; private String mgrssn; private String mgrstartdate; public Department(String dname, String dnumber, String mgrssn, String mgrstartdate) { setDname(dname); setDnumber(dnumber); setMgrssn(mgrssn); setMgrstartdate(mgrstartdate); } public String getDname() { return dname; } }
![Page 34: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/34.jpg)
![Page 35: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/35.jpg)
3. maak een connectie met de gegevensbank
• gebruik de statische methode getConnection() uit de klasse DriverManager om een connection object te maken
• twee schrijfwijzen – drie door komma’s gescheiden argumenten – een string als argument
Connection con = DriverManager.getConnection (url,”userName”,”password”);
35
![Page 36: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/36.jpg)
• URL – jdbc:postgresql:database – jdbc:postgresql://host/database – jdbc:postgresql://host:port/database
• Voorbeeld:
Connection con = DriverManager.getConnection ("jdbc:postgresql:employee", "postgres", ”pwd");
4. maak een connectie met de gegevensbank
36
![Page 37: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/37.jpg)
![Page 38: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/38.jpg)
5. creëer een opdracht • Statement object
Statement stmt = con.createStatement();
vb: een tabel Department maken: Statement stmt = con.createStatement(); String creeer= “CREATE TABLE Department (“ + “ Dname Varchar(15) Not Null,”+ “ Dnumber Integer Not Null,”+ “ MgrSsn Char(9),”+ “ MgrStartDate DATE,”+ “ PRIMARY KEY (Dnumber),”+ “ UNIQUE (Dname)”+ “)”;
38
![Page 39: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/39.jpg)
? : parameter,
![Page 40: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/40.jpg)
7. voer de opdracht uit
• executeQuery • executeUpdate
try{ stmt.executeUpdate ("INSERT INTO DEPARTMENT VALUES (" +quotes(d.getDname())+", "+d.getDnumber()+", " +quotes(d.getMgrssn())+", " +getDate(d.getMgrstartdate())+") "); stmt.executeUpdate("COMMIT"); } catch(SQLException sqle){ stmt.executeUpdate("ROLLBACK"); throw new FailureNoticeException(sqle.getMessage()); } stmt.close();
40
![Page 41: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/41.jpg)
Opdrachten
• ResultSet executeQuery(String sql_query) – Voert de query sql_query uit en geeft een ResultSet object
dat het resultaat van de query bevat.
• int executeUpdate(String sql_query) – Voert de query sql_query uit en geeft als resultaat het aantal
rijen dat werd toegevoegd/verwijderd/gewijzigd.
41
![Page 42: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/42.jpg)
7. haal het resultaat (of de resultaten) op
• het resultaat wordt teruggegeven in een object van het type ResultSet
ResultSet rs = stmt.executeQuery ("SELECT dname, dnumber, mgrssn, mgrstartdate " + " FROM Department" + " WHERE dnumber = " + number ); if (!rs.next()) throw new FailureNoticeException ("Geen departement voldoet aan het zoekcriterium."); Department d = new Department(rs.getString("dname"), rs.getString("dnumber"), rs.getString("mgrssn"), rs.getString("mgrstartdate")); rs.close();
42
![Page 43: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/43.jpg)
1, 2: attribuutposities, als alternatrief voor de attribuutnamen
binding van 1-ste parameter met ssn
![Page 44: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/44.jpg)
JDBC gebruik
8. sluit de opdracht en de connectie
• (ook resultset(s) moeten worden afgesloten)
stmt.close(); con.close ();
44
![Page 45: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/45.jpg)
JDBC: overzicht van acties
DriverManager
Connec6on
Statement
ResultSet
getConnection
createStatement
execute
45
![Page 46: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/46.jpg)
Gebruik van ResultSets • navigatie in een ResultSet
• next() • previous() • first() • last() • …
• gegevens ophalen • getRow() • getString(int row) • getString(String attribuutnaam) • getLong(int row) • getDate(int row) • … • wasNull()
• andere operaties • close()
46
![Page 47: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/47.jpg)
metadata – data die de structuur en de eigenschappen van de gegevens beschrijven – java.sql.ResultSetMetaData
• construct by calling getMetaData() of a ResultSet object • getColumnCount()
getColumnName(int i) getColumnSize(int i) getColumnType(int i) ...
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2"); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount();
47
![Page 48: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/48.jpg)
java.sql.Statement
• meest gebruikt type opdracht – v.b. Connection con = …;
Statement stmt = con.createStatement();
• hoe worden SQL statements uitgevoerd? – de gebruiker voert een SQL opdracht in – het gevensbanksysteem ontleedt de opdracht – het gegevensbanksysteem controleert de syntaxis – het gegevensbanksysteem compileert de opdracht – het gegevensbanksysteem voert de opdracht uit
48
![Page 49: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/49.jpg)
java.sql.PreparedStatement – gebruikt voor de uitvoering van dynamische SQL opdrachten
• IN parameters
Res PreparedStatement p = con.prepareStatement( "SELECT dname, dnumber, mgrssn, mgrstartdate " + " FROM Department" + " WHERE dnumber = ?" ); p.clearParameters(); p.setInt(1, 1); ResultSet rs=p.executeQuery();
49
![Page 50: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/50.jpg)
java.sql.PreparedStatement – hoe worden SQL statements uitgevoerd?
• de gebruiker voert een SQL opdracht in • het gevensbanksysteem ontleedt de opdracht • het gegevensbanksysteem controleert de syntaxis • het gegevensbanksysteem compileert de opdracht • het gegevensbanksysteem voert de opdracht uit
– enkele de laatste stap moet herhaald worden voor “prepared statements”
• opdracht wordt opnieuw gebruikt met andere waarde voor de parameter – voorbeeld Connection con = …;
String query = “select * from department where id=?”; PreparedStatement pstmt = con.prepareStatement(query);
50
![Page 51: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/51.jpg)
JDBC versus SQLJ
JDBC stmt = conn.prepareStatement( "INSERT INTO DSN8710.EMP " + "(EMPNO, FIRSTNME, MIDINIT,
LASTNAME, HIREDATE, SALARY) " + "VALUES (?, ?, ?, ?, CURRENT DATE, ?)"); stmt.setString(1, empno); stmt.setString(2, firstname); stmt.setString(3, midinit); stmt.setString(4, lastname); stmt.setBigDecimal(5, salary); stmt.executeUpdate(); stmt.close();
SQLJ
#sql [ctx] { INSERT INTO DSN8710.EMP (EMPNO, FIRSTNME, MIDINIT,
LASTNAME, HIREDATE, SALARY) VALUES (:empno, :firstname, :midinit, :lastname,
CURRENT DATE, :salary) };
51
![Page 52: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/52.jpg)
SQLJ versus JDBC
SQLJSQLJ JDBCJDBC
SQL statementsSQL statements static dynamic
Strong typingStrong typing yes no
CheckingChecking static runtime only
SyntaxSyntax concise API
StandardStandard ANSI Sun
PortablePortable yes yes
Object supportObject support yes* yes*
Source: www.cs.manchester.ac.uk/~horrocks/cs2312/Lectures/PPT/jdbc.ppt
![Page 53: JDBC en embedded SQL](https://reader036.vdocuments.pub/reader036/viewer/2022081716/54bc2dd64a79593b688b45c2/html5/thumbnails/53.jpg)
VRAGEN?