InterBase i Java

jmail

Na początek należałoby wspomnieć o sposobie komunikacji Javy z bazą danych.

Można to zrobić w dwojaki sposób. Korzystając z czystego sterownika jdbc (wcale to nie znaczy Java DataBase Conectivity) albo z translatora jdbc - odbc.

Jaka różnica? Taka że przy translatorze cala operacja trwa o wiele dłużej ponieważ zapytanie jest tłumaczone w jedną stronę jdbc - odbc i w drugą tłumaczona jest odpowiedź odbc - jdbc.

W niniejszym arcie (i może nie ostatnim) zajmiemy się połączeniem javy z InterBase'm firmy Borland. Jak wiadomo InterBase jest płatny, dlatego skorzystam z wersji 6.x która była opensource. Różnica w nowszych wersjach jest niewielka. Trzeba tylko pobrać inne sterowniki.

Serwer opensource można pobrać ze strony ftp://ftp.borland.com/pub/interbase/devsupport/open_source
można stamtąd również pobrać sterowniki. Jeżeli będziemy pobierać sterownik to wystarczy pobrać plik o nazwie IC20001winJRE12.exe

Na początku instalujemy serwer bazodanowy InterBase. A następnie instalujemy serwer InterClient (który jest łącznikiem pomiędzy serwerem IB a sterownikiem jdbc).

Dla przykładowego tworzenia kodu w javie będę używał JCreatora. Do tworzenia skryptów sql na samym serwerze będę używał wbudowanego narzędzia jakim jest IBConsole.

Jeżeli mamy wszystko zainstalowane to trzeba by uruchomić serwer. odpalamy IBConsole i na początek rejestrujemy serwer (lokalny ponieważ do zdalnego nie mamy dostępu, no chyba że gdzie indziej instalowaliśmy serwer, na innym kompie). Uzytkownik to SYSDBA a hasło masterkey. Na początek sugeruję zmianę tego hasła ponieważ zna je cały świat :D

skoro już mamy zarejestrowany serwer to utworzymy bazę danych która będzie nam służyć do testów teraz i później w innych artach.

Z menu Database wybieramy Create Database. wpisujemy alias (ja używam tescik) oraz sciezke do pliku (u mnie to d:\tescik.gdb, rozszerzenia nie trzeba wpisywac albo wpisac dowolne. byleby nie kolidowało w innymi rozszerzeniami). Zmieniamy rozmiar Page Size na najwyższą dostępną opcję i klikamy OK. Mamy utworzoną bazę danych. Z reszta graficznie to widać.

Narazie baza jest pusta. teraz dodamy przykladową tablekę. klikamy raz na nazwie naszej bazy danychi wybieramy ikonkę sql. pojawia się konsola dzięki której będziemy mogli pisac w sql'u. InterBase używa dialektu trzeciego SQL'a.

wpiszmy taki przykładowy kod:

create generator uzytkownik;
set generator uzytkownik to 0;
create table uzytkownik(
 id integer not null primary key,
 nazwa varchar(20)
);
commit work;

w ten sposób utworzyliśmy generator (takie coś do zwiększania id; w innych bazkach działa to na zasadzie autoincrement), ustawiliśmy generator na zero i utworzyliśmy tabelę o kolumnach id i nazwa. pierwsza jest typu integer a druga jest tekstowa o długości łańcucha 20 znaków. i utworzyliśmy klucz główny którym jest id i nie może być pusty.

teraz dodamy ze dwóch trzech użytkowników. i przejdziemy do programowania w javie :) .

insert into uzytkownik (id, nazwa)
values
(gen_id(uzytkownik, 1), 'Beldzio');
insert into uzytkownik (id, nazwa)
values
(gen_id(uzytkownik, 1), 'Dziadzius');
insert into uzytkownik (id, nazwa)
values
(gen_id(uzytkownik, 1), 'Root');
commit work;

dodaliśmy trzech użytkowników którzy mają nadane automatycznie id (ten zapis gen_id(uzytkownik, 1) mówi żeby użyć wartości generatora użytkownik zwiększonej o jeden).

no to jeżeli mamy przykładową tabelkę to możemy pokusić się w javie o wyciągnięcie danych z niej :) i wyświetlenie.

Na początek trzeba jeszcze skonfigurować JCreatora do pracy ze sterownikiem jdbc InterBase'a.

W JCreatorze musimy dodać do zmiennych środowikowych (czyli do kompilatora) klasy które obsłużą sterownik jbdc InterBase'a.

Najpierw znajdźmy gdzie na dysku znajduje się plik o nazwie interclient.jar. Następnie w JCreatorze wchodzimy w Menu Configure, wybieramy Options w otwrtym oknie wybieramy JDK Profiles. Wybieramy nasz profil javy i dajemy edit. pokaże się nowe okno w którym dajemy add i z submenu wybieramy Add Archives. wskazujemy nasz plik interclient.jar i klikamy ok tak długo aż nie trafimy do naszego okna głównego. Już możemy korzystać ze sterownika jdbc w naszym programie :)

no to zaczynamy. na początek trzeba pobrać podstawowe definicje sql z których skorzystamy, więc wpisujemy na początku pliku

import java.sql.*;

teraz trzeba nazwać klasę w której będziemy tworzyć. zwracam szczególną uwagę na nazwanie klasy dokładnie tak jak nazywa się plik w którym tworzymy. dla przykładu gdzy plik nazwalismy oko.java to musimy klasę nazwać oko (ze zwróceniem uwagi na wielkość liter).

tworzymy więc podstawowyszkielet klasy

