Bazy danych SQLite w Javie

Podobne dokumenty
Programowanie w języku Java. Bazy danych SQLite w Javie

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

Język SQL, zajęcia nr 1

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Wykład 05 Bazy danych

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Instrukcja 3 Laboratorium z Podstaw Inżynierii Oprogramowania

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Laboratorium nr 5. Bazy danych OpenOffice Base.

JAVA I BAZY DANYCH. MATERIAŁY:

Podejście obiektowe do relacyjnych baz danych Hibernate.

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski. Zaawansowane Systemy Decyzyjne. Laboratorium

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Wykład 5. SQL praca z tabelami 2

PODSTAWOWE POJĘCIA BAZ DANYCH

akademia androida Składowanie danych część VI

Przykładowa baza danych BIBLIOTEKA

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Wykład 8. SQL praca z tabelami 5

Programowanie komputerów. Wykład 10: Dostęp do baz danych z poziomu aplikacji Java. (JDBC Database Access)

Protokół JDBC współpraca z relacyjnymi bazami danych

Hibernate mapowanie baz danych

Zaawansowane aplikacje WWW - laboratorium

Db4o obiektowa baza danych wersja.net

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

JAVA bazy danych. na bazie: Język Java - Podstawy Programowania - Jacek Rumiński

JDBC (Java Database Connectivity vit )

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Programowanie w Ruby

Informatyka (5) SQL. dr inż. Katarzyna Palikowska Katedra Transportu Szynowego p. 4 Hydro

Podstawy otwartych języków programowania Java Database Connectivity (JDBC)

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

Bazy danych. Polecenia SQL

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Bartosz Jachnik - Kino

Wykład 5: PHP: praca z bazą danych MySQL

METODY PROGRAMOWANIA

Bazy danych - wykład wstępny

Podstawy technologii WWW

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Wykład 6. SQL praca z tabelami 3

Protokół JDBC współpraca z relacyjnymi bazami danych lab3

Autor: Joanna Karwowska

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Monika Sychla Daniel Smolarek Projekt bazy danych

Hibernate. 1. Wprowadzenie. 2. Uruchomienie dostarczonego przykładu. 3. Własny przykład.

Baza danych do przechowywania użytkowników

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

Iteracyjno-rozwojowy cykl oprogramowania cykl 2. Java Zofia Kruczkiewicz 1

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki

P o d s t a w y j ę z y k a S Q L

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Projektowanie systemów baz danych

Java Database Connectivity

Metody dostępu do danych

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5

PHP: bazy danych, SQL, AJAX i JSON

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Programowanie Obiektowe Java

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

NARZĘDZIA WIZUALIZACJI

Relacyjne bazy danych. Podstawy SQL

Podstawowe wykorzystanie Hibernate

Wprowadzenie do Doctrine ORM

Struktura drzewa w MySQL. Michał Tyszczenko

Metody Metody, parametry, zwracanie wartości

Hurtownia Świętego Mikołaja projekt bazy danych

Database Connectivity

Bazy danych. Dr inż. Paweł Kasprowski

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Projektowanie obiektowe. dr Jarosław Skaruz

Programowanie Obiektowe Java

LINQ TO SQL w dużym skrócie jest to zintegrowany język zapytao pozwalający na mapowanie relacyjnych baz danych na model obiektowy.

Paweł Cieśla. Dokumentacja projektu

Paweł Rajba

LAB 3 (część 1 Projektu)

WTYCZKA FARA-TCM Dane techniczne dla twórców zewnętrznych aplikacji do obsługi map cmentarza

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Bazy danych. dr inż. Arkadiusz Mirakowski

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

SIECI KOMPUTEROWE I BAZY DANYCH

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

Metody dostępu do danych

Instytut Mechaniki i Inżynierii Obliczeniowej fb.com/groups/bazydanychmt/

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

znaleźć wszystkie rekordy dotyczące adresów przy ulicy Hożej (dowolnego miasta!);

Transkrypt:

