HSMT Tietokannoista Ville Leppänen HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32
Missä mennään... 1. Johdanto (1h) 2. Säikeet (2h) 3. Samanaikaisuudesta (2h) 4. Hajautetuista sovelluksista (1h) 5. Soketit (3h) 6. RMI (2h) 7. RPC (2h) 8. Corba (2h) 9. Protollista, XML (2h) 10. WWW+Servletit (2h) 11. Tietokannoista (2h) 12. Haja-aiheita (1h) 99. Kertausluento (2h) HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.2/32
Luvun rakenne Tietokannan merkityksestä hajautetuissa järjestelmissä. Millainen relaatiotietokanta on? Hieman käsitteitä. Mitä operaatioita kantaan voi kohdistaa? Operaatioiden luonne. SQL Structure Query Language. JDBC Java DataBase Connectivity (API). Yhteys tietokantaan; ajurit. JDBC:hen liittyvät luokat. Esimerkkejä. Käsitellään relaatiotietokantaa. Oliotietokannat vieläkin tulossa. Ks. http://www.odbms.org/ HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.3/32
Merkitys haj. järjestelmissä Hajautetut järjestelmät lähes poikkeuksetta perustuvat tiedon keräämiseen ja/tai jakamiseen. Tietokanta toimii kolmikerrosarkkitehtuurin (3-tier) alimpana kerroksena. GUI pohjainen asiakassovellus palvelimen toiminnal lisuus JDBC ajuri Tietokanta soketit, RMI, HTTP,... tietokanta protokolla (SQL) HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.4/32
Relaatiotietokanta: käsitteitä Relaatiotietokanta on joukko tauluja. Kukin taulu koostuu riveistä jokainen rivi esittää yhtä tietokannan tietuetta. Taulun kussakin sarakkeessa on joka rivillä saman tyyppistä tietoa. (Olion kenttä.) Kahdessa (tai useammassa) taulukossa voi olla sarakkeita, joilla samaa tietoa. Kyseisiä sarakkeita voidaan käyttää liitoksen tekemiseen. Esimerkiksi KURSSI-taulussa on kenttä koodi, joka on samassa merkityksessä SUORITUS-taulun kentän kurssi kanssa. = voidaan tehdä kysely, jonka tuloksena pareja (kurssinimi, suorittaneen opiskelijan nimi). HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.5/32
Mitä operaatioita kantaan? Tietokantaa tyypillisesti käytetään joillakin oikeuksilla. Käyttäjätunnusten luonti ja käyttöoikeusten asettaminen on eräs osa tietokannan toimintaa. Tavallisen käyttäjän toimenpiteitä: Tietokannan luonti. Tietokantapalvelimessa voi olla useita tietokantoja. Tietokannan taulun luonti / tuhoaminen. Tietojen syöttö tauluun. Tauluissa olevien tietojen muuttaminen & tuhoaminen. Kyselyiden tekeminen! Taulujen olemassaolo, määritysten utelu, näkymät,... HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.6/32
Structure Query Language 1/5 Relaatiotietokantojen kyselykieli, joka pyrkii olemaan riippumaton tietokantamoottorista. Tehty 80-luvulla. Ei ole case-sensitive. Tietokannan luonti. (CREATE DATABASE) Tietokannan taulun luonti CREATE TABLE henkilo ( Etunimi VARCHAR(20) NOT NULL, Sukunimi CHAR(30) NOT NULL, Sotu CHAR(15) NOT NULL UNIQUE, Osoite CHAR(50) NOT NULL, OPNumero INTEGER KEY); HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.7/32
Structure Query Language 2/5 Taulun tuhoaminen. DROP TABLE henkilo; Tietojen syöttö tauluuun. INSERT INTO henkilo VALUES( Ville, Leppänen, 083332-273A, Kotikuja 6, Turku 20100, 78623); HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.8/32
Structure Query Language 3/5 Tauluissa olevien tietojen muuttaminen & tuhoaminen. UPDATE henkilo SET Osoite= Uusikotikolo 1, Turku WHERE OPNumero=78623; DELETE FROM henkilo WHERE Etunimi= Ville ; HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.9/32
Structure Query Language 4/5 Kyselyiden tekeminen! SELECT * FROM henkilo; SELECT Sukunimi, Etunimi, Osoite FROM henkilo WHERE OPNumero < 79000 ORDER BY Sukunimi, Etunimi; HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.10/32
Structure Query Language 5/5 Monimutkaisempi kysely! SELECT henkilo.sukunimi, henkilo.etunimi, kurssi.nimi, tentti.arvosana FROM henkilo, kurssi, tentti WHERE henkilo.opnumero = tentti.opnumero AND kurssi.koodi = tentti.koodi AND tentti.koodi = TKO_5565 ; HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.11/32
JDBC JDBC Java Database Connectivity. Muodostaa ns. tietokanta-ajurin rajapinnan. Tietokantojen valmistajat tarjoavat usein oman ohjelmointirajapinnan (yksilöllinen). ODBC = Open DataBase Connectivity; MS:n määrittelemä API; laajasti tuettu TK-toimittajien toimesta. JDBC on uudehko tulokas. JDBC/ODBC-silta olemassa, mutta myös suoraa tukea JDBC:lle (siis rajapinnan luokkien toteutuksia). MS SQL Server, Access, Oracle, Interbase, MySQL, Postgress,... miten tuettu?? HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.12/32
Yhteys tietokantaan GUI pohjainen asiakassovellus palvelimen toiminnal lisuus JDBC ajuri Tietokanta soketit, RMI, HTTP,... tietokanta protokolla (SQL) HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.13/32
Ajureista Java ohjelma JDBC:n API JDBC:n tietokantamanageri Toimittajan JDBC ajuri JDBC Driver API Tietokanta JDBC/ODBC silta ODBC ajuri Tietokanta HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.14/32
Yhteys verkkotietokantaan URL: jdbc:xxxbase://osoite.domain:portti/kanta Esim. jdbc:mysql://localhost:3306/test JDBC-ajurin ottaminen ohjelmaan rekisteröimällä se manuaalisesti: Class.forName("org.gjt.mm.mysql.Driver") (näin siis ladataan luokka JVM:ään) Yhteyden muodostus: String url = "jdbc:mysql://localhost:3306/test"; String u = "ville"; // tunnus String s = "salaisuus"; // salasana Connection c = DriverManager(url, u, s); HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.15/32
Komentojen suorittaminen SQL-lause: Statement -luokka Connection con =...; Statement s = con.getstatement(); Päivitysoperaatio: s.executeupdate(command); Kysely: s.executequery(command); missä command on String-muotoinen SQL-komento!!! Kyselyn tulos on ResultSet -tyyppinen olio. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.16/32
Luokista 1/3 java.sql.drivermanager: static Connection getconnection(string, String, String) java.sql.connection (rajapinta): Statement createstatement() void close() void commit() void rollback() java.sql.statement (rajapinta): ResultSet executequery(string) int executeupdate(string) void cancel() peruuta keskeneräinen komento HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.17/32
Luokista 2/3 java.sql.resultset (rajapinta): void beforefirst() boolean next() XXX getxxx(int) numerointi 1,... XXX getxxx(string) XXX = int, double, String, Date,... int findcolumn(string) ResultSetMetaData getmetadata() paljon muitakin metodeja HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.18/32
Luokista 3/3 java.sql.resultsetmetadata (rajapinta): int getcolumncount() int getcolumndisplaysize(int) String getcolumnlabel(int) String getcolumnname(int)... paljon muita metodeja JDBC 2: javax.sql Mahdollistaa mm. tulosten muuttamisen ja viennin takaisin kantaan. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.19/32
MySQL 4.0: käyttäminen Hae softa ja JDBC-ajuri www.mysql.com:sta. Tee c:/my.cnf. [mysqld] basedir=c:/mysql datadir=c:/mysql/data Käynnistä mysqld. Aseta oikeuksia (root:lle salasana etc; mysqladmin). Valmis käyttöön: c:/mysql/bin/mysql -uroot -psalasana test Tällä ohjelmalla voit käsitellä suoraan kantaa. Tietokantamoottori on portissa 3306. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.20/32
MySQL: taulujen luonti CREATE TABLE Hlo (etunimi VARCHAR(20), sukunimi VARCHAR(20), opnumero INT UNIQUE); CREATE TABLE Kurssi (nimi VARCHAR(50), koodi CHAR(10) UNIQUE); CREATE TABLE Tenttisuoritus (opnumero INT, kurssi CHAR(10), arvosana CHAR(3)); load data local infile "c:/mysql/data/kurssi.txt" into table kurssi; load data local infile "c:/mysql/data/hlo.txt" into table hlo; load data local infile "c:/mysql/data/tenttisuoritus.txt" into table tenttisuoritus; HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.21/32
MySQL: muutama kokeilu select * from table kurssi; select * from table hlo; select * from table tenttisuoritus; select hlo.etunimi, hlo.sukunimi, kurssi.nimi, tenttisuoritus.arvosana from tenttisuoritus, hlo, kurssi where hlo.opnumero = tenttisuoritus.opnumero and hlo.opnumero = 76753 and kurssi.koodi = tenttisuoritus.kurssi; HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.22/32
Tiedosto hlo.txt Ville Leppänen 76753 Heikki Mattila 72233 Sampo Holopainen 65362 Oskari Mattila 64655 Jaakko Oikarinen 54543 HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.23/32
Tiedosto kurssi.txt Ohjelmointi I TKO_5439 Ohjelmointi II TKO_5440 Johdatus tietojenkäsittelytieteeseen I TKO_5565 Johdatus tietojenkäsittelytieteeseen II TKO_5566 Johdatus tietojärjestelmätieteeseen TKO_5555 Laboratoriotyö 1 TKO_5289 Tietojärjestelmien peruskurssi TKO_5339 HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.24/32
Tiedosto tenttisuoritus.txt 76753 TKO_5439 2+ 65362 TKO_5439 3 64655 TKO_5439 2.5 64655 TKO_5339 2 76753 TKO_5339 1 54543 TKO_5339 3-54543 TKO_5565 3 54543 TKO_5566 3 76753 TKO_5565 3-76753 TKO_5566 2+ HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.25/32
SimpleQuery.java 1/2 import java.sql. ; import java.io. ; public class SimpleQuery { public static void main(string[] args) throws Exception { if (args.length 4) { System.out.println("4 Args required."); System.exit(0); } Connection yhteys = teetkyhteys(args[0], args[1], args[2]); teekysely(yhteys, "SELECT FROM " + args[3] + ";"); yhteys.close(); } // main private static Connection teetkyhteys(string base, String user, String pass) throws Exception{ Class.forName("org.gjt.mm.mysql.Driver"); String url = "jdbc:mysql://localhost:3306/"+base; return DriverManager.getConnection(url, user, pass); } // teetkyhteys HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.26/32
SimpleQuery.java 2/2 private static void teekysely(connection c, String kysely) throws Exception { // Kyselyitä tehdään lauseen avulla. Statement stmt = c.createstatement(); ResultSet tulokset = stmt.executequery(kysely); tulokset.beforefirst(); ResultSetMetaData rsmd = tulokset.getmetadata(); int cols = rsmd.getcolumncount(); for (int i = 1; i cols; i++) { System.out.print(rsmd.getColumnName(i)); if (i cols) System.out.print("\t"); else System.out.println(" "); } // for while (tulokset.next()) for (int i = 1; i cols; i++) { System.out.print(tulokset.getObject(i)); if (i cols) System.out.print("\t"); else System.out.println(" "); } // for } // teekysely } // class SimpleQuery HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.27/32
SimpleQuery: suoritus C:\My Documents>java SimpleQuery test root salainen hlo etunimi sukunimi opnumero Ville Leppänen 76753 Heikki Mattila 72233 Sampo Holopainen 65362 Oskari Mattila 64655 Jaakko Oikarinen 54543 C:\My Documents>java SimpleQuery test root salainen kurssi nimi koodi Ohjelmointi I TKO_5439 Ohjelmointi II TKO_5440 Johdatus tietojenkäsittelytieteeseen I TKO_5565 Johdatus tietojenkäsittelytieteeseen II TKO_5566 Johdatus tietojärjestelm,tieteeseen TKO_5555 Jaboratoriotyö 1 TKO_5289 Tietojärjestelmien peruskurssi TKO_5339 C:\My Documents> HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.28/32
JointQuery.java 1/2 import java.sql. ; import java.io. ; public class JointQuery { // Seuraavien kirjoittaminen ohjelmaan on hyvin arveluttavaa. private static String kanta = "jdbc:mysql://localhost:3306/test"; private static String käyttäjä = "root"; private static String salasana = "salainen"; public static void main(string[] args) throws Exception { if (args.length 1) { System.out.println("Usage: java JointQuery OpNumero."); System.exit(0); } Connection yhteys = teetkyhteys(); String kysely = "SELECT hlo.etunimi, hlo.sukunimi," + "kurssi.nimi, tenttisuoritus.arvosana" + "FROM tenttisuoritus, hlo, kurssi" + "WHERE hlo.opnumero = tenttisuoritus.opnumero" + "AND hlo.opnumero = " + args[0] + "AND kurssi.koodi = tenttisuoritus.kurssi;"; teekysely(yhteys, kysely); yhteys.close(); } // main HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.29/32
JointQuery.java 2/2 private static Connection teetkyhteys() throws Exception{ Class.forName("org.gjt.mm.mysql.Driver"); return DriverManager.getConnection(kanta, käyttäjä, salasana); } // teetkyhteys private static void teekysely(connection c, String kysely) throws Exception { // Kyselyitä tehdään lauseen avulla. Statement stmt = c.createstatement(); ResultSet tulokset = stmt.executequery(kysely); tulokset.beforefirst(); ResultSetMetaData rsmd = tulokset.getmetadata(); int cols = rsmd.getcolumncount(); while (tulokset.next()) for (int i = 1; i cols; i++) { System.out.print(tulokset.getString(i)); if (i cols) System.out.print("\t"); else System.out.println(" "); } // for } // teekysely } // class JointQuery HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.30/32
JointQuery: suoritus C:\My Documents>java JointQuery 76753 Ville Leppänen Ohjelmointi I 2+ Ville Leppänen Johdatus tietojenkäsittelytieteeseen I 3- Ville Leppänen Johdatus tietojenkäsittelytieteeseen II 2+ Ville Leppänen Tietojärjestelmien peruskurssi 1 C:\My Documents>java JointQuery 7 (ei tulosta mitään) C:\My Documents>java JointQuery 54543 Jaakko Oikarinen Johdatus tietojenkäsittelytieteeseen I 3 Jaakko Oikarinen Johdatus tietojenkäsittelytieteeseen II 3 Jaakko Oikarinen Tietojärjestelmien peruskurssi 3- C:\My Documents> HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.31/32
Lopuksi JDK tukee JDBC:n kautta relaatiotietokantojen käyttöä. Toteutus on aika naivi: käytetään suoraan tekstipohjaisia SQL-komentoja kyselyissä tulos jäsennetty taulukon muotoon. GUIn liittäminen tietokannan käyttöön suoraviivaista. Tietokannan tauluja voi luoda JDBC:n kautta, mutta lähinnä tehdään kyselyitä ja modifioidaan tietueita. JDBC on lähinnä vain joukko rajapintoja. Käyttämiseksi tarvitaan kohdetietokantaa käyttävää ajuria. Tietokannan pitää myös olla päällä relaatiotietokanta ei ole vain joukko tiedostoja. Monet ajurit ovat kaupallisia! Ajurit: asennus ja käyttö vaikeaa? Tietokanta on keskeinen elementti hajautetuissa järjestelmissä. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.32/32