JDBC i MySql, trzy godziny później

W ramach nauki oczywiście przyszedł czas na bazę danych. Oczywiście na razie nie porywam się na poznawanie Hibernate, skoro często do końca jeszcze nie pamiętam samej składni języka. Jednakże w Javie zrobiono coś tak fajnego jak JDBC, a krótko mówiąc interfejs do łączenia się z bazą danych. W sieciowych tutorialach rzecz wyglądała pięknie, właśnie, wyglądała…

Po raz kolejny zostałem pokarany za podejście typowe dla programisty PHP – sklepiem kod i zacznie działać, a potem się rozszerzy i będzie dobrze. Niestety w przypadku Javy po raz kolejny okazało się, że jest to podejście zgubne i należałoby go zaniechać. Albowiem cóż można wyczytać w sieciowych tutorialach? Ano tyle, że operacje na bazie generalnie ogarniają klasy ze standardowej biblioteki z pakietu java.sql.*; lub javax.sql.*. Oczywiście zaimportowałem stosowne klasy, teraz trzeba dorzucić connector do MySQLa. Prawy klik na katalogu z bibliotekami w projekcie/add JAR/wskazanie ścieżki i już mamy śmigający connector. Można też zaimportować taki connector z pakietów, które dostarczane są razem z NetBeans, ale w sieci już jest nowsza wersja, której moje IDE jeszcze nie miało. Odpaliłem MySQLa jako proces, przezornie zalogowałem się na konsolę, no cóż, śmiga. No to teraz próbujmy połączyć się z bazą z poziomu kodu. ZONK!

W sieci znalazłem taki kod – była to część większego programiku zatem skopiowałem to, co w moim naiwnym mniemaniu powinno wystarczyć.


String driver = "com.mysql.jdbc.Driver";
Class.forName( driver );
String url = "jdbc:mysql://localhost/chlebik";
java.sql.DriverManager.getConnection( url, "root", "" );

Normalnie po kompilacji i uruchomieniu gdyby nie wywaliło błędu to znaczyłoby, że OK. No a tutaj problem, bo wciąż i wciąż kompilator mi mówi, że mam problem z wyjątkiem i by wyrzucić trzeba go wpierw przechwycić i takie tam. Myślę sobie, że jak sypie wyjątkami to znaczy, że pewnie nie ma klas do ich obsługi czyli coś nie bardzo mi łączy bibliotekę. I zaczęło się – grzebanie w CLASSPATH, grzebanie w NetBeans, rycie w Googlu. Rozwiązanie okazało się do bólu wręcz prozaiczne. Zgodnie ze swoją filozofią – koduj najszybciej jak możesz, nauczysz się lepiej po drodze – póki co nie dotarłem do zagadnienia wyjątków w Javie. I okazało się, że te w PHP to i owszem wyjątki, ale na tym podobieństwa się kończą. Zaawansowani w temacie pewnie właśnie leżą na podłodze ze śmiechu i kwiczą ze śmiechu (pozdrawiam), a tym mniej, dla których ten blog jest to wyjaśnię.

W Javie przy deklaracji klasy można wskazać, że dana klasa wyrzuca konkretny typ wyjątku(ów). Istnieje również możliwość wpisania takiej informacji w deklaracji metody. I jeśli jest to zadeklarowane w klasie/metodzie, wówczas jej wywołania muszą być wrzucone do bloku try…catch. Jeśli tego nie ma wywala błąd. Połączenie z serwerem baz danych przez JDBC również zadeklarowano jako wyrzucające odpowiedni wyjątek. Dlatego też kod musi wyglądać tak:


try {
String driver = "com.mysql.jdbc.Driver";
Class.forName( driver );
String url = "jdbc:mysql://localhost/chlebik";
java.sql.DriverManager.getConnection( url, "LOGIN", "HASLO" );
}
catch( Exception x ) {
x.printStackTrace();
}

No i z czymś takim wszystko pięknie działa. Jak widać zatem jeszcze trzeba się trochę douczyć zanim wezmę się na poważnie za pisanie pierwszej aplikacji. Jednakże z drugiej strony – mam już połączenie z bazą – pora pobawić się dalej.

Advertisements