Bazy danych SQLite w Javie Wprowadzenie Pisząc coraz to bardziej złożone aplikacje często problemem staje się to, że nasze dane chcielibyśmy przechowywać w nieco bardziej elastyczny sposób, niż tylko w pamięci (czyli do zamknięcia aplikacji), lub jako pliki tekstowe na dysku twardym. Drugie rozwiązanie o ile w niektórych sytuacjach jest jak najbardziej w porządku, tak w przypadku przechowywania wielu danych powiązanych ze sobą informacji staje się po prostu niepraktyczne. W celu rozwiązania tego problemu stosuje się bazy danych, które pozwalają w uporządkowany sposób zarządzać wszystkimi informacjami, które są wynikiem jakichś działań, czy akcji użytkownika. W ostatnich latach zdecydowanie najpopularniejsze są relacyjne bazy danych, ponieważ o ile są dobrze zaprojektowane to pozwalają uniknąć redundancji (powtarzania się) tych samych danych oraz w łatwy sposób pozwalają tworzyć relacje (połączenia) pomiędzy różnymi danymi. W tej lekcji dowiesz się jak wykorzystać bazę SQLite do przechowywania danych. Niemal dokładnie tak samo możesz posługiwać się inną relacyjną bazą danych jak np MySQL (jedynie zmieniając sterownik i bibliotekę). SQLite posiada tę zaletę, że do jej działania nie musisz instalować serwera, co w przypadku MySQL nie jest już takie proste. SQLite jest również na licencji Public Domain co oznacza, że możesz ją wykorzystywać za darmo nawet w komercyjnych aplikacjach. 1. Co to jest baza danych Baza danych to dane (w przypadku bazy relacyjnej reprezentowane w postaci tabel) oraz relacje między nimi. Możesz dzięki niej stworzyć miejsce do przechowywania informacji na temat pewnego wycinka rzeczywistości, którym będzie np. fabryka, biblioteka, sklep itd. Każda tabela powinna zawierać tzw. klucz główny (czyli identyfikator), który jednoznacznie identyfikuje konkretny rekord z tej tabeli. Klucz główny może składać się z kilku elementów. Najprostsza tabela przechowująca informacje o imieniu i nazwisku osób będzie więc wyglądać w ten sposób: Najprostsza baza danych może składać się nawet z jednej tabeli, choć w takiej sytuacji dobrze jest się zastanowić, czy na pewno przyniesie nam to jakąś korzyść. Na potrzeby lekcji musimy jednak nieco skomplikować sobie życie i zobrazować działanie bazy SQLite na czymś troszkę bardziej złożonym - najlepiej będzie to pokazać na nudnym i oklepanym przykładzie biblioteki. Potrzebujemy w najprostszej formie przechowywać informacje o: Czytelnikach Książkach Wypożyczeniach (jaki czytelnik wypożyczył jaką książkę) Schemat naszej bazy danych będzie więc wyglądał w uproszczonej formie tak: Widzimy tutaj trzy tabele o których przed chwilą mówiliśmy. Ważne jest to, żeby rekordy były unikalne - u nas tę unikalność zapewniają różne id. W przypadku czytelnika mógłby to być PESEL (ale co wtedy z osobami, które np. nie są z Polski itp.). Nie jest to lekcja poświęcona projektowaniu baz danych, więc nie będziemy się zgłębiać w tę tematykę - z pewnością znajdziecie w sieci mnóstwo informacji na ten temat. Najciekawsza z naszych tabel jest tabela wypożyczenia - jak widać nie przechowuje ona informacji o czytelniku, ani o książce, posiada jedynie identyfikatory dzięki którym można się z niej odwołać do rekordów w tabelach czytelnicy i ksiazki. 1

