HAAGA-HELIA ICT1TA006: Ohjelmointi 1 /5 Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC) (Lähteet: Oracle java jdbc Tutorial, Arvo Lipitsäinen: Tietokannan käsittely JDBC:n avulla) Tietokannan käsittely luodaan yhteys tietokantaan tai muuhun tietolähteeseen lähetetään SQL lauseita suoritettaviksi käsitellään mahdollista SQL-lauseen tulosjoukkoa Tietokannan käsittelyyn JSE:ssä on pakkaus java.sql.*, jossa ovat mm. seuraavat luokat:
HAAGA-HELIA ICT1TA006: Ohjelmointi 2 /5 Luokka tai rajapintaluokka Connection Statement PrepareStatement ResultSet DatabaseMetadata ResultSetMetaData SQLException Käyttö Vastaa tietokantayhteydestä luoden yhteyden tietokannan ja ohjelman välille. Yhteys tulee vapauttaa close-metodilla. DriverManager vastaa tietokantakohtaisesta yhteydestä. Olion avulla hoidetaan SQL-käskyjen suoritus ja niiden tulosten hallinta Olion avulla hoidetaan parametroituja SQL-käskyjä. Olion avulla hallitaan kyselyjen tulokset. Olion avulla voidaan tarkastella tietokannan tietohakemistoa. Olion avulla saadaan tietoa haettujen rivien sarakkeiden nimistä ja tietotyypeistä. Olion avulla käsitellään tietokannasta saadut virheilmoitukset. Tietokannan käsittely Kun tietokannassa olevia tietoja käsitellään ohjelmasta, suoritetaan usein seuraavantyyppiset toiminnot: Rekisteröi JDBC-ajuri Luo yhteys tietokantaan Tee SQL-kysely Lue tulosjoukkoa Sulje tulosjoukko [Tee SQL-kysely,...] Lopeta SQL-kyselyt JDBC ajurin rekisteröinti Ohjelma tarvitsee käyttöönsä tietokantakohtaisen JDBC ajuriluokan. Luokka ladataan vasta ohjelman ajoaikana, joten sitä ei tarvitse ottaa huomioon ohjelman käännösaikana. Me käytämme mysql-ajuria. Rekisteröitäessä ajuria siitä ei tarvitse luoda uutta oliota, koska se luodaan automaattisesti käytettäessä Class.forName- metodia.
HAAGA-HELIA ICT1TA006: Ohjelmointi 3 /5 JDBC-ajurin rekisteröinti tapahtuu seuraavasti: String JDBCAjuri = "com.mysql.jdbc.driver"; Class.forName(JDBCAjuri).newInstance(); Tietokanta-ajuri on oma ohjelmansa, joka täytyy ladata sovellukseen yhteistoimintaan oman sovelluksemme kanssa. Siitä on oma ohjeistuksensa. Luo yhteys tietokantaan JDBC ajurin rekisteröinti ei luo vielä yhteyttä kantaan, vaan yhteys on tehtävä erikseen. Seuraavassa on esimerkki kutsusta, jossa luodaan yhteys mysql-kantaan. Yhteys muodostetaan ja sitä hoidetaan Connection olion avulla. Connection con = DriverManager.getConnection(); Yhteydenmuodostuksen voi tehdä seuraavasti: private Connection tietokantayhteys; String url = ""jdbc:mysql://localhost:3306/benan"; tietokantayhteys = DriverManager.getConnection(url,"benan", "hotugh84v"); url-merkkijonossa annetaan ajurin nimi, portin numero ja tietokanta, johon tietokantayhteys palvelimelle ja omaan työasemaan muodostuu. tietokantayhteys puolestaan kertoo, että mysql-tietokantaa käsitellään ajurilla, kanta on nimeltään benan ja viimeisenä kannan salasana. Huomaa, että oikeassa elämässä emme suinkaan näin vapaasti levittele tunnuksia ja salasanoja. Nyt on kuitenkin kyseessä oppiminen ja testaus, joita käytämme tietokantaharjoituksiin. SQL-kysely JDBC yhteyttä käytettäessä tietokantaa käsitellään SQL-lauseiden avulla. Haettaessa tietoa tietokannassa suoritetaan ohjelmassa seuraavat vaiheet. Luodaan SQL-lause Suoritetaan lause Haetaan tulostiedot suljetaan yhteys tulosjoukkoon
HAAGA-HELIA ICT1TA006: Ohjelmointi 4 /5 Lauseen luonti vaatii statement-olion olemassaolon ja jos vapaata oliota ei ole käytettävissä, luodaan se seuraavasti: Statement stmt = con.createstatement(); Koska select-käsky voi palauttaa tuloksenaan monta riviä, luodaan sen suorituksen yhteydessä ResultSet- luokan olio, josta ohjelma noutaa tuloksen rivi kerrallaan käsittelyyn. Käskyn suoritus ja tulosjoukon käsittelyolion luominen tapahtuu seuraavan esimerkin mukaisesti: ResultSet rs = stmt.executequery( "SELECT sarakenimi1, sarakenimi2 FROM taulunimi "); Käsiteltävänä olevan rivin jokainen tarvittava sarakearvo on erikseen haettava metodilla getxxx, missä XXX vastaa ohjelmaan palautettavaa tietotyyppiä. Metodille annetaan attribuutiksi kursorista osoitetusta rivistä haettavan sarakkeen nimi. On myös mahdollista osoittaa haluttu sarake sen järjestysnumeron mukaisesti (ensimmäinen sarake on numeroltaan 1). Luokan ResultSet olio rs sisältää haetut rivit eli taulunimi-taulun kaikki rivit ja niiden sarakkeet sarakenimi1 ja sarakenimi2. Kun haluamme käsitellä rivejä ohjelmassa, haemme ne yksitellen käsittelyyn. Kutsumme kursoriksi osoitinta, joka osoittaa käsiteltävänä olevaan riviin.. Alunperin kursori osoittaa tulosjoukon alkuun siten, että ensimmäinenkin rivi on myös haettava ResulSetobjektin next- metodilla. Yleisimmät metodit ovat getstring, jota voi käyttää lähes kaikkien tietokannan tietotyyppien kanssa getfloat getint Esimerkki ohjelman SQL-kyselyn suorittamisesta. Ohjelmassa haetaan tulosjoukko tietokannasta ja tulostetaan sisältöä. String s; float n;... String query = "SELECT sarakenimi1, sarakenimi2 FROM taulunimi"; ResultSet rs = stmt.executequery(query); while (rs.next()) { s = rs.getstring("sarakenimi1"); n = rs.getfloat("sarakenimi2"); System.out.println(s + " " + n); } Sulje tulosjoukko Kun ohjelmassa on käsitelty kyselyn antama tulosjoukko, tulee siltä osin varatut resurssin vapauttaa. Tähän käytetään kutsua stmt.close (); Kun edellä ollut kutsu on suoritettu, voidaan Statement luokan olio stmt käyttää uudelleen, ts. siihen voidaan asettaa suoritettavaksi uusi SQL-lause.
HAAGA-HELIA ICT1TA006: Ohjelmointi 5 /5 Sulje tietokantayhteys Kun tietokantayhteyttä ei enään tarvita ohjelmassa, tulee se sulkea ja näin vapauttaa tietokannasta varatut resurssit. Yhteyden sulkeminen tapahtuu kutsulla. conn.close(); Lisäoppia innokkaille löytyy mm. seuraavilta sivustoilta: Oraclen JDBC-Tutorial: http://docs.oracle.com/javase/tutorial/jdbc/ Tutorialspoint: http://www.tutorialspoint.com/jdbc/