SlideShare a Scribd company logo
programma‟s verbinden
met gegevensbanken


Katrien Verbert
katrien.verbert@cs.kuleuven.be
inhoud

• benaderingen voor gegevensbankprogrammeren
• ingebedde SQL
• JDBC




                                               2
gebruik van SQL


• Interactief
   – opdracht wordt aangeboden en onmiddellijk uitgevoerd



• Ingebed gebruik
   – SQL wordt gebruikt in een programma




                                                            3
programmeren met gegevensbanken


 gebruikers      applicaties          gegevensbanken




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

                                                  4
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
SQL/Host Language Interface




                  SQL stmt
 Function call                     SQL
                     Table         Library
 While(…){
                                                     DBMS
 }
                 Fetch rows             Impedance
host program     from the cursor        mismatch
                                        problem

                                               [Kazuhiro Minami]
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
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
INGEBEDDE SQL
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
ingebedde SQL
  – Connecteren met de gegevensbank:


   CONNECT TO < server name > AS < connection name >
   AUTHORIZATION < user account name and password > ;

     • slechts één connectie kan actief zijn;
     • wijzigen van de actieve connectie:


   SET CONNECT < connection name > ;

  – Verbinding beëindigen:


   DISCONNECT < connection name > ;                     11
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
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;
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) ;
   }
twee aanpakken

                  Host language
                        +
                  Embedded SQL


                  Preprocessor

                  Host language
CLI (Call-level         +
interface)        Function calls


                  Host-language
 SQL library                       Object-code
                  compiler
                                   program
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
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
SQLJ
  – importeren van de nodige klassen (vb. met Oracle)
import   java.sql.*;
import   java.io.*;
import   sqlj.runtime.*;
import   sqlj.runtime.ref.*;
import   oracle.sqlj.runtime.*;
…
  – connectie maken

DefaultContext cntxt =
   oracle.getConnection(“<url name>”,
     “<user name>”, “<pasword>”, true);
DefaultContext.setDefaultContext(cntxt);
…
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
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();
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
twee aanpakken

              Host language
                    +
              Embedded SQL


              Preprocessor

              Host language
      JDBC          +
              Function calls


              Host-language
SQL library                    Object-code
              compiler
                               program
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
JDBC architectuur

 Application    JDBC                     Driver


• Java code roept JDBC library aan
• JDBC laadt een driver
• Driver spreekt met een gegevensbank




                   Copyright © 1997 Alex Chaffee   25
JDBC Driver

• PostgreSQL: http://jdbc.postgresql.org/
• Oracle: http://bit.ly/ho1MbC




                                            26
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
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
1. importeer het java.sql pakket

     import java.sql.*;

     of
of

     import   java.sql.Connection;
     import   java.sql.SQLException;
     import   java.sql.DriverManager;
     import   java.sql.Driver;
     import   java.sql.Statement;
     import   java.sql.ResultSet;
     …
                                        29
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
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
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;
     }
}
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
3. maak een connectie met de gegevensbank

  •   URL
      –   jdbc:postgresql:database
      –   jdbc:postgresql://host/database
      –   jdbc:postgresql://host:port/database
  •   Voorbeeld:


   Connection con = DriverManager.getConnection
 ("jdbc:postgresql:employee", "postgres", ”pwd");




                                                    36
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
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
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
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
binding van 1-ste parameter met ssn


1, 2: attribuutposities,
als alternatrief voor de attribuutnamen
JDBC gebruik

8. sluit de opdracht en de connectie
      •   (ook resultset(s) moeten worden afgesloten)



stmt.close();
con.close ();




                                                        43
JDBC: overzicht van acties



   DriverManager

                Connection
getConnection

                             Statement
       createStatement

                                         ResultSet
                             execute




                                                     44
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
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
Verschillende types opdrachten

• verschillende types
   – java.sql.Statement
   – java.sql.PreparedStatement
   – java.sql.CallableStatement
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
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
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
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
JDBC versus SQLJ

JDBC                                          SQLJ
stmt = conn.prepareStatement(                 #sql [ctx] {
  "INSERT INTO DSN8710.EMP " +                  INSERT INTO DSN8710.EMP
  "(EMPNO, FIRSTNME, MIDINIT,                    (EMPNO, FIRSTNME, MIDINIT,
    LASTNAME, HIREDATE, SALARY) "                  LASTNAME, HIREDATE, SALARY)
 + "VALUES (?, ?, ?, ?, CURRENT DATE, ?)");     VALUES
