Trochę czasu minęło od ostatniego wpisu. Nie mam nic na swoje usprawiedliwienie. W tym semestrze realizuję projekt z przedmiotu Programowanie Obiektowe. Używamy tam języka Java. Pomyślałem sobie, że zamiast chodzić na laboratoria, wezmę projekt i będę nad tym siedział w domu - jest okazja do nauki nowych rzeczy: obsługa bazy danych za pomocą JDBC i Sockety Java. Ma to być aplikacja klient-serwer umożliwiająca studentom rozwiązywanie udostępnianych przez nauczyciela testów. Przy tej okazji myślę, że naskrobię parę wpisów. Oto pierwszy z nich.
Przygotowania - czego potrzebujemy.
JDBC zapewnia połączenie pomiędzy Javą a relacyjną bazą danych, umożliwia przesyłanie do niej zapytań SQL. Nie narzuca nam z jakiej bazy musimy korzystać, dlatego oprócz systemu zarządzania bazą danych (DBMS) potrzebujemy sterowników JDBC (JDBC Driver), które możemy pobrać od dostawcy bazy danych.
My będziemy korzystać z systemu zarządzania bazą danych MySQL.
- Instalacja serwera MySQL
- Linux Możemy zainstalować wykonując polecenie:
- Windows Pobieramy i uruchamiamy plik instalacyjny. Pod tym systemem, aby dostać się do MySQL Monitora uruchamiamy program MySQL Command Line Client.
- Pobranie sterownika JDBC Pobierz MySQL Connector/J, czyli oficjalny sterownik JDBC dla MySQL
sudo apt-get install mysql-server
Polecam otworzenie tej całkiem fajnej ściągawki, szczególnie, jeśli jesteś początkującym adeptem technik zapytań SQL jak ja.
Logujemy się do serwera MySQL wydając w terminalu polecenie
mysql -u root -pPo parametrze -u podajemy nazwę użytkownika, a parametr -p mówi, że wymagane jest hasło. Nie podajemy po nim hasła, zostanie ono pobrane po zatwierdzeniu polecenia. Po udanym zalogowaniu w MySQL Monitorze możemy zrobić co chcemy - oczywiście o ile umiemy się posługiwać językiem SQL.
Tworzymy nowego użytkownika, ponieważ łączenie się do bazy użytkownikiem root nie jest zalecane. Nadajemy mu także prawa do łączenia się z bazą danych.
create user sqluser identified by 'secret'; grant usage on *.* to sqluser@localhost identified by 'secret';Następnie tworzymy naszą testową bazę danych oraz umożliwiamy do niej pełny dostęp użytkownikowi sqluser łączącemu się z localhost. Uaktualniamy prawa dostępu do bazy.
create database pgoralik_test;
grant all privileges on pgoralik_test.* to sqluser@localhost; flush privileges;Wyjdźmy i połączmy się nowo utworzonym użytkownikiem - tak dla testu. Następnie wybierzmy bazę danych na której chcemy operować.
use pgoralik_testUtwórzmy tabelę i dodajemy jakiś jeden rekord. Sprawdźmy czy się udało.
create table student (NumerIndeksu INT not null auto_increment primary key,
Imie VARCHAR(45),
Nazwisko VARCHAR(45),
GrupaDziekanska INT );
insert into student values(default, 'Jan', 'Kowalski', 21);
select * from student;
Myślę, że tyle wystarczy. Umiemy już utworzyć bazę danych dzięki narzędziom dostarczanym przez MySQL. Możemy też oczywiście te zapytania wysyłać z poziomu programu napisanego w Javie i w ten sposób tworzyć bazę. Ale skoro mamy już bazę, to nasz program będzie tylko z niej korzystał. Tworzymy aplikację korzystającą z bazy danych MySQL.
Mamy już pobrany sterownik JDBC. Musimy dodać go do projektu (Project->Properties->Java Build Path->Add external JARs).
Następnie tworzymy klasę MySQLTest, która korzystając z JDBC będzie wysyłać zapytania do utworzonej wcześniej bazy danych.
public class MySQLTest {
// Tworzymy połączenie z bazą danych
public Connection getConnection() throws SQLException {
conn = DriverManager.getConnection("jdbc:mysql://" + serverName + ":" + portNumber + "/" + databaseName +
"?useUnicode=true" +
"&characterEncoding=utf-8" +
"&user=" + userName +
"&password=" + password);
System.out.println("Connected to database " + databaseName);
return conn;
}
Connection databaseConnection;
String userName = "sqluser",
password = "secret",
serverName = "localhost",
portNumber = "3306",
databaseName = "pgoralik_test";
}
Dodajmy metodę, która pobierze wszystkie dane z danej tabeli.
// Wyświetl wszystkie dane z tabeli
void viewTable(String table) throws SQLException {
String query = "select NumerIndeksu, Imie, Nazwisko, GrupaDziekanska from " + databaseName + "." + table;
Statement stmt = null;
try {
stmt = databaseConnection.createStatement();
ResultSet rs = stmt.executeQuery(query);
// Dopóki zbiór wyników posiada jakieś dane to wypisuj
while (rs.next()) {
int numerIndeksu = rs.getInt("NumerIndeksu");
String imie = rs.getString("Imie");
String nazwisko = rs.getString("Nazwisko");
int grupa = rs.getInt("GrupaDziekanska");
System.out.println(numerIndeksu + "\t" + imie + "\t" + nazwisko + "\t" + grupa);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// Zamknij obiekt Statement, aby natychmiast zwolnić jego pamięć
if (stmt != null) { stmt.close(); }
}
}
Kod wydaje się mówić za siebie. Dorzućmy jeszcze zapis do bazy danych. W przypadku użycia zapytań insert, delete, update używamy Statement.executeUpdate(), który zwraca ilość zmodyfikowanych wierszy.
void insertNewStudent(String imie, String nazwisko, int grupa) throws SQLException {
String query = "insert into " + databaseName + ".student values(default, '" + imie + "','" + nazwisko + "'," + grupa + ")";
Statement stmt = null;
try {
stmt = databaseConnection.createStatement();
int rows = stmt.executeUpdate(query);
System.out.println("Zmodyfikowano " + rows + " wierszy");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// Zamknij obiekt Statement, aby natychmiast zwolnić jego pamięć
if (stmt != null) { stmt.close(); }
}
}
Teraz pozostało przetestować naszą klasę.
public static void main(String[] args) {
MySQLTest test = new MySQLTest();
try {
test.databaseConnection = test.getConnection();
test.viewTable("student");
test.insertNewStudent("Van", "Wilder", 123);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
}
Widać, że wieczny student został ujęty w spisie studentów, pewnie prędko z niego nie zniknie. W celu głębszego poznania JDBC zachęcam do zapoznania się z odpowiednim tutorialem java w linku poniżej.
Przydatne linki:
http://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html - połączenie z bazą danych i inne lekcje
http://www.pantz.org/software/mysql/mysqlcommands.html - ściągawka z zapytaniami SQL
Warto dodać, że zamiast MySQL można użyć też jego bardziej otwartego forka - MariaDB. Jest tworzony przez pierwotnych twórców MySQL, w pełni z nim kompatybilny, używa się go dokładnie tak samo i nie słychać o jakichś problemach wynikających z jego użycia.
OdpowiedzUsuńDzięki za uwagę. Szczerze mówiąc, nie rozglądałem się za różnymi możliwościami, bo mam z góry narzucone, że mam użyć MySQL. Rozumiem, że skoro MariaDB jest kompatybilny, to MySQL Connector/J też zapewni nam połączenie z tą bazą? Bo na ich stronie jakoś nie widzę czegoś takiego.
OdpowiedzUsuńTak powinno być, bo to jest "drop-in replacement" - wyrzucasz jedno, wrzucasz drugie. http://kb.askmonty.org/en/mariadb-versus-mysql
OdpowiedzUsuńHibernate nie zauważył różnicy. :)
Dzięki za wyjaśnienia :)
OdpowiedzUsuń