Download - embedded SQL en JDBC

Transcript
Page 1: embedded SQL en JDBC

programma‟s verbinden

met gegevensbanken

Katrien Verbert

[email protected]

Page 2: embedded SQL en JDBC

inhoud

• benaderingen voor gegevensbankprogrammeren

• ingebedde SQL

• JDBC

2

Page 3: embedded SQL en JDBC

gebruik van SQL

• Interactief

– opdracht wordt aangeboden en onmiddellijk uitgevoerd

• Ingebed gebruik

– SQL wordt gebruikt in een programma

3

Page 4: embedded SQL en JDBC

programmeren met gegevensbanken

gebruikers applicaties gegevensbanken

SQL C/C++, Java, PHP, Perl...

4

Page 5: embedded SQL en JDBC

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: embedded SQL en JDBC

SQL/Host Language Interface

Function call SQL

Library

host program

SQL stmt

DBMS

Fetch rows from the cursor

Table While(…){

} Impedance mismatch problem

[Kazuhiro Minami]

Page 7: embedded SQL en JDBC

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: embedded SQL en JDBC

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: embedded SQL en JDBC

INGEBEDDE SQL

Page 10: embedded SQL en JDBC

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: embedded SQL en JDBC

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 < connection name > AUTHORIZATION < user account name and password > ;

DISCONNECT < connection name > ;

SET CONNECT < connection name > ;

11

Page 12: embedded SQL en JDBC

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: embedded SQL en JDBC

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: embedded SQL en JDBC

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: embedded SQL en JDBC

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: embedded SQL en JDBC

communicatie tussen programma en DBMS

• met de communicatie-variabelen

• SQLCODE (oudste)

– integer variabele

– waarde na uitvoering van een SQL opdracht :

• = 0 met succes uitgevoerd

• > 0 speciale toestand,

bv 100 : geen records beschikbaar in query resultaat

• < 0 een fout is opgetreden

• SQLSTATE (in latere versies van standaard toegevoegd)

– string van 5 tekens

– waarde na uitvoering van SQL opdracht:

• “00000” geen fout of uitzonderingstoestand

• “02000” geen gegevens meer

• …

16

Page 17: embedded SQL en JDBC

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

17

Page 18: embedded SQL en JDBC

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 19: embedded SQL en JDBC

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)

19

Page 20: embedded SQL en JDBC

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 21: embedded SQL en JDBC

JDBC

Page 22: embedded SQL en JDBC

JDBC

• Call function interface voor toegang vanuit Java

• SQL statements worden dynamisch aangemaakt en

doorgegeven als string

• Gebruikt API voor toegang tot DBMS

22

Page 23: embedded SQL en JDBC

twee aanpakken

Host language

+

Embedded SQL

Preprocessor

Host language

+

Function calls

Host-language compiler

Object-code

program SQL library

JDBC

Page 24: embedded SQL en JDBC

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

24

Page 25: embedded SQL en JDBC

Copyright © 1997 Alex Chaffee

JDBC architectuur

Application JDBC Driver

• Java code roept JDBC library aan

• JDBC laadt een driver

• Driver spreekt met een gegevensbank

25

Page 26: embedded SQL en JDBC

JDBC Driver

• PostgreSQL: http://jdbc.postgresql.org/

• Oracle: http://bit.ly/ho1MbC

26

Page 27: embedded SQL en JDBC

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,…

27

Page 28: embedded SQL en JDBC

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 29: embedded SQL en JDBC

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

29

Page 30: embedded SQL en JDBC
Page 31: embedded SQL en JDBC

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());

31

Page 32: embedded SQL en JDBC

2. laad en registreer de driver

• alternatief:

– gebruik de generieke Java functie om een klasse te laden

Vb:

Class.forName(“oracle.jdbc.driver.OracleDriver”);

32

Page 33: embedded SQL en JDBC
Page 34: embedded SQL en JDBC

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 35: embedded SQL en JDBC

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: embedded SQL en JDBC

• URL

– jdbc:postgresql:database

– jdbc:postgresql://host/database

– jdbc:postgresql://host:port/database

• Voorbeeld:

Connection con = DriverManager.getConnection

("jdbc:postgresql:employee", "postgres", ”pwd");

3. maak een connectie met de gegevensbank

36

Page 37: embedded SQL en JDBC
Page 38: embedded SQL en JDBC

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: embedded SQL en JDBC

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();

39

Page 40: embedded SQL en JDBC

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.

40

Page 41: embedded SQL en JDBC

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();

41

Page 42: embedded SQL en JDBC

1, 2: attribuutposities,

als alternatrief voor de attribuutnamen

binding van 1-ste parameter met ssn

Page 43: embedded SQL en JDBC

JDBC gebruik

8. sluit de opdracht en de connectie

• (ook resultset(s) moeten worden afgesloten)

stmt.close();

con.close ();

43

Page 44: embedded SQL en JDBC

JDBC: overzicht van acties

DriverManager

Connection

Statement

ResultSet

getConnection

createStatement

execute

44

Page 45: embedded SQL en JDBC

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()

45

Page 46: embedded SQL en JDBC

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();

46

Page 47: embedded SQL en JDBC

Verschillende types opdrachten

• verschillende types

– java.sql.Statement

– java.sql.PreparedStatement

– java.sql.CallableStatement

Page 48: embedded SQL en JDBC

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: embedded SQL en JDBC

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: embedded SQL en JDBC

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: embedded SQL en JDBC

java.sql.CallableStatement

– voert “stored procedures” uit

• IN en OUT parameters

– v.b. Connection con = …;

CallableStatement cstmt

con.prepareCall(“Execute getInventory(?,?)”);

• veronderstel eerste parameter OUT van type int

veronderstel tweede parameter IN van type String

51

Page 52: embedded SQL en JDBC

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)

};

52

Page 53: embedded SQL en JDBC

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 54: embedded SQL en JDBC

VRAGEN?