stmt.setString(1, empno);                      (:empno, :firstname, :midinit, :lastname,
stmt.setString(2, firstname);                      CURRENT DATE, :salary)
stmt.setString(3, midinit);                   };
stmt.setString(4, lastname);
stmt.setBigDecimal(5, salary);
stmt.executeUpdate();
stmt.close();


                                                                                           52
SQLJ versus JDBC

                                SQLJ         JDBC
    SQL statements              static       dynamic

    Strong typing               yes          no

    Checking                    static       runtime only

    Syntax                      concise      API

    Standard                    ANSI         Sun

    Portable                    yes          yes

    Object support              yes*         yes*


    Source: www.cs.manchester.ac.uk/~horrocks/cs2312/Lectures/PPT/jdbc.ppt
VRAGEN?

More Related Content

PDF
SQL deel 2
PDF
SQL - deel 1
PDF
relationele algebra en relationele calculus
PDF
20130305 GB les 5
PDF
JDBC en embedded SQL
PDF
20130221 GB les 3
PDF
ROLE Xmas Project KULeuven
SQL deel 2
SQL - deel 1
relationele algebra en relationele calculus
20130305 GB les 5
JDBC en embedded SQL
20130221 GB les 3
ROLE Xmas Project KULeuven

Viewers also liked (6)

PDF
gebruik van quantoren in relationele calculus
PDF
Voorbeeld interne cursussen
PDF
Functionele afhankelijkheden en normalisatie
PDF
Solution manual the 8051 microcontroller based embedded systems
PDF
Solution manual 8051 microcontroller by mazidi
PDF
Question paper with solution the 8051 microcontroller based embedded systems...
gebruik van quantoren in relationele calculus
Voorbeeld interne cursussen
Functionele afhankelijkheden en normalisatie
Solution manual the 8051 microcontroller based embedded systems
Solution manual 8051 microcontroller by mazidi
Question paper with solution the 8051 microcontroller based embedded systems...
Ad

Similar to embedded SQL en JDBC (14)

PDF
20130308 GB les 6
KEY
Gegevensbanken: begrippen
KEY
Gegevensbanken En Gebruikers
PDF
Relationele databases 1st Edition N Van Vugt Hage J L C Arkenbout
PDF
Gegevensbanken en gebruikers
PPT
Eduvision - SQL webinar: SQL basis & gebruik
PDF
Geavanceerd objectgeoriënteerd programmeren Cursusdeel 1 1st Edition H J M Pa...
KEY
Cursus gegevensbanken
PDF
Gegevensbanken: de cursus
PPT
Sql developer 4 workshop
PPTX
Databanken
PDF
Adlib Sql tips & trucs'
PPT
Pres b3 hoofdstuk7
PDF
1 SQL inleiding.pdf regnieorgnetiognoirgneoignetiogneotignethiojetigojrtogijrtg
20130308 GB les 6
Gegevensbanken: begrippen
Gegevensbanken En Gebruikers
Relationele databases 1st Edition N Van Vugt Hage J L C Arkenbout
Gegevensbanken en gebruikers
Eduvision - SQL webinar: SQL basis & gebruik
Geavanceerd objectgeoriënteerd programmeren Cursusdeel 1 1st Edition H J M Pa...
Cursus gegevensbanken
Gegevensbanken: de cursus
Sql developer 4 workshop
Databanken
Adlib Sql tips & trucs'
Pres b3 hoofdstuk7
1 SQL inleiding.pdf regnieorgnetiognoirgneoignetiogneotignethiojetigojrtogijrtg
Ad

More from Katrien Verbert (20)

PDF
Explainability methods
PDF
Human-centered AI: how can we support end-users to interact with AI?
PPTX
Human-centered AI: how can we support end-users to interact with AI?
PDF
Human-centered AI: how can we support lay users to understand AI?
PDF
Explaining job recommendations: a human-centred perspective
POTX
Explaining recommendations: design implications and lessons learned
PDF
Designing Learning Analytics Dashboards: Lessons Learned
PDF
Human-centered AI: towards the next generation of interactive and adaptive ex...
PPTX
Explainable AI for non-expert users
PPTX
Towards the next generation of interactive and adaptive explanation methods
PDF
Personalized food recommendations: combining recommendation, visualization an...
PDF
Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...
PDF
Learning analytics for feedback at scale
PDF
Interactive recommender systems and dashboards for learning
PPTX
Interactive recommender systems: opening up the “black box”
PDF
Interactive Recommender Systems
PDF
Web Information Systems Lecture 2: HTML
PDF
Information Visualisation: perception and principles
PDF
Web Information Systems Lecture 1: Introduction
PDF
Information Visualisation: Introduction
Explainability methods
Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support lay users to understand AI?
Explaining job recommendations: a human-centred perspective
Explaining recommendations: design implications and lessons learned
Designing Learning Analytics Dashboards: Lessons Learned
Human-centered AI: towards the next generation of interactive and adaptive ex...
Explainable AI for non-expert users
Towards the next generation of interactive and adaptive explanation methods
Personalized food recommendations: combining recommendation, visualization an...
Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...
Learning analytics for feedback at scale
Interactive recommender systems and dashboards for learning
Interactive recommender systems: opening up the “black box”
Interactive Recommender Systems
Web Information Systems Lecture 2: HTML
Information Visualisation: perception and principles
Web Information Systems Lecture 1: Introduction
Information Visualisation: Introduction

embedded SQL en JDBC

  • 1. programma‟s verbinden met gegevensbanken Katrien Verbert katrien.verbert@cs.kuleuven.be
  • 2. inhoud • benaderingen voor gegevensbankprogrammeren • ingebedde SQL • JDBC 2
  • 3. gebruik van SQL • Interactief – opdracht wordt aangeboden en onmiddellijk uitgevoerd • Ingebed gebruik – SQL wordt gebruikt in een programma 3
  • 4. programmeren met gegevensbanken gebruikers applicaties gegevensbanken C/C++, Java, PHP, Perl... SQL 4
  • 5. 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
  • 6. SQL/Host Language Interface SQL stmt Function call SQL Table Library While(…){ DBMS } Fetch rows Impedance host program from the cursor mismatch problem [Kazuhiro Minami]
  • 7. 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
  • 8. 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
  • 10. 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
  • 11. ingebedde SQL – Connecteren met de gegevensbank: CONNECT TO < server name > AS < connection name > AUTHORIZATION < user account name and password > ; • slechts één connectie kan actief zijn; • wijzigen van de actieve connectie: SET CONNECT < connection name > ; – Verbinding beëindigen: DISCONNECT < connection name > ; 11
  • 12. 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
  • 13. 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;
  • 14. 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) ; }
  • 15. twee aanpakken Host language + Embedded SQL Preprocessor Host language CLI (Call-level + interface) Function calls Host-language SQL library Object-code compiler program
  • 16. 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
  • 17. 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
  • 18. SQLJ – importeren van de nodige klassen (vb. met Oracle) import java.sql.*; import java.io.*; import sqlj.runtime.*; import sqlj.runtime.ref.*; import oracle.sqlj.runtime.*; … – connectie maken DefaultContext cntxt = oracle.getConnection(“<url name>”, “<user name>”, “<pasword>”, true); DefaultContext.setDefaultContext(cntxt); …
  • 19. 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
  • 20. 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();
  • 21. JDBC
  • 22. JDBC • Call function interface voor toegang vanuit Java • SQL statements worden dynamisch aangemaakt en doorgegeven als string • Gebruikt API voor toegang tot DBMS 22
  • 23. twee aanpakken Host language + Embedded SQL Preprocessor Host language JDBC + Function calls Host-language SQL library Object-code compiler program
  • 24. 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
  • 25. JDBC architectuur Application JDBC Driver • Java code roept JDBC library aan • JDBC laadt een driver • Driver spreekt met een gegevensbank Copyright © 1997 Alex Chaffee 25
  • 26. JDBC Driver • PostgreSQL: http://jdbc.postgresql.org/ • Oracle: http://bit.ly/ho1MbC 26
  • 27. 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
  • 28. 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
  • 29. 1. importeer het java.sql pakket import java.sql.*; of of import java.sql.Connection; import java.sql.SQLException; import java.sql.DriverManager; import java.sql.Driver; import java.sql.Statement; import java.sql.ResultSet; … 29
  • 31. 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
  • 32. 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
  • 34. 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; } }
  • 35. 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
  • 36. 3. maak een connectie met de gegevensbank • URL – jdbc:postgresql:database – jdbc:postgresql://host/database – jdbc:postgresql://host:port/database • Voorbeeld: Connection con = DriverManager.getConnection ("jdbc:postgresql:employee", "postgres", ”pwd"); 36
  • 38. 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
  • 39. 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
  • 40. 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
  • 41. 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
  • 42. binding van 1-ste parameter met ssn 1, 2: attribuutposities, als alternatrief voor de attribuutnamen
  • 43. JDBC gebruik 8. sluit de opdracht en de connectie • (ook resultset(s) moeten worden afgesloten) stmt.close(); con.close (); 43
  • 44. JDBC: overzicht van acties DriverManager Connection getConnection Statement createStatement ResultSet execute 44
  • 45. 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
  • 46. 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
  • 47. Verschillende types opdrachten • verschillende types – java.sql.Statement – java.sql.PreparedStatement – java.sql.CallableStatement
  • 48. 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
  • 49. 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
  • 50. 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
  • 51. 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
  • 52. JDBC versus SQLJ JDBC SQLJ stmt = conn.prepareStatement( #sql [ctx] { "INSERT INTO DSN8710.EMP " + INSERT INTO DSN8710.EMP "(EMPNO, FIRSTNME, MIDINIT, (EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) " LASTNAME, HIREDATE, SALARY) + "VALUES (?, ?, ?, ?, CURRENT DATE, ?)"); VALUES stmt.setString(1, empno); (:empno, :firstname, :midinit, :lastname, stmt.setString(2, firstname); CURRENT DATE, :salary) stmt.setString(3, midinit); }; stmt.setString(4, lastname); stmt.setBigDecimal(5, salary); stmt.executeUpdate(); stmt.close(); 52
  • 53. SQLJ versus JDBC SQLJ JDBC SQL statements static dynamic Strong typing yes no Checking static runtime only Syntax concise API Standard ANSI Sun Portable yes yes Object support yes* yes* Source: www.cs.manchester.ac.uk/~horrocks/cs2312/Lectures/PPT/jdbc.ppt

Editor's Notes

  • #28: Copyright © 1997 Alex Chaffee
  • #46: Query geeft resultset rs terug Stelt een tweedimensionale rij voor of een table met tuples als rijen en attributen als kolommen Gelijkaardig aan een iterator in sqlj Wanneer een query uitgevoerd is, verwijst rs naar het tuple voor het eerste tuple van het resultaat r.Next wordt volgende tuple opgevraagd en geeft null terug als er geen tuples meer zijn Attributen kunnen opgevraagd worden met getfunctie, afhankelijk is van het type van het attribuut Attributen kunnen aangeduid worden door het opgeven van de positie of de naam van het attribuut In dit voorbeeld wordt een enkel tuple geselecteerd