Udvidet Programmering 1999 Forelæsning 20, fredag 12. november 1999 Relationsdatabaser: relationer, tupler, attributter Forespørgselssproget SQL Databasesystemet PostgreSQL Tilgang til relationsdatabaser fra Java programmer Tilgang til relationsdatabaser fra Java appletter Programmering 1999 KVL Side 20-1 Eksempel på en database: studenter, kurser, eksamener Et udsnit af relationen Student: efternavn fornavn studienummer Olesen Peter L2143 Hansen Erika Jø0007 Funder Ulrik Hg0014 Et udsnit af relationen Kursus: kursusnummer kursusnavn 10181 Databehandling 45621 Landbrugszoologi 15351 Miljømodeller 15311 Matematisk Grundkursus Et udsnit af relationen Eksamen: studienummer kursusnummer karakter L2143 010181 8 L2143 045621 9 Jø0007 010181 11 Jø0007 015311 8 L2143 015311 10 Hg0014 015311 7 Programmering 1999 KVL Side 20-2 Databasebegreber En relationsdatabase består af en samling navngivne relationer (= tabeller). En relation (= tabel) består af to ting: Et skema (= tabeloverskrift): Skemaet er relationens form; det er uforanderligt. Skemaet angiver navn og type på relationens attributter (felter). En samling tupler (= tabellinier): Samlingen af tupler er relationens indhold; den kan variere over tid. Hvert tupel indeholder et sæt værdier for relationens attributter (felter). Rækkefølgen af tuplerne i en relation er ligegyldig. Programmering 1999 KVL Side 20-3 Relationer og skemaer i eksemplet Relationer: Student, Kursus, Eksamen Relationernes skemaer: Student: (efternavn TEXT, fornavn TEXT, studienummer TEXT) Kursus: (kursusnavn TEXT, kursusnummer INT) Eksamen: (studienummer TEXT, kursusnummer INT, karakter INT) Programmering 1999 KVL Side 20-4
Operationer på relationsdatabaser Når man arbejder med relationsdatabaser bruger man sproget SQL SQL er opfundet af IBM ca. 1970. I SQL skelner man ikke mellem store og små bogstaver (i modsætning til Java). Her skriver vi SQL-ordrerne med stort og relations- og feltnavne med småt. Programmering 1999 KVL Side 20-5 Oprettelse af relationer (SQL CREATE) CREATE TABLE student (efternavn TEXT, fornavn TEXT, studienummer TEXT); CREATE TABLE kursus (kursusnummer INT, kursusnavn TEXT); CREATE TABLE eksamen (studienummer TEXT, kursusnummer INT, karakter INT); Man kan kigge på databasens relationer, og relationernes skemaer: \dt \d eksamen \d kursus Programmering 1999 KVL Side 20-6 Indsættelse af værdier i relationerne (SQL INSERT) INSERT INTO student VALUES ( Olesen, Peter, L2143 ); INSERT INTO student VALUES ( Hansen, Erika, Jø0007 ); INSERT INTO student VALUES ( Funder, Ulrik, Hg0014 ); INSERT INTO kursus VALUES (10181, Databehandling ); INSERT INTO kursus VALUES (45621, Landbrugszoologi ); INSERT INTO kursus VALUES (15351, Miljømodeller ); INSERT INTO kursus VALUES (15311, Matematisk Grundkursus ); INSERT INTO eksamen VALUES ( L2143, 010181, 8); INSERT INTO eksamen VALUES ( L2143, 045621, 9); INSERT INTO eksamen VALUES ( Jø0007, 010181, 11); INSERT INTO eksamen VALUES ( Jø0007, 015311, 8); INSERT INTO eksamen VALUES ( L2143, 015311, 10); INSERT INTO eksamen VALUES ( Hg0014, 015311, 7); Programmering 1999 KVL Side 20-7 Forespørgsler på databasen (SQL SELECT) Vis alle kurser: SELECT * FROM kursus; Vis alle kurser sorteret efter kursusnavn: SELECT * FROM kursus ORDER BY kursusnavn; Vis alle kurser med kursusnummer 010181: SELECT * FROM kursus WHERE kursusnummer = 010181; Vis kursusnumre på alle kurser der har været holdt eksamen i: SELECT kursusnummer FROM eksamen; Samme, uden dubletter: SELECT DISTINCT kursusnummer FROM eksamen; Programmering 1999 KVL Side 20-8
Forespør gsler der involverer flere relationer (samkøring; join) Vis kursusnavn på alle kurser der har været holdt eksamen i. Hvordan kursusnavnet står jo ikke i relationen Eksamen? Lav en samkøring (join) mellem relationerne Eksamen og Kursus: SELECT DISTINCT kursusnavn FROM kursus, eksamen WHERE kursus.kursusnummer = eksamen.kursusnummer; Vis alle studerende der har været til eksamen i kursus 10181: SELECT DISTINCT fornavn, efternavn FROM student, eksamen WHERE student.studienummer = eksamen.studienummer AND kursusnummer = 10181; Vis alle studerende der har været til eksamen i kurset Databehandling : SELECT DISTINCT fornavn, efternavn FROM student, eksamen, kursus WHERE student.studienummer = eksamen.studienummer AND kursus.kursusnummer = eksamen.kursusnummer AND kursus.kursusnavn = Databehandling ; Programmering 1999 KVL Side 20-9 Sletning (SQL DELETE) Fjern alle eksamener med karakterer under 9: DELETE FROM eksamen WHERE karakter < 9; Opgave: fjern alle studerende der har fået mindst 11 i en eksamen. Programmering 1999 KVL Side 20-10 Opdatering (SQL UPDATE) Nedsæt alle karakterer mellem 7 og 11 med 1: UPDATE eksamen SET karakter = karakter-1 WHERE 7 <= karakter AND karakter <= 11; Programmering 1999 KVL Side 20-11 Aggregerede udtræk: COUNT, SUM, AVG, MIN, MAX Vis antal eksamener hver studerende har gået til: SELECT studienummer, COUNT(karakter) FROM eksamen GROUP BY studienummer; Programmering 1999 KVL Side 20-12
Opret ny relation udfra forespørgsel (SQL SELECT INTO) Resultatet af en forespørgsel (SELECT) er en relation. Man kan direkte gemme resultatet i en ny relation, f.eks. Eksamensantal: SELECT studienummer, count(karakter) AS antal INTO eksamensantal FROM eksamen GROUP BY studienummer; Nye felter kan navngives med AS. Den nye relation kan bruges i nye forespørgsler: SELECT efternavn, fornavn, antal FROM student, eksamensantal WHERE student.studienummer = eksamensantal.studienummer; Opgave: hvordan finde de studerende der aldrig har fået 11 eller derover? Vink: Brug SELECT INTO, DELETE, og SELECT. Programmering 1999 KVL Side 20-13 Slet en hel relation (SQL DROP TABLE) Vi skal ikke bruge relationen Eksamensantal mere: DROP TABLE eksamensantal; Programmering 1999 KVL Side 20-14 JDBC: Brug af relationsdatabaser fra Java-programmer En relationsdatabaseserver er et program der passer en samling databaser. Databaseserveren er typisk forbundet til et netværk, f.eks. Internet. Der er mange forskellige databaseservere. Vi bruger PostgreSQL, en gratis tilgængelig server. Java kommunikerer med databaser via JDBC, Java Database Connectivity. Java-programmet starter med at oprette en forbindelse til databasen. Det sker ved hjælp af en URL (Uniform Resource Locator), som på WWW: jdbc:postgresql://ellemose.dina.kvl.dk/studier Kommunikationsprotokollen er jdbc Subprotokollen er postgresql Databaseserveren kører på maskinen ellemose.dina.kvl.dk Databasen hedder studier. Desuden skal man angive brugernavn og løsen (password) for ejeren af databasen. Programmering 1999 KVL Side 20-15 Et Java-program der læser fra databasen import java.io.*; import java.sql.*; public class StudierDB { public static void main(string[] args) throws SQLException { Connection db; // The connection to the database Statement st; // Our statement to run queries with String url = "jdbc:postgresql://ellemose.dina.kvl.dk/studier"; String usr = "sestoft"; String pwd = ""; Class.forName("postgresql.Driver"); catch (ClassNotFoundException e) { System.out.println("Cannot find the Postgresql driver"); db = DriverManager.getConnection(url, usr, pwd); st = db.createstatement();... spørg databasen...... læs fra resultatet fra databasen og udskriv på skærmen... st.close(); db.close(); Programmering 1999 KVL Side 20-16
Spørg database og læs resultatet fra databasen String query = "SELECT * FROM student ORDER BY fornavn"; boolean resultset = st.execute(query); if (resultset) // Results were produced by a SELECT statement { ResultSet rs = st.getresultset(); while (rs.next()) { String enavn = rs.getstring("efternavn"); String fnavn = rs.getstring("fornavn"); String stdnr = rs.getstring("studienummer"); System.out.println(fnavn + " " + enavn + " (" + stdnr + ")"); Programmering 1999 KVL Side 20-17 Nogle praktiske forhold Klientmaskinen er den maskine på hvilken Java-programmet kører. På klientmaskinen skal man installere Java-arkivet postgresql.jar. Man kan f.eks. kopiere arkivet til C:\java\lib på sin maskine. Java-arkivet postgresql.jar kan f.eks. fås fra U-drevet: copy U:\dat\prog\jdkwin95\postgresql.jar C:\java\lib eller fra kursets hjemmeside (hold Skift nede og klik på henvisningen fra denne side): http://www.dina.kvl.dk/ sestoft/programmering/udleveret.html Man skal også fortælle java hvor den finder arkivet: set CLASSPATH=.;U:\java\lib\classes.zip;C:\java\lib\postgresql.jar Det indsættes f.eks. i klientmaskinens C:\autoexec.bat Programmering 1999 KVL Side 20-18 At forbinde Java-appletter med databasen Det fungerer på samme måde som ved Java-programmer. Arkivet postgresql.jar skal ligge udpakket på webserveren (ikke klientmaskinen). Det udpakkede postgresql-arkiv skal ligge i det katalog der indeholder applettens.class fil. Arkivet udpakkes på webserveren med ordren jar xf postgresql.jar Databaseserveren skal køre på samme maskine som webserveren. En applet må nemlig kun kommunikere med den maskine som appletten kommer fra (af sikkerhedshensyn). Programmering 1999 KVL Side 20-19 Eksempel på applet med databaseadgang import java.sql.*; import java.awt.*; import java.awt.event.*; import java.applet.applet; public class StudieApplet extends Applet { private TextField stdnrind = new TextField(15); private TextField kurnrind = new TextField(10); private TextField karind = new TextField(10); private TextArea ud = new TextArea(4, 40); private Button tilføj = new Button("Tilføj"); private Button søg = new Button("Søg"); Connection db; // Forbindelsen til databasen Statement st; // En SQL-ordre public void init() {... // Kaldes når appletten læses ind public void destroy() {... // Kaldes når appletten bliver smidt ud class TilføjLytter implements ActionListener {... class SøgLytter implements ActionListener {... private void addtodatabase(string stdnr, int kurnr, int kar) {... private void searchdatabase(int kurnr) {... Programmering 1999 KVL Side 20-20
Init- og destroy-metoderne public void init() { add(new Label("Studienummer")); add(stdnrind); add(new Label("Kursusnummer")); add(kurnrind); add(new Label("Karakter")); add(karind); add(tilføj); tilføj.addactionlistener(new TilføjLytter()); add(søg); søg.addactionlistener(new SøgLytter()); add(ud); String url = "jdbc:postgresql://ellemose.dina.kvl.dk/studier"; String usr = "sestoft"; String pwd = ""; Class.forName("postgresql.Driver"); db = DriverManager.getConnection(url, usr, pwd); st = db.createstatement(); catch (Exception e) { ud.append("kan ikke åbne databasen: "+ e.getmessage()); // Denne metode kaldes når appletten ikke bliver brugt mere. public void destroy() { st.close(); db.close(); catch (SQLException e) { ud.settext("kan ikke lukke databasen: " + e.getmessage()); Programmering 1999 KVL Side 20-21 Indsættelse: lytterklasse og metode class TilføjLytter implements ActionListener { public void actionperformed(actionevent e) { addtodatabase(stdnrind.gettext(), Integer.parseInt(kurnrInd.getText()), Integer.parseInt(karInd.getText())); private void addtodatabase(string stdnr, int kurnr, int kar) { String query = "INSERT INTO eksamen VALUES ( "; query += " " + stdnr + " "; query += ", " + kurnr; query += ", " + kar; query += ")"; ud.append(query + "\n"); boolean resultset = st.execute(query); catch (SQLException e) { ud.append("databaseopdatering gik galt: " + e.getmessage()); Programmering 1999 KVL Side 20-22 Søgning: lytter og søgemetode class SøgLytter implements ActionListener { public void actionperformed(actionevent e) { searchdatabase(integer.parseint(kurnrind.gettext())); private void searchdatabase(int kurnr) { String query = "select fornavn, efternavn, karakter" + " from eksamen, student" + " where eksamen.studienummer = student.studienummer" + " and eksamen.kursusnummer = " + kurnr + " order by fornavn, efternavn"; boolean resultset = st.execute(query); if (resultset) { ResultSet rs = st.getresultset(); ud.settext(""); while (rs.next()) { String enavn = rs.getstring("efternavn"); String fnavn = rs.getstring("fornavn"); int kar = rs.getint("karakter"); ud.append(fnavn + " " + enavn + " fik " + kar + "\n"); catch (SQLException e) { ud.append("databasesøgning gik galt: "+ e.getmessage()); Programmering 1999 KVL Side 20-23 Husk: En relationsdatabase består af en samling relationer En relation (tabel) består af et skema (tabeloverskrift) og en samling tupler (linier) Forespørgselssproget SQL bruges til at arbejde med relationsdatabaser Java-programmer og appletter kan kommunikere med databaser over netværket ved hjælp af JDBC Programmering 1999 KVL Side 20-24