Základy JDBC

JDBC - Java DataBase Connectivity je programové API pre priamy prístup k databázam z JAVY.
Všetky triedy JDBC sú v balíku java.sql. Použité príklady som testoval v JAVA 2, konkrétne v JAVA 1.3.1.

Interface Driver:

JDBC driver je .class súbor, ktorý musí implementovať interface Driver. Tieto Driver-e pre jednotlivé databázy sú buď komerčne prístupné alebo je možné použiť driver JdbcOdbcDriver (nachádza sa v balíku sun.jdbc.odbc), ktorý je súčasťou JAVA 2. Tento driver umožňuje využiť databázy registrované pod ODBC vo Windows-och.

Spôsoby inicializácie driver-a:

1, jednoducho použiť daný .class súbor v JAVA programe ako každý iný dátový typ. Tento spôsob ale nie je vhodný keďže driver musí byť k dispozícii už počas kompilácie programu. Nie je možné doťahovať driver-y v run-time.
2, príkaz Class.forName("driver.class").newInstance() - tento príkaz vracia referenciu na objekt zadaný v parametri forName. Ten samozrejme treba pretypovať na typ nášho driver-a, keďže tento príkaz vracia Class. Toto je najviac zaužívaný spôsob.
3, cez ENVIRONMENT premenné JAVY - používa sa málokedy. Nebudem ho tu popisovať.

Príklad inicializácie driver-a:

  JdbcOdbcDriver driver;
  driver=(JdbcOdbcDriver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();

Statická trieda DriverManager:

DriverManager je niečo ako garabage collector. Je v pamäti a akonáhle inicializujeme nejaký driver horeuvedeným spôsobom tento manager ho registruje. Potom neskôr všetky JDBC príkazy idú cez tento DriverManager, ktorý už vie ako má spolupracovať s JDBC driverom. Driver už zasa vie komunikovať s databázou.

Pripojenie sa na databázu:

  Connection DriverManager.getConnection(url,user,password);
Na triede DriverManager je funkcia getConnection, ktorá má tri parametre: DB url, user a password, pričom url je tvaru: "jdbc:subprotocol:subname". Presný tvar záleží od použitého driver-a. U nášho JdbcOdbcDriver-a to je napríklad: "jdbc:odbc:odbcname". Tento príkaz slúži na pripojenie k databáze, ak je spojenie úspešné vráti nám objekt typu Connection.

Príklad pripojenia sa na databázu:

  Connection con;
  con=DriverManager.getConnection("jdbc:odbc:pokus","sql","sql");

Interface Connection:

Poskytuje príkazy pomocou ktorých je možné zisťovať ale aj nastavovať veci ako auto-commit príkazov, Transaction Isolation, či DB podporuje rollback, či DB je read-only apod. Najdôležitejším príkazom pre nás je createStatement, ktorý vracia objekt typu Statement, z ktorého už je možné posielať priamo SQL príkazy do databázy.

Príklad získania objektu typu Statement:

  Connection con;
  Statement stmt;
  stmt=con.createStatement();

Interface Statement:

Poskytuje okrem iného aj príkazy na priame odosielanie SQL príkazov databáze. Sú to hlavne tieto dva príkazy: executeUpdate(SQLString); a executeQuery(SQLString); executeUpdate slúži na odosielanie príkazov, ktoré nevracajú relácie. Ako napr. CREATE TABLE, UPDATE TABLE, INSERT INTO apod. Tento príkaz vracia int. Návratová hodnota udáva koľko riadkov tabuľky bolo daným príkazom zmenených. Za zmienku stojí hlavne príkaz executeQuery (teda SELECT), ktorý má vraciať celú reláciu. Tento príkaz vracia objekt typu ResultSet, ktorý túto reláciu predstavuje.

Príklad SELECTu:

  Statement stmt;
  ResultSet rs;
  rs=stmt.executeQuery("SELECT * from STUDENT");

Interface ResultSet:

Poskytuje akési programové browsovanie po relácii, ktorú nám vrátil príkaz executeQuery. Na začiatku je kurzor na prvom riadku relácie.
Príkazy:
first - choď s kurzorom na prvý riadok relácie.
next - choď s kurzorom na ďalší riadok relácie.
last - choď s kurzorom na posledný riadok relácie.
get funkcie: je to sada funkcií tvaru getType (napr. getInt, getChar apod.). Každá vracia príslušný dátový typ podľa svojho názvu. Parametrom týchto funkcií je column index resp. column name príslušnej relácie. Tieto funkcie slúžia na vytiahnutie údaju z konkrétneho stĺpca relácie z riadku kde sa nachádza kurzor.
update funkcie: podobne ako get funkcie ale slúžia na zápis údajov. Tieto príkazy je možné ale spúšťať len ak DB podporuje update databázy priamo zo SELECTU.
funkcia getMetaData - vracia objekt typu ResultSetMetaData, v ktorom je možné zistiť rôzne dôležité informácie o našej relácii, ako napr. počet riadkov, či stĺpcov, dátové typy jednotlivých stĺpcov a pod.

Príklad vypísania všetkých položiek "Meno" z relácie:

  ResultSet rs;
  while(rs.next()) System.out.println(rs.getString("Meno"));

Záver:

Ak to všetko spojíme tak najjednoduchší JDBC program je na pár riadkov. Ak mám napríklad v ODBC vo Windows registrovanú databázu pod menom ´pokus´, ktorá obsahuje tabuľku ´student´ a tá obsahuje položku ´meno´, tak program ktorý mi tieto položky vypíše je následovný.
  import java.sql.*;

  Connection con;
  Statement st;
  ResultSet rs;

  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
  con=DriverManager.getConnection("jdbc:odbc:pokus","sql","sql");
  st=con.createStatement();
  rs=st.executeQuery("SELECT meno FROM student");
  while(rs.next()) System.out.println(rs.getString("Meno"));
Samozrejme na konci práce sa patrí cez príkazy close jednotlivé objekty "pozatvárať". Podrobnejšie informácie o jednotlivých príkazoch sú v JAVA 2 API reference, balík java.sql.

Nasleduje odkaz na nejaké helpy okolo JDBC:
JDBC help.rar

A odkaz na jednoduchý JDBC program:
JDBC sample.rar