Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god, enkel, nem at installere PostgreSQL mere omfattende Microsoft SQL Server robust og kompleks Oracle meget robust og kompleks IBM DB2 meget robust og kompleks Apache Derby indlejret Java-database snesevis af andre MySQL, Postgres og Derby er open source og gratis at benytte 1
Opsætning for Java og MS Windows Simpleste tilgang: Brug JDBC = Java Database Connectivity og ODBC = Open Database Connectivity Brug pakke java.sql Gør dette: Opret et Data Source Name (DSN) Det giver et lokalt navn til en database Brug dette DSN fra dit Java program JDBC = Java Database Connectivity JDBC Ensartet interface til mange databaser Lokal database, fx MS Access Fjern database, fx MySQL, MS SQL, Oracle, Postgres, DB2,... Databaseserver, JDBC, Java-program Databaseserver Java-program JDBC 2
Opsætning af lokal database under MS Windows Opret et Data Source Name (DSN): Start -> Control panel -> Administrative tools -> Data Sources (ODBC) -> User DSN -> MS Access Database Data Source Name: northwind-sample Database: C:\Northwind.mdb -> Test data source -> OK Eksempeldatabasen Northwind fra Access 3
Java kode til at forbinde til en DSN (del af sandheden) import java.sql.*; public class ReadAccessDatabase { public void openandquery() { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conn = DriverManager.getConnection("jdbc:odbc:northwind-sample");... brug conn til at tilgå databasen... if (conn!= null) conn.close(); Find driver Forbind til DSN northwind-sample... med JBDC og OBDC protokollen Brug forbindelsen Luk efter brug, ellers Lidt mere af sandheden: Exceptions Der er meget der kan gå galt: Databasen findes ikke Vi har ikke lov at bruge den Netværket er nede så vi kan ikke nå den MySQL databasedriveren er ikke installeret... osv Java-programmet må håndtere disse fejl Brug try { catch( ) { sætningen som forklaret B&K kapitel 12 4
Håndtering af ting der kan gå galt Hvis databasefejl Hvis driver ikke findes public class ReadAccessDatabase { public void openandquery() throws SQLException, ClassNotFoundException { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conn = DriverManager.getConnection("jdbc:odbc:northwind-sample");... brug conn til at tilgå databasen... if (conn!= null) conn.close(); Brug databaseforbindelsen til noget (filling in the dots) Udfør SQLforespørgsel på databasen Statement stmt = conn.createstatement(); String query = "SELECT Country FROM Customers"; boolean ok = stmt.execute(query); if (ok) { ResultSet res = stmt.getresultset(); while (res.next()) { String country = res.getstring(1); System.out.println(country); Hvis OK, så hent result set Hent hver post i result set Første element i posten, som streng 5
public void openandquerycountry(string country) throws SQLException, ClassNotFoundException {... String query = "SELECT CompanyName FROM Customers WHERE Country = " + "'" + country + "'"; boolean ok = stmt.execute(query); if (ok) { System.out.println("Companies in " + country + ":"); Opbyg forespørgsel i Java: Find firmaer i et bestemt land System.out.println("--------------"); ResultSet res = stmt.getresultset(); while (res.next()) { String companyname = res.getstring(1); System.out.println(companyName); System.out.println("--------------"); if (conn!= null) conn.close(); Opbyg SQLforespørgsel som streng Konfiguration af fjern database under MS Windows Opret et Data Source Name (DSN): Start -> Indstillinger -> Kontrolpanel -> Administration -> Datakilder (ODBC) -> User DSN -> Add -> MySQL ODBC 3.51 Driver Data Source Name: mysql-sestoft Host: mysql.itu.dk Database name: sestoft User: sestoft Password: ******* -> Test Data Source 6
Opret MySQL database på ITU s server Log ind på mit.itu (bruger, password) -> Andre ITU links, studenterdatabaser -> Opret ny database -> Indtast mail-brugernavn & password -> Databasenavn: sestoft -> Databasebrugernavn: sestoft -> Databasepassword: ******* Serveren hedder mysql.itu.dk Kan bruges fra ssh.itu.dk sådan her: mysql -h mysql.itu.dk sestoft -p Navn på host = servermaskinen Navn på databasen Brug password Opret tabel med SQL Tabellen Theatre har fire kolonner: id, name, rows, seatsperrow CREATE TABLE Theatre (id INT, name TEXT, rows INT, seatsperrow INT); 7
Indsæt data med SQL INSERT INTO Theatre VALUES (1, Lille sal, 8, 10); INSERT INTO Theatre VALUES (2, Mellem sal, 11, 12); mysql> SELECT * FROM Theatre; +------+------------+------+-------------+ id name rows seatsperrow +------+------------+------+-------------+ 1 Lille sal 8 10 2 Mellem sal 11 12 +------+------------+------+-------------+ 2 rows in set (0.00 sec) Læse salsdata fra Java-program Først, en klasse til at have resultatet i: class Theatre { public final String name; public final int rows, seatsperrow; public Theatre(String name, int rows, int seatsperrow) { this.name = name; this.rows = rows; this.seatsperrow = seatsperrow; 8
Læs en bestemt sals data public Theatre openandquery(int theatreid) throws SQLException, ClassNotFoundException, Exception { conn =...; String query = "SELECT name, rows, seatsperrow FROM Theatre" + " WHERE id=" + theatreid; boolean ok = stmt.execute(query); Theatre sal = null; if (ok) { ResultSet res = stmt.getresultset(); if (res.next()) { String name = res.getstring(1); int rows = res.getint(2); int seatsperrow = res.getint(3); sal = new Theatre(name, rows, seatsperrow); else { throw new Exception("Sal " + theatreid + " findes ikke"); return sal; Andre nyttige SQL-elementer Opdater felt i en eller flere poster: UPDATE Theatre SET rows = 13 WHERE id = 2; Slet en eller flere poster: DELETE FROM Theatre WHERE id = 2; Fjern en hel tabel (NB: ingen undo!) DROP TABLE Theatre; 9
Udtræk med gruppering og sortering Find for hvert rækkeantal hvor mange sale der har det antal rækker; vis resultat i faldende orden af antal sale: SELECT rows, COUNT(*) AS count FROM Theatre GROUP BY rows ORDER BY count DESCENDING; Se også http://java.sun.com/docs/books/tutorial/jdbc/ http://www.matfys.kvl.dk/databehandling/mysql.html 10