Programowanie w języku Java Bazy danych SQLite w Javie
Co to jest SQLite SQLite to bezserwerowa, nie wymagająca konfiguracji relacyjna baza danych. Znajduje szerokie zastosowanie np.. w systemie android oraz ios. Rozpowszechniana na licencji public domain, może być wykorzystywana bezpłatnie także do zastosowań komercyjnych.
Cechy bazy SQLite Cała baza znajduje się w jednym pliku Baza nie wymaga serwera Posiada wsparcie dla większości poleceń standardu SQL-92 Wspiera transakcje Wydajność jest porównywalna z systemami typu klient-serwer
SQLite nie wspiera Złączenia RIGHT JOIN i FULL OUTER JOIN ALTER TABLE wspierane tylko dla RENAME TABLE oraz ADD COLUMN Wspierane tylko wyzwalacze FOR EACH ROW Widoki dostępne są tylko w trybie READ ONLY Brak poleceń związanych z kontrolą dostępu FOREIGN KEY (klucz zewnętrzny, klucz obcy), czyli pole, którego wartość odpowiada kluczowi głównemu w innej tabeli
Typy kolumn W SQLite zdefiniowane są następujące klasy składowania danych: NULL INTEGER wartość jest liczbą całkowitą (ze znakiem) REAL wartość jest liczbą zmiennoprzecinkową TEXT wartość jest tekstowym łańcuchem znaków. Dopuszczalne kodowanie to UTF-8, UTF-16BE lub UTF-16-LE BLOB binarny obiekt danych
Typ danych jest związany z przechowywaną wartością a nie z typem kolumny. Typ wartości może być inny niż zadeklarowany typ kolumny podczas tworzenia tabeli. Zaleca się jednak zachowanie zgodności typu przechowywanych wartości z typem kolumny, ponieważ ma to wpływ na wydajność podczas sortowania.
Typy kolumn SQLite definiuje następujące typy kolumn: TEXT NUMERIC INTEGER REAL NONE
SQLite w Javie Aby móc korzystać z bazy danych SQLite w Javie, należy zainstalować sterownik jdbc dla bazy SQLite. Można go pobrać pod adresem: https://bitbucket.org/xerial/sqlite-jdbc
Dodawanie sterownika JDBC w środowisku Eclipse Aby dodać sterownik SQLite do projektu tworzonego w środowisku Eclipse należy 1. Kliknąć prawym przyciskiem w projekt na liście projektów 2. Wybrać pozycję properties 3. Kliknąć w pozycję Java build path 4. Przejść do zakładki libraries. 5. Kliknąć przycisk Add External JARs i wskazać lokalizację pobranego pliku sterownika.
Przykład W przykładzie stworzymy aplikację korzystającą bazy danych SQLite. Aplikacja będzie dodawać rekordy oraz wyświetlać listę dodanych rekordów z tabeli klient zawartej w bazie danych sklep.
1. Tworzenie klasy modelu Klasa modelu mapuje dane zawarte w tabeli na obiekty dostępne w programie. Tworzymy pakiet model a następnie dodajemy klasę Klient Każda właściwość klasy Klient powinna posiadać metodę getproperty oraz setproperty np. setimie(string imie), getimie()
package model; public class Klient { private int id; private String imie; private String nazwisko; 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 genazwisko() { return nazwisko; public void setautor(string nazwisko) { this.nazwisko = nazwisko; public Klient() { public Klient(int id, String imie, String nazwisko) { this.id = id; this.imie = imie; this.nazwisko = nazwisko; @Override public String tostring() { return "[" + id + "] - " + imie + " - " + nazwisko;
2. Klasa wykonująca operacje na bazie Tworzymy pakiet sklep a w nim klasę Sklep odpowiedzialną za nawiązanie połączenia z bazą oraz wykonywanie operacji na bazie danych.
package sklep; 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.klient; public class Sklep { public static final String DRIVER = "org.sqlite.jdbc"; public static final String DB_URL = "jdbc:sqlite:sklep.db"; private Connection conn; private Statement stat; public Sklep() { try { Class.forName(Sklep.DRIVER); catch (ClassNotFoundException e) { System.err.println("Brak sterownika JDBC"); e.printstacktrace(); try { conn = DriverManager.getConnection(DB_URL); stat = conn.createstatement(); catch (SQLException e) { System.err.println("Problem z otwarciem polaczenia"); e.printstacktrace(); createtables();
Konstruktor klasy Sklep inicjalizuje sterownik jdbc a następnie nawiązuje połączenie z bazą danych. Tworzony jest także obiekt klasy Statement, pozwalający na wykonywanie zapytań do bazy danych, za pomocą metody execute(). W kolejnych liniach wywoływana jest metoda createtables, która tworzy tabele w bazie danych.
Metoda insertklinent(string imie, String nazwisko), wstawia do tabeli rekord z danymi przekazanymi jako parametry. Tworzony jest obiekt klasy PreparedStatement, który przygotowuje zapytanie do wykonania. Zapytanie jest prekompilowane przed wykonaniem co przyspiesza operację dodawania rekordu.
public boolean createtables() { String createklient = "CREATE TABLE IF NOT EXISTS klient (id INTEGER PRIMARY KEY AUTOINCREMENT, imie varchar(255), nazwisko varchar(255))"; try { stat.execute(createklient); catch (SQLException e) { System.err.println("Blad przy tworzeniu tabeli"); e.printstacktrace(); return false; return true; public boolean insertklient(string imie, String nazwisko) { try { PreparedStatement prepstmt = conn.preparestatement( "insert into klient values (NULL,?,?);"); prepstmt.setstring(1, imie); prepstmt.setstring(2, nazwisko); prepstmt.execute(); catch (SQLException e) { System.err.println("Blad przy wstawianiu rekordu"); System.out.println(e.getMessage()); return false; return true;
public boolean insertklient(string imie, String nazwisko) { try { PreparedStatement prepstmt = conn.preparestatement( "insert into klient values (NULL,?,?);"); prepstmt.setstring(1, imie); prepstmt.setstring(2, nazwisko); prepstmt.execute(); catch (SQLException e) { System.err.println("Blad przy wstawianiu rekordu"); System.out.println(e.getMessage()); return false; return true; public List<Klient> selectklienci() { List<Klient> klienci = new LinkedList<Klient>(); try { ResultSet result = stat.executequery("select * FROM klient"); int id; String imie, nazwisko; while(result.next()) { id = result.getint("id"); imie = result.getstring("imie"); nazwisko = result.getstring("nazwisko"); klienci.add(new Klient(id, imie, nazwisko)); catch (SQLException e) { e.printstacktrace(); return null; return klienci; public void closeconnection() { try { conn.close(); catch (SQLException e) { System.err.println("Problem z zamknieciem polaczenia"); e.printstacktrace();
Metoda selectklienci() zwraca listę rekordów z tabeli w postaci kolekcji LinkedList. Metoda executequery tworzy obiekt resultset zawierający wyniki zapytania. Następnie za pomoca pętli while tworzone są nowe obiekty klasy klient i dodawane do kolekcji która jest na końcu zwracana.
public boolean deleteklient(int id) { try { PreparedStatement prepstmt = conn.preparestatement( "DELETE FROM klient WHERE id =?;"); prepstmt.setint(1, id); prepstmt.execute(); catch (SQLException e) { System.err.println("Blad przy usuwaniu rekordu"); System.out.println(e.getMessage()); return false; return true; Metoda delete klient usuwa wybranego klienta na podstawie numeru id przekazanego jako parametr.
Metoda closeconnection() zamyka połączenie za bazą danych.
3. Główna klasa programu W folderze src tworzymy klasę Main w której, stworzymy odpowiednie obiekty, dodamy rekordy do tabeli a następnie wyświetlimy ich listę.
import java.util.list; import model.klient; import sklep.sklep; public class Main { public static void main(string[] args) { Sklep b = new Sklep(); b.insertklient("jan", "Kowalski"); b.insertklient("marcin", "Nowak"); b.insertklient("adam", "Małysz"); List<Klient> klienci = b.selectklienci(); System.out.println("Lista klientów: "); for(klient k: klienci) System.out.println(k); b.closeconnection();
Struktura projektu