Twitter: @grzegg
Kategoria: java, Tagi: - - - - .

Java [40] – Java i baza danych (SQLite)

Wiele aplikacji, zwłaszcza te, które operują na większych ilościach danych wymaga wydajnego i wygodnego sposobu ich przechowywania. Z praktycznego punktu widzenia dobrze jest, jeśli umożliwi on dostęp do danych także spoza naszego programu. Kilka lekcji temu, pokazałem jak przechowywać dane w pliku tekstowym w formacie CSV. Często jest to bardzo dobre rozwiązanie, czasem jednak ze względu na ilości i rodzaj przechowywanych danych wygodniej jest użyć bardziej zaawansowanych rozwiązań jak bazy danych.

W tej lekcji pokażę jak utworzyć prostą bazę danych a także wykonać podstawowe czynności jak wstawianie, wyszukiwanie, zmiana i usuwanie danych. W naszym programie użyjemy systemu zarządzania bazami danych o nazwie SQlite, która nie wymaga instalacji serwera bazodanowego, jest więc wygodnym rozwiązaniem dla samodzielnych aplikacji. Zaznaczam, że nie będę tu omawiał języka SQL używanego w komunikacji z bazą ani omawiał teorii relacyjnych baz danych, do których należy SQLite. Trzeba jednak jasno powiedzieć, że jeśli chce się korzystać programistycznie z takich baz danych to trzeba tą wiedzę uzupełnić, przynajmniej w podstawowym zakresie.

Pobranie biblioteki sqlite-jdbc

p>Naszą przygodę z bazami danych zaczniemy od pobrania biblioteki sqlite-jdbc z repozytorium. Wybierz najnowszą wersję, w chwili pisania tej lekcji jest to plik sqlite-jdbc-3.8.10.1.jar. Pobrany plik .jar umieść w stosownym, czyli takim, które jest dla Ciebie wygodne, miejscu na swoim dysku a następnie dołącz go jako bibliotekę do nowo utworzonego projektu o nazwie JavaDB. O tym jak to zrobić pisałem tutaj.

Tworzenie bazy danych

Teraz umieść w klasie JavaDB kod:

Utworzona została metoda metoda polacz(), która jak sama nazwa wskazuje jest odpowiedzialna za połączenie z bazą danych o wskazanej nazwie. Jeśli tej bazy nie ma, to zostaje utworzona. Uruchom program i jeśli uzyskasz w terminalu komunikat:


Połączyłem się z bazą organizmy

to sprawdź zawartość katalogu z projektem. Powinien tam się pojawić plik organizmy.db


na razie jest on pusty.

Tworzenie tabeli

Teraz czas na utworzenie tabeli. Nie chcę tu omawiać szerzej samej zasady działania SQLite, napiszę tyle ile jest niezbędne do zrozumienia prezentowanego kodu. SQLite umożliwia tworzenie baz danych typu SQL. Przechowują one dane w tabelach, które składają się z rekordów a każdy z nich z pól o określonym typie (co do pewnego stopnia przypomina przechowywanie danych w obiektach w Javie). Stworzymy prostą tabelę przechowującą dane dotyczące organizmów, odpowiadającą tej, którą zapisywaliśmy w pliku csv.

W tamtym programie tworzyliśmy obiekty typu Takson, który przechowywał informacje o numerze taksonu, jego nazwie gatunkowej i rodzajowej, liczbie 2n oraz x.

Dodaj do projektu klasę Takson o odrobinę zmodyfikowanej treści:

Dodaj teraz metodę do pliku JavaDB, która będzie odpowiadała za tworzenie tabeli (trzeba też uzupełnić import) java.sql.Statement;:

Do metody main() trzeba rzecz jasna dodać odpowiednie wywołanie metody stworzTabele():


stworzTabele(polaczenie, baza);

Po uruchomieniu programu tabela zostanie utworzona w bazie danych, na co wskazuje zwiększona wielkość pliku organizmy.db, która wcześniej zajmowała 0 KB a teraz 3 KB. Jeśli chcesz sprawdzić zawartość bazy, możesz użyć na przykład któregoś z programów wymienionych na stronie Wikipedii poświęconej SQLite. Na przykład po otwarciu pliku bazy w programie SQLite Database Browser otrzymamy taki obrazek:


Kluczowym elementem w powyższym kodzie jest komenda w języku SQL odpowiadająca za utworzenie tabeli. Nie wnikając w szczegóły widać, że znajduje się tam polecenie utworzenia tabeli po którym następuje jej nazwa a później w parze nawiasów opisy poszczególnych pól zawierające ich nazwę, rodzaj przechowywanych danych i ewentualnie dodatkowe instrukcje (np. że nie może mieć zawartości NULL) . Pierwsze pole ID jest kluczowe nie tylko z nazwy, pozwala bowiem na jednoznaczną identyfikację rekordu. Jego zawartość musi być unikalna. Pola RODZAJ i GATUNEK przechowują ciąg do 50 znaków, N2 i X liczby całkowite a UWAGI dłuższy tekst.

Dodawanie danych

Skoro mamy tablicę, można już zakomentować wywołanie metody stworzTabele a następnie dodajmy jakieś dane. Najpierw stwórzmy odpowiednią metodę, która będzie przyjmowała jako argument obiekt typu Takson i umieszczała w tabeli dane przez niego przechowywane. Oczywiście pośrednictwo obiektu nie jest konieczne, można bezpośrednio umieszczać dane, w formie łańcucha znaków w poleceniu. Ponieważ w poniższym przykładzie końcowa forma komendy może nie być łatwa do odczytania z kodu, zostanie, w celach dydaktycznych, wyświetlona w terminalu, może ona wyglądać tak:

INSERT INTO organizmy (ID, RODZAJ, GATUNEK, N2, X, UWAGI) VALUES (3,'Amaranthus','bouchonii',52,13,'Sprawdzić dane!' );

A teraz kod wspomnianej metody:

Dodajmy też kod wywołujący tą metodę do metody main()

Możemy teraz sprawdzić, czy się udało:


Jeśli teraz ponownie spróbujesz uruchomić program, otrzymasz komunikat:


Nie mogę dodać danych UNIQUE constraint failed: organizmy.ID

Spowodowany jest tym, że próbujemy dodać rekord o takim samym kluczu co już istniejący a element, który jest kluczem musi być unikalny. Możesz usunąć plik z bazą danych, wtedy program wykona wszystko od nowa, albo usunąć/zakomentować polecenia dodawania rekordów.

Wyszukiwanie danych

Kolejnym podstawowym poleceniem używanym w bazach danych jest wyszukiwanie. Dodaj kolejną metodę do klasy JavaDB, nie zapominając o aktualizacji listy importowanych klas:

Metodę wywołamy w ten sposób:


szukaj(baza, "RODZAJ", "Acer");

Tu mamy dość prosty przykład wyszukiwania, gdy porównujemy zawartość jednego pola z wyszukiwanym tekstem na zasadzie równości, ale oczywiście są możliwe znacznie bardziej złożone zapytania, których jednak nie będziemy tu omawiać.

Wynik powinien wyglądać tak:


Wynik polecenia:
SELECT * FROM organizmy WHERE RODZAJ='Acer';
ID: 1
Rodzaj: Acer
Gatunek: negundo
2n: 26
x: 13
Uwagi: null
----------------------
ID: 2
Rodzaj: Acer
Gatunek: saccharinum
2n: 52
x: 13
Uwagi: null
----------------------

Modyfikacje danych

Następna metoda służy zmianie już istniejących rekordów.

Użyjemy jej do poprawienia zawartości pola UWAGI w rekordzie w którym pole ID jest równe 3. Trzeba w tym celu dopisać do metody main():

Po uruchomieniu programu otrzymamy:


Połączyłem się z bazą organizmy
Polecenie:
SELECT * FROM organizmy WHERE ID=='3';
ID: 3
Rodzaj: Amaranthus
Gatunek: bouchonii
2n: 52
x: 13
Uwagi: Sprawdzić dane!
----------------------
Polecenie zmiany:
UPDATE organizmy SET UWAGI = 'Dane sprawdzone' WHERE ID='3';
Polecenie:
SELECT * FROM organizmy WHERE ID=='3';
ID: 3
Rodzaj: Amaranthus
Gatunek: bouchonii
2n: 52
x: 13
Uwagi: Dane sprawdzone
----------------------

Jak widać udało się.

Usuwanie danych

Ostatni z podstawowych działań na bazie danych jest usuwanie rekordów.

Wywołamy ją tak:

Teraz w bazie znajdzie się tylko jeden gatunek z rodzaju Acer:


Wynik polecenia:
SELECT * FROM organizmy WHERE RODZAJ='Acer';
ID: 1
Rodzaj: Acer
Gatunek: negundo
2n: 26
x: 13
Uwagi: null
----------------------

Na koniec

Zauważ, że budowa czterech powyższych metod jest w sumie bardzo podobna, to co je różni to głównie treść polecenia SQL, które zostaje wywołane.

Kompletny kod pliku JavaDB.java

Jeśli zamierzasz pracować z bazą SQLite, warto poszerzyć jej znajomość we własnym zakresie. W Internecie dostępnych wiele tutoriali, na przykład pod adresem https://www.guru99.com/sqlite-tutorial.html.

2 komentarze Java [40] – Java i baza danych (SQLite)

Leave a Reply