8 thoughts on “JDBC i MySql, trzy godziny później

  1. yaotzin

    No wiesz ziom, ale PHP korzysta z udogodnień JAVA i C++. Więc takie rzeczy jak przechwytywanie wyjątków chyba nie powinno Cię zaskoczyć. Mi przejście z PHP na JAVA przychodzi z łatwością. Problemami nie są HIBERNATE (bo zawsze jeszcze nasuwa się pytanie czy nie można wykorzystać activeRecords itp) czy framework struts (dzięki niemu zrozumiałem naprawdę co to jest MVC) lub Spring bo to idzie opanować. Ale generalnie cała otoczka J2EE jest skomplikowana. To co pokazałeś z wyjątkami było co najmniej dziwne, jeśli dobrze pamiętam to ustawienie parsera PHP na STRICT będzie ci wywalać warningi i errory w momencie kiedy nie będziesz przechwytywał wyjątków itp. w PHP, zresztą jest to ustawienie zalecane przy ZEND FRAMEWORK. Napisz sobie prosty kod w PHP łączący się z bazą danych i wykorzystaj do tego PDO, przechwyć sobie PDOException i raz tego nie zrób czy PHP nie wywali ci odpowiednich komunikatów przy STRICT ?? PHP’owe podejście nie działą tutaj w jednym przypadku, nie trzeba za każdym razem odświeżać połączenia, gdyż jest cały czas trzymane od początku uruchomienia aplikacji i wywołania odpowiedniej metody. Dodatkowo linia x.printStackTrace(); wywali ci wszystko do standardowego strumienia diagnostycznego i dla programisty jest to ok. Ale dla użytkownika lepiej może zrobic coś takeigo Syste.out.println(“Error during create SQLConnection: “.concat(x.getMessage()));, lub prościej x.printStackTrace(System.out); oczywiście te ostatnie to moje rozważania i wcale one nie są lepsze :). Nie śmiałem się jak czytałem info związane z try{}catch{}, raczej zdzwiło mi że programista PHP zaskoczył się takim problemem 🙂 co ciekawe w dobie kiedy wymusza się na programistach PHP programowanie z wykorzystaniem OOPHP. Chociaż nie wiem czy samo try catch można zaliczyć jako synonim OO. Tyle mojej dygresji. Fajnie napisany artykuł, tylko proponowałbym najpierw się nauczyć jednego języka programowania porządnie i go wykorzystywać i później sobie skoczyć do czegoś nowego np. JAVA czy .NET będzie Ci o wiele łatwiej. Jak ja zacząłem studia z 6 lat temu niepodzielnie rządził C++ (od niego wszystko co związane z programowaniem u mnie się zaczęło :D), PHP dopiero się wybijało, a JAVA to był synonim żułwia, teraz mamy natłok wszystkiego i niewiadomo co wybrać. Dlatego lepiej zdecydować się na jeden i później przeskoczyć, będzie o wiele łatwiej. Już widzę Ciebie jak zaczniesz się interesować SuperJAVą pod nazwą Groovy i framework’iem GRAILS, a później skoczysz do C# bo jest to piękny język i zarazem prosty a do tego dojdzie jeszcze technologia .NET, no ale jeszcze PYTHON, RUBY JAVASCRIPT. Masakra wszystkiego się nie nauczysz, a może się okazać że będziesz pracował w zawodzie i zetkniesz się z jeszcze innym językiem (np. MAGIK słyszałeś o nim ??) i będzie Ci ciężko wskoczyć.

    Na marginesie nauka JAVA to dobry wybór i chyba lepszy niż PHP bo nauczysz się porawnego konsturowania kodu aplikacji, obiektowego bo JAVA to wymusza 🙂

    Pozdrawiam i sorki za tak długi komentarz, troszkę się wczułem, ale tak to już jest jak programowanie to twoja PASJA 🙂

  2. chlebik Post author

    Khem, ja pracuję jako programista PHP 🙂 W codziennej pracy piszę w OO, używam Zend Framework, jego całej funkcjonalności. Wiem co to są wyjątki, również ich używam. Ale jakoś nigdy podczas ponad 2 lat zabawy z PHP nie wyskoczył mi komunikat o KONIECZNOŚCI zaimplementowania w danym miejscu wyjątku. Oczywiście na developerskim ini_set na display_errors E_ALL.

    Dlatego też właśnie tutaj się naciąłem. Po prostu w JAVie implementacja w danym miejscu wyjątku jest wymuszana przez kompilator, w PHP (może się mylę, ale jakoś wątpię) nie jest.

  3. yaotzin

    Nie no to chyba jest problem związany z jakimś blockerem linków czy cóś… chciałem Ci pokazać to: w3schools.com/php/php_exception.asp

  4. yaotzin

    Tam chyba musisz ustawić jeszcze dla parsera, by parsował kod w standardzie STRICT, pełnej zgodności z PHP5 🙂 wówczas działa jak należy… a wszelkie funkcje depracated są ładnie wyrzucane na ekran. Normalnie piękne 😀 niczym JAVA

  5. Pingback: Grailsujemy z bazą, cz. II « Stronnice Chlebika

  6. anur

    Mam pytanie, czy w classpath trzeba jeszcze osobno ustawiać jakąś ścieżkę na potrzeby hibernate?
    Bo mi wywala błąd org.hibernate.MappingNotFoundException że nie może znależć pliku mapującego resource=”proj/Osoba.hbm.xml”.
    Plik hibernate.cfh.xml mam umieszczony w katalogu domyślnym src, a plik Osoba.hmb.xml w katalogu src/proj. Nie wiem dlaczego go nie widzi.
    Również gdy chce utworzyć plik mapujący z automatu w netbeans 6.5, to mi podaje że do sciezki projektu mam dodać sterownik bazy danych. A ten sterownik mam podany i normalnie przez jdbc jak wyżej moge się połączyć, a za pomocą hibernate nie.

  7. chlebik Post author

    Przyznam, ze nie mialem do tej pory z tym problemow, ale Hibernate uzywalem przez posrednictwo Grailsow, zatem tam mozliwe, ze framework poukladal sobie sam wszystko co trzeba. Zaniedlugo (moze wyrobie sie przed urlopem) opublikuje pierwsze kroki z JSF – konfiguracje z RichFaces i Hibernate, plus kod testujacy czy na pewno wszystko dziala, zatem zapraszam do sledzenia wpisow.

  8. anur

    Problem rozwiązany, hibernate już działa, chodziło o poprawną nazwę pliku mapujacego w hibernate.cfg.
    Choć dlaczego nie chcialo mi wygenerowac automatycznie tego pliku, gdy probowalem to zrobic za pomocą Hibernate Mapping files and POJOs, to nie wiem do teraz.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s