2. Podstawy SQL Ćwiczenie to ma na celu pokazać wykorzystanie relacyjnej bazy SQLite w Javie, nie będzie więc w tym miejscu rozwijany poradnik dotyczący SQL. Każdy w razie potrzeby z pewnością poradzi sobie z odnalezieniem potrzebnych informacji w Internecie bądź w materiałach z poprzednich kursów. Wykorzystywane przez nas zapytania to: CREATE TABLE - do utworzenia odpowiednich tabel INSERT INTO - do umieszczania danych w tabelach SELECT - do "wyciągania" odpowiednich danych z bazy danych DELETE - do usuwania rekordów z bazy danych 3. SQLite JDBC w Javie - Konfiguracja Aby móc posługiwać się bazą SQLite w Javie potrzebujesz tak naprawdę tylko jednej rzeczy - biblioteki ze sterownikiem konkretnej bazy danych. Do tego celu posłuży nam JDBC Xerial, ponieważ jest stosunkowo szybka i po prostu niezawodna. Pobierz najnowszą wersję sterownika z poniższej strony): https://bitbucket.org/xerial/sqlite-jdbc/downloads/ Utwórz nowy projekt w eclipse, kliknij na niego prawym przyciskiem, wybierz Properties i przejdź do zakładki Java Build Path. Następnie w zakładce Libraries wybierz opcję Add External Jar i znajdź przed chwilą ściągnięty sterownik. 2