public class InterbaseTest2 {

}

jak wiadomo w każdej klasie wykonywalnej musi być podstawowa funkcja main. dodajemy więc szkielet tej funkcji

public class InterbaseTest2 {
   public static void main(String[] argv) {

  }
}

przy tak stworzonej klasie i funkcji głównej możemy próbować działać na naszej bazie danych. więc sprawdźmy czy w procesach działających u nas na maszynie jest proces o nazwie interserver. Jeżeli jest to znaczy że java będzie miała kontakt z naszą bazą danych.

Na początek spróbujemy sprawdzić czy sterownik rzeczywiście jest zarejestrowany i czy wszystko gra.

  System.out.println("Sprawdzanie czy sterownik jest zarejestrowany.");
  try 
  {
      Class.forName("interbase.interclient.Driver");
  } 
  catch (ClassNotFoundException cnfe) 
  {
    System.out.println("Nie można znaleźć sterownika!");
    System.out.println("Wypiszmy informację o błędzie i zakończmy.");
    cnfe.printStackTrace();
    System.exit(1);
  }

jak widać powyższy kod (instrukcje try...catch) spróbują sprawdzić czy mamy paczkę interclient.jar i czy można z niej skorzystać. Jeżeli operacja się nie powiedzie to zostanie zastosowane przechwycenie błędu i wypisanie kodu i opisu błędu.

następnie tworzymy połączenie z bazą danych. struktura takiego połączenia jest banalna.

Connection conn = DriverManager.getConnection( url, użytkownik, hasło);

jak widać składa się na to ciąg:

-ścieżka dostępu (url) - mająca postać jdbc//serwer:port/ścieżka_do zasobu

  • użtytkownik

  • hasło

w mioim przykładowym pliku najpierw sobie sformatowałem zmienną url a następnie ją podstawiłem.

String url = "jdbc:interbase://localhost:3050/d:/tescik.gdb";
  	Connection conn = DriverManager.getConnection( url, "SYSDBA", "haslo ktore ma admin oczywiście wam nie podam :D");

co trzeba dodać? porty można podawać 3050 albo 3060 na obydwóch działa. można również nie podawać portu, wtedy zostanie wybrany domyślny (3050 lub 3060) czyli ten, który będzie wolny.

teraz przygotujemy zapytanie jakim wyciągniemy nazwy wszystkich użytkowników z bazy danych tescik.

    String query = "SELECT nazwa from uzytkownik";
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(query);

przygotowaliśmy ttreśc zapytania, samo zapytanie i na końcu je wykonaliśmy.coś jeszcze trzeba tłumaczyć? niesądzę.

i teraz potrzeba nam wypisać wyniki na ekran :)

    while (rs.next()) 
    {
    	String Nazwa = rs.getString("nazwa");
    	System.out.println("Nazwa użytkownika " + Nazwa);
       }                            

działa to na zasadzie takiej że pętla sprawdza czy istnieje następny rekord jeżeli tak to go podstawia jako bieżący :). Następnie pobieramy Stringa i wypisujemy go na ekran :) ktoś kto pisał w php w ogóle nie powinien mieć problemów ze zrozumieniem.

W nastęnym odcinku powiem o pobieraniu danych innego typu :)

a teraz już pora na kod całego programu.


import java.sql.*;


public class InterbaseTest2 {
  
  public static void main(String[] argv) {
  System.out.println("Sprawdzanie czy sterownik jest zarejestrowany.");
  try 
  {
      Class.forName("interbase.interclient.Driver");
  } 
  catch (ClassNotFoundException cnfe) 
  {
    System.out.println("Nie można znaleźć sterownika!");
    System.out.println("Wypiszmy informację o błędzie i zakończmy.");
    cnfe.printStackTrace();
    System.exit(1);
  }
  System.out.println("Zarejestrowano sterownik. Wykonajmyu połączenie i proste zapytanie");
  try 
  {
    String url = "jdbc:interbase://localhost/d:/tescik.gdb";
    Connection conn = DriverManager.getConnection{                     url, "SYSDBA", "haslo ktore ma admin");    
    String query = "SELECT nazwa from uzytkownik";
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) 
    {
      String Nazwa = rs.getString("nazwa");
      System.out.println("Nazwa użytkownika " + Nazwa);}                            
     } 
     catch (SQLException se) 
     {
       System.out.println("Nie można się połączyć: wypisanie błedu i wyjście.");
       se.printStackTrace();
       System.exit(1);
     }
  }
}

na koniec jeszcze warto wspomnieć, że całe wyciąganie danych z bazy danych musi być ujęte w sekcji try....catch, na wypadek gdyby nie udało się wykonać zapytania. różne mogą być tego powody. dlatego przygotowujemy się na taką okoliczność.

w nastęnym odcinku opowiemy sobie o dodawaniu, aktualizowaniu i usuwaniu wpisów w bazie danych.

all rights reserved
copyright to jmail

//artykuł został napisany dla portalu 4programmers.net, jeżeli chcesz uzyskać kopię artykułu na swój serwis napisz [email protected]

7 komentarzy

a jak zrobić zapytanie z aliasami?
( potrzebuje rozroznic pola z roznych tabel)

dokłądnie te same sterowniki.

dla fb 1.x od IB 6
dla fb 2.x od ib 7

Witam,
a co z FireBird 1.x/2.x na osobnym serverze linux'a, jaki sterownik?

no przecież tak jest napisane :|

Zęby nie było domyślny użytkownik InterBase'a/Firebirda: sysdba z hasłem masterkey

;P i dobrze. miałeś się widzieć :D

widzę się :D