• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
JDBC en embedded SQL
 

JDBC en embedded SQL

on

  • 2,308 views

 

Statistics

Views

Total Views
2,308
Views on SlideShare
988
Embed Views
1,320

Actions

Likes
0
Downloads
32
Comments
0

1 Embed 1,320

https://cygnus.cc.kuleuven.be 1320

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    JDBC en embedded SQL JDBC en embedded SQL Presentation Transcript

    • programma s verbindenmet gegevensbankenKatrien Verbertkatrien.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
    • benaderingen1.  inbedden SQL opdrachten in een programma •  SQL opdrachten worden door een precompiler opgezocht •  en omgevormd tot functie-aanroepen van de programmeertaal2.  gebruik van een bibliotheek met functies •  die toegang verschaffen tot de gegevensbank •  en resultaten beschikbaar stellen aan een programma in een API3.  een (nieuwe) programmeertaal ontwikkelen •  die compatibel is met het gegevensmodel en query taal •  vb: PL/SQL van Oracle
    • SQL/Host Language Interface SQL stmt Func6on  call   SQL Table Library While(…){ Cursor 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  <  connec6on  name  >   AUTHORIZATION  <  user  account  name  and  password  >  ;   •  slechts één connectie kan actief zijn; •  wijzigen van de actieve connectie: SET  CONNECT  <  connec6on  name  >  ;   –  Verbinding beëindigen: DISCONNECT  <  connec6on  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 werknemerloop = 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 languageCLI (Call-level +interface) Function calls Host-­‐language   SQL library Object-code compiler   program
    • 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
    • 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 makenDefaultContext 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 werknemerssn = 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
    • 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 21
    • 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 23
    • JDBC architectuur Applica6on   JDBC   Driver  •  Java code roept JDBC library aan•  JDBC laadt een driver•  Driver spreekt met een gegevensbank Copyright © 1997 Alex Chaffee 24
    • JDBC Driver•  PostgreSQL: http://jdbc.postgresql.org/•  Oracle: zie Toledo 25
    • 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
    • stappen in JDBC gebruik1.  importeer het java.sql pakket2.  laad en registreer de driver3.  zorg voor passende variabelen in Java4.  maak een connectie met de gegevensbank5.  creëer een opdracht6.  voer de opdracht uit7.  haal het resultaat (of de resultaten) op8.  sluit de opdracht en de connectie
    • 1. importeer het java.sql pakket import java.sql.*; ofof import java.sql.Connection; import java.sql.SQLException; import java.sql.DriverManager; import java.sql.Driver; import java.sql.Statement; import java.sql.ResultSet; … 28
    • 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 roepenDriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());DriverManager.registerDriver (new org.postgresql.Driver()); 30
    • 2. laad en registreer de driver •  alternatief: –  gebruik de generieke Java functie om een klasse te ladenVb:Class.forName(“oracle.jdbc.driver.OracleDriver”); 31
    • JDBC gebruik3. zorg voor de passende variabelen in Javapublic 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
    • 4. 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
    • 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
    • ? : parameter,
    • 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
    • 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
    • 7. haal het resultaat (of de resultaten) op•  het resultaat wordt teruggegeven in een object van het type ResultSetResultSet 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
    • binding van 1-ste parameter met ssn1, 2: attribuutposities,als alternatrief voor de attribuutnamen
    • JDBC gebruik8.  sluit de opdracht en de connectie •  (ook resultset(s) moeten worden afgesloten)stmt.close();con.close (); 44
    • JDBC: overzicht van acties DriverManager   Connec6on  getConnection Statement   createStatement ResultSet   execute 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() 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(); 47
    • 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 parametersRes 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
    • JDBC versus SQLJJDBC SQLJstmt  =  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();   51
    • SQLJ versus JDBC SQLJ JDBC SQL statements static dynamic Strong typing yes no Checking static runtime only Syntax concis e API Standard ANSI Sun Portable yes yes Object support yes* yes* Source: www.cs.manchester.ac.uk/~horrocks/cs2312/Lectures/PPT/jdbc.ppt
    • VRAGEN?