4. SQLite w akcji - przykład "Biblioteka" Pierwsze co musimy utworzyć to klasy "modelu". Przez model rozumiemy klasy, które mogą odwzorować elementy przechowywane w naszej bazie danych. Potrzebujemy więc klas: Czytelnik, Ksiazka, Wypozyczenie - dzięki temu będziemy mogli albo pobrać wszystkie rekordy z bazy danych przy starcie programu, lub robić to "w locie" bez potrzeby zastanawiania się "co przed chwilą wyciągnąłem z bazy danych?". Ksiazka.java package model; public class Ksiazka { private int id; private String tytul; private String autor; public int getid() { return id; public void setid(int id) { this.id = id; public String gettytul() { return tytul; public void settytul(string tytul) { this.tytul = tytul; public String getautor() { return autor; public void setautor(string autor) { this.autor = autor; public Ksiazka() { public Ksiazka(int id, String tytul, String autor) { this.id = id; this.tytul = tytul; this.autor = autor; @Override public String tostring() { return "["+id+"] - "+tytul+" - "+autor; 3

Czytelnik.java package model; public class Czytelnik { private int id; private String imie; private String nazwisko; private String pesel; public int getid() { return id; public void setid(int id) { this.id = id; public String getimie() { return imie; public void setimie(string imie) { this.imie = imie; public String getnazwisko() { return nazwisko; public void setnazwisko(string nazwisko) { this.nazwisko = nazwisko; public String getpesel() { return pesel; public void setpesel(string pesel) { this.pesel = pesel; public Czytelnik() { public Czytelnik(int id, String imie, String nazwisko, String pesel) { this.id = id; this.imie = imie; this.nazwisko = nazwisko; this.pesel = pesel; @Override public String tostring() { return "["+id+"] - "+imie+" "+nazwisko+" - "+pesel; 4

Wypozyczenie.java package model; public class Wypozyczenie { private int idksiazka; private int idczytelnik; public int getidksiazka() { return idksiazka; public void setidksiazka(int idksiazka) { this.idksiazka = idksiazka; public int getidczytelnik() { return idczytelnik; public void setidczytelnik(int idczytelnik) { this.idczytelnik = idczytelnik; public Wypozyczenie() { public Wypozyczenie(int idksiazka, int idczytelnik) { this.idksiazka = idksiazka; this.idczytelnik = idczytelnik; 5

Biblioteka.java - główna klasa do komunikacji z bazą danych package biblioteka; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.util.linkedlist; import java.util.list; import model.czytelnik; import model.ksiazka; public class Biblioteka { public static final String DRIVER = "org.sqlite.jdbc"; public static final String DB_URL = "jdbc:sqlite:biblioteka.db"; private Connection conn; private Statement stat; public Biblioteka() { Class.forName(Biblioteka.DRIVER); catch (ClassNotFoundException e) { System.err.println("Brak sterownika JDBC"); conn = DriverManager.getConnection(DB_URL); stat = conn.createstatement(); catch (SQLException e) { System.err.println("Problem z otwarciem polaczenia"); createtables(); public boolean createtables() { String createczytelnicy = "CREATE TABLE IF NOT EXISTS czytelnicy (id_czytelnika INTEGER PRIMARY KEY AUTOINCREMENT, imie varchar(255), nazwisko varchar(255), pesel int)"; String createksiazki = "CREATE TABLE IF NOT EXISTS ksiazki (id_ksiazki INTEGER PRIMARY KEY AUTOINCREMENT, tytul varchar(255), autor varchar(255))"; String createwypozyczenia = "CREATE TABLE IF NOT EXISTS wypozyczenia (id_wypozycz INTEGER PRIMARY KEY AUTOINCREMENT, id_czytelnika int, id_ksiazki int)"; stat.execute(createczytelnicy); stat.execute(createksiazki); stat.execute(createwypozyczenia); catch (SQLException e) { System.err.println("Blad przy tworzeniu tabeli"); return false; return true; 6

public boolean insertczytelnik(string imie, String nazwisko, String pesel) { PreparedStatement prepstmt = conn.preparestatement( "insert into czytelnicy values (NULL,?,?,?);"); prepstmt.setstring(1, imie); prepstmt.setstring(2, nazwisko); prepstmt.setstring(3, pesel); prepstmt.execute(); catch (SQLException e) { System.err.println("Blad przy wstawianiu czytelnika"); return false; return true; public boolean insertksiazka(string tytul, String autor) { PreparedStatement prepstmt = conn.preparestatement( "insert into ksiazki values (NULL,?,?);"); prepstmt.setstring(1, tytul); prepstmt.setstring(2, autor); prepstmt.execute(); catch (SQLException e) { System.err.println("Blad przy wypozyczaniu"); return false; return true; public boolean insertwypozycz(int idczytelnik, int idksiazka) { PreparedStatement prepstmt = conn.preparestatement( "insert into wypozyczenia values (NULL,?,?);"); prepstmt.setint(1, idczytelnik); prepstmt.setint(2, idksiazka); prepstmt.execute(); catch (SQLException e) { System.err.println("Blad przy wypozyczaniu"); return false; return true; public List<Czytelnik> selectczytelnicy() { List<Czytelnik> czytelnicy = new LinkedList<Czytelnik>(); ResultSet result = stat.executequery("select * FROM czytelnicy"); int id; String imie, nazwisko, pesel; while(result.next()) { id = result.getint("id_czytelnika"); imie = result.getstring("imie"); nazwisko = result.getstring("nazwisko"); pesel = result.getstring("pesel"); czytelnicy.add(new Czytelnik(id, imie, nazwisko, pesel)); catch (SQLException e) { 7

return null; return czytelnicy; public List<Ksiazka> selectksiazki() { List<Ksiazka> ksiazki = new LinkedList<Ksiazka>(); ResultSet result = stat.executequery("select * FROM ksiazki"); int id; String tytul, autor; while(result.next()) { id = result.getint("id_ksiazki"); tytul = result.getstring("tytul"); autor = result.getstring("autor"); ksiazki.add(new Ksiazka(id, tytul, autor)); catch (SQLException e) { return null; return ksiazki; public void closeconnection() { conn.close(); catch (SQLException e) { System.err.println("Problem z zamknieciem polaczenia"); Krótkie wyjaśnienie. W konstruktorze najpierw wywołujemy tę linię, odpowiedzialną za załadowanie sterownika do systemu: 1 Class.forName(Biblioteka.DRIVER); Później tworzymy połączenie z bazą danych: 1 conn = DriverManager.getConnection(DB_URL); jako argument metody przekazując String: 1 jdbc:sqlite:biblioteka.db Jak widać jest tutaj podany zarówno typ bazy danych jak i nazwa bazy danych, z której chcemy korzystać. Analogicznie korzystając z bazy MySql ten String wyglądałby następująco: 1 jdbc:mysql:sciezkadobazydanychmysql Dalej utworzyliśmy również obiekt klasy Statement - pozwala on na wykonywanie zapytań na podstawie zdefiniowanych Stringów. 8

Metoda createtables() tworzy nasz prosty schemat bazy danych (nie jest to kurs SQL, więc założeniem jest to, że większość z was wie co się tam dzieje - w ogólności tworzymy odpowiednie tabele i określamy typ danych jakie przechowują poszczególne kolumny w tabelach). Trzy metody typu insert, czyli insertczytelnik, insertksiazka, insertwypozycz służą do wprowadzania danych do bazy danych. Korzystamy w nich z pomocniczej klasy PreparedStatement, która pozwala stworzyć schemat zapytania jakie chcemy wykonać do bazy danych, i na podstawie tego schematu wypełnić odpowiednie wartości elementami przekazanymi jako argumenty metody. Ponieważ Java jest językiem czysto obiektowym jest to niesamowicie pomocna rzecz. Kolejne trzy metody, czyli selectczytelnicy, selectksiazki pozwalają wyciągnąć z bazy danych wszystkie informacje o czytelnikach oraz ksiażkach znajdujących się w systemie. Metodę selectwypozycz możecie traktować jako zadanie do samodzielnego przećwiczenia. Metody te zwracają listę wszystkich rekordów z danych tabel. Ostatnia metoda zamyka połączenie z bazą danych - jeśli kończymy działanie aplikacji, zawsze powinniśmy to zrobić. JdbcTest.java - klasa testowa import java.util.list; import model.czytelnik; import model.ksiazka; import biblioteka.biblioteka; public class JdbcTest { public static void main(string[] args) { Biblioteka b = new Biblioteka(); b.insertczytelnik("karol", "Maciaszek", "92873847182"); b.insertczytelnik("piotr", "Wojtecki", "89273849128"); b.insertczytelnik("abdul", "Dabdul", ""); b.insertksiazka("cień Wiatru", "Carlos Ruiz Zafon"); b.insertksiazka("w pustyni i w puszczy", "Henryk Sienkiewicz"); b.insertksiazka("harry Potter", "Joanne Kathleen Rowling."); List<Czytelnik> czytelnicy = b.selectczytelnicy(); List<Ksiazka> ksiazki = b.selectksiazki(); System.out.println("Lista czytelników: "); for(czytelnik c: czytelnicy) System.out.println(c); System.out.println("Lista książek:"); for(ksiazka k: ksiazki) System.out.println(k); b.closeconnection(); 9

Schemat aplikacji w eclipse powinien wyglądać następująco: Działanie aplikacji jest następujące: Tworzymy Bibliotekę (a w niej połączenie z bazą danych) Wstawiamy trzech czytelników oraz trzy książki do bazy danych Wyciągamy wszystkich czytelników oraz książki z bazy danych Wyświetlamy wyciągnięte dane. W wyniku działania programu powinniśmy otrzymać wydruk: 1 Lista czytelników: 2 [1] - Karol Maciaszek - 92873847182 3 [2] - Piotr Wojtecki - 89273849128 4 [3] - Abdul Dabdul - 5 Lista książek: 6 [1] - Cień Wiatru - Carlos Ruiz Zafon 7 [2] - W pustyni i w puszczy - Henryk Sienkiewicz 8 [3] - Harry Potter - Joanne Kathleen Rowling. Działanie aplikacji jest prymitywne, jednak pokazuje jak proste jest korzystanie z bazy danych sqlite w Javie. W ramach treningu polecam rozbudowę powyższej aplikacji i dodanie do niej funkcjonalności, która będzie pozwalała na interakcję z użytkownikiem - dodawanie nowych użytkowników, książek oraz informacji o wypożyczeniach. Zródło: https://javastart.pl/ 10