Sunteți pe pagina 1din 63

Proiectarea aplicațiilor orientate

obiect
Curs 11 – SQLite

J
J Acest curs
› Introducere baze de date
› SQLite
J Definitii
› Bază de date (BD sau eng. DB )- ansamblu structurat de date înregistrat
pe suporturi accesibile calculatorului pentru a satisface simultan cerintele
mai multori utilizatori intr-un mod selectiv şi în timp util.
› Sistem de gestiune a bazelor de date (SGBD sau eng. DBMS) -
ansamblul de programe care permit utilizatorului sa interacţioneze cu o
bază de date.
J Introducere
› Regulile şi conceptele care permit descrierea structurii unei BD formează
modelul datelor. În timp au fost definite trei astfel de modele:
– Modelul ierarhic în care datele erau organizate sub forma unui arbore, nodurile
constând din înregistrari iar arcele referinte catre alte noduri.
– Modelul retea în care datele erau organizate sub forma unui graf orientat. Nodurile
şi arcele au aceeasi semnificaţie ca mai sus.
– Modelul relaţional în care, intuitiv, datele sunt organizate sub forma de tabele.
› Termenul de relaţie (care da denumirea modelului) provine din
matematica iar reprezentarea intuitiva a unei relaţii este o tabela.
› În cazul modelului relaţional descrierea structurii unei baze de date
consta în principal din descrierea tabelelor componente:
– denumire,
– lista de coloane
– tipul datelor din acestea.
J Introducere – constrangeri de integritate
› Descrierea poate include informaţii despre
– elementele de identificare ale înregistrarilor dintr-o tabela (cheie primara)
– coloanele comune cu alte tabele (chei straine)
– alte restricţii şi verificari de corectitudine pentru datele stocate.
› Aceste informaţii sunt cunoscute sub numele generic de constrangeri de
integritate
› Gestiunea utilizatorilor - Un SGBD trebuie sa permita crearea,
modificarea şi stergerea utilizatorilor. Operaţia este efectuata de obicei
de administratorul bazei de date.
› Concurenta la date - În cazul accesului simultan al mai multor utilizatori
la aceleasi date un SGBD trebuie sa aiba mecanisme pentru a
preintampina inconsistenta datelor
J Introducere – constrangeri de integritate
› Fie o portiune a bazei de date, notata A, în care se tine numarul de locuri
disponibile la o cursa aeriana şi doua executii ale unui program de
rezervare rulat de doua agentii de bilete diferite. Ele contin secventa:
› Read A /* se citeste numarul de locuri disponibile din BD */
› A = A – 1 /* se decrementează cu o unitate */
› Write A /* se scrie noul numar de locuri disponibile în BD */
Moment AG.1 AG.2 A in BD
T1 Read A 10
T2 Read A 10
T3 A=A–1 10
T4 A=A–1 10
T5 Write A 9
T6 Write A 9
J Introducere – constrangeri de integritate
› Orice SGBD are mecanisme prin care diversilor utilizatori sau categorii
de utilizatori li se asociaza drepturi de acces specifice la obiectele bazei
de date.
› În acest mod fiecarui utilizator i se da dreptul de a efectua doar operaţiile
specifice activitaţii sale şi doar pe acea portiune a bazei de date care
este necesara pentru acestea.
› Blocarea accesului unor categorii de utilizatori la date pe care nu
trebuie sa le acceseze. În acest fel este asigurata una dintre funcţiunile
de baza ale unui SGBD şi anume confidentialitatea datelor.
› Blocarea accesului unor categorii de utilizatori la date de care nu au
nevoie în activitatea lor, minimizându-se astfel riscul distrugerii
accidentale a datelor prin operaţii necorespunzatoare.
J
› În cazul bazelor de date de dimensiuni mari este evident ca orice
cautare care s-ar baza pe o parcurgere secventiala a înregistrarilor din
tabele ar duce la timpi de raspuns inadecvat de mari.
› De asemenea, operaţii mai complicate prin care se regasesc date
stocate în mai multe tabele legate intre ele prin coloane comune pot
duce în lipsa unor algoritmi specifici la timpi de executie
inacceptabili.
› De aceea orice SGBD are mecanisme prin care minimizează timpul de
raspuns, mecanisme bazate în special pe indecşi şi modalităţi specifice
de organizare fizica a datelor.
J Functiile unui SGBD
› Descrierea datelor
› Utilizarea datelor
› Integritatea datelor
› Confidentialitatea datelor
› Accesul concurent la date
› Siguranta în funcţionare
J Descrierea datelor
› Un SGBD trebuie sa includă posibilitatea descrierii structurii
obiectelor care formează baza de date. În cazul bazelor de date
relaţionale aceasta consta în principal în posibilitatea creerii şi modificării
structurii tabelelor şi constrangerilor de integritate asociate acestora.
› Limbajul prin care se realizează aceste operaţii se numeste Limbaj de
Descriere a Datelor (LDD) şi în cazul primelor sisteme de gestiune el
era implementat sub forma unor module separate. În sistemele
relaţionale bazate pe SQL aceste operaţii au fost incluse în limbaj sub
forma comenzilor de tip CREATE (pentru creare) sau ALTER
(modificare).
J Utilizarea datelor
› Aceasta funcţie include operaţiile de lucru cu datele înregistrate intr-o
bază de date.
› Exista patru categorii de operaţii principale:
– Inserarea de noi date. Aceasta se concretizează prin adaugarea de noi linii în
tabelele care formează baza de date.
– Stergerea de linii din tabele.
– Actualizarea datelor, insemnând modificarea continutului unor linii existente în
tabele.
– Regasirea datelor dupa anumite criterii de cautare
J SQLite
› SQLite este o librarie software ce implementeaza un motor de baze
de date SQL , independent, fara server si fara configurari
› Este cel mai raspandit motor de baze SQL de date din lume
› De ce am folosi
– Nu necesita existenta unu server de baze de date pentru a functiona
– Nu sunt necesare configurari de setup si administrare
– Este stocata intr-un singur fisier cu mici dimensiuni
– Independenta (fara dependinte externe)
– Limbajului de interogare SQL2 standard
– Este scris in C si furnizeaza un API usor de folosit
J Limitari
› Caracteristici ale SQL92 care nu sunt suportate de SQLite:
– RIGHT OUTER JOIN
– FULL OUTER JOIN
– Trigger support
– VIEWs
– GRANT and REVOKE
J Comenzi disponibile
› DDL - Data Definition Language
– CREATE – creaza o noua tabela, view sau un alt obiect in baza de date
– ALTER – modifica un obiect existent sau o tabela
– DROP – sterge o tabela intreaga, un view al unei tabele sau orice alt obiect in
baza de date
› DML - Data Manipulation Language
– INSERT – creaza o inregistrare
– UPDATE – modifica inregistrari
– DELETE – sterge inregistrari
› DQL - Data Query Language
– SELECT – obtine inregistrari din una sau mai multe tabele
J SQLite Statements
› ANALYZE - Obtine informatii statistice despre tabele si indici
ANALYZE;
or
ANALYZE database_name;
or
ANALYZE database_name.table_name;

› AND/OR - Permite existenta mai multor conditii


SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION-1 {AND|OR} CONDITION-2;

› ALTER TABLE – modifica o tabela

ALTER TABLE table_name ADD COLUMN column_def...;


J SQLite Statements
› ATTACH DATABASE – atasarea unei baza de date programului astfel incat
interogarile SQL sa aiba loc asupra respectivei baze de date
ATTACH DATABASE 'DatabaseName' As 'Alias-Name';

› BEGIN TRANSACTION – pentru fiecare comanda sunt start-ate procese,


tranzactiile sunt efectuate automat
BEGIN;
or
BEGIN EXCLUSIVE TRANSACTION;

› BETWEEN – obtinerea unor valori dintr-o gama


SELECT column1, column2....columnN
FROM table_name
WHERE column_name BETWEEN val-1 AND val-2;
J SQLite Statements
› COMMIT – inchide transactia curenta efectuand modificarile in baza de
date COMMIT;
› CREATE INDEX – creaza un index pentru o regasire mai usoara a
informatiei
CREATE INDEX index_name
ON table_name ( column_name COLLATE NOCASE );

› CREATE UNIQUE INDEX – creaza un idex unic (nu sunt incluse


inregistrarile duplicate)
CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);
J SQLite Statements
› CREATE TABLE – creare tabele in baza de date
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);
› CREATE TRIGGER – obiect al bazei de date asociat unei tabele si care se
activeaza la aparitia unui eveniment particular (insert, update, delete)
CREATE TRIGGER database_name.trigger_name
BEFORE INSERT ON table_name FOR EACH ROW
BEGIN
stmt1;
stmt2;
....
END;
› CREATE VIEW – creaza un view (compozitia unei tabele in forma unei
interogari SQL predefinite
J CREATE VIEW database_name.view_name AS
SELECT statement....;

› CREATE VIRTUAL TABLE - avand in vedere ca tabelele pot fi read only,


se creaza o tabela virtuala care poate simula stocarea datelor
CREATE VIRTUAL TABLE database_name.table_name USING weblog( access.log );
or
CREATE VIRTUAL TABLE database_name.table_name USING fts3( );

› COUNT – clauza count returneaza numarul de inregistrari (rows) conform


conditiei
SELECT COUNT(column_name)
FROM table_name
WHERE CONDITION;
› DELETE – sterge inregistrari
DELETE FROM table_name
WHERE {CONDITION};
› DETACH DATABASE – detasarea unei baze de date („ruperea conexiunii”)
DETACH DATABASE 'Alias-Name';

J › DISTINCT – clauza distinct returneaza rezultate distincte


corespunzatoare unui SQLite Statement
SELECT DISTINCT column1, column2....columnN
FROM table_name;

› DROP INDEX –renuntarea la un index anterior creat


DROP INDEX database_name.index_name;

› DROP TABLE – stergerea unei tabele


DROP TABLE database_name.table_name;

› DROP VIEW – stergerea unui view


DROP INDEX database_name.view_name;
› EXISTS – clauza ce returneaza true or false daca conditia este
indeplinita SELECT column1, column2....columnN
J FROM table_name
WHERE column_name EXISTS (SELECT * FROM table_name );

› GLOB – clauza permite precizarea unui patern in interogare


SELECT column1, column2....columnN
FROM table_name
WHERE column_name GLOB { PATTERN };

› GROUP BY – clauza permite agregarea datelor intr-un singur rand (row)


cu scopul de a reduce numarul inregistrarilor
SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name;
› HAVING – clauza precizeaza o conditie de cautare intr-un grup (se
utilizeaza in combinatie cu GROUP BY)
J SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name
HAVING (arithematic function condition);

› INSERT INTO – utilizata pentru a adauga noi inregistrari intr-o tabela


INSERT INTO table_name( column1, column2....columnN)
VALUES ( value1, value2....valueN);

› IN – clauza IN ajuta la reducerea numarului de conditii OR intr-o


interogare SQL
SELECT column1, column2....columnN
FROM table_name
WHERE column_name IN (val-1, val-2,...val-N);
› Like – clauza permite interogarea inregistrarilor folosind wildcard
characters
J SELECT column1, column2....columnN
FROM table_name
WHERE column_name LIKE { PATTERN };

› NOT IN – clauza permite selectarea inregistrarilor care nu satisfac


conditia interogarii SQL
SELECT column1, column2....columnN
FROM table_name
WHERE column_name NOT IN (val-1, val-2,...val-N);

› ORDER BY – clauza permite sortarea rezultatelor unei interogari SQL


SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION
ORDER BY column_name {ASC|DESC};
› REINDEX – sterge si recreaza un index
REINDEX collation_name;
REINDEX database_name.index_name;
J REINDEX database_name.table_name;

› SELECT – interogare SQL pentru a obtine date din baza de date sub
forma unei tabele
SELECT column1, column2....columnN
FROM table_name;

› UPDATE – utilizat pentru modificarea unor inregistrari existente intr-un


tabel pentru o coloana specifica
UPDATE table_name
SET column1 = value1, column2 = value2....columnN=valueN
[ WHERE CONDITION ];

› WHERE – clauza este folosita pentru a impune conditii unei comenzi


SELECT SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION;
DB Browser for SQLite
J › Utilitar visual open source pentru crearea, proiectarea si editarea
fisierelor compatibile SQLite.
› Este folosit de utilizatori si programatori
› Permite:
– Crearea fisierelor baza de date
– Crearea, definirea, modificarea si stergerea tabelelor
– Crearea, definirea si stergerea indecsilor
– Navigarea, editarea, adaugarea si stergerea inregistrarilor
– Cautarea inregistrarilor
– Importarea si exportarea inregistrarilor ca text
– Importarea si exportarea tabelelor din/in fisiere CSV
– Importarea si exportarea bazelor de date din/in fisiere SQL dump
– Executa interogari SQL si vizualizeaza rezultatele
– Nu necesita cunoasterea comezilor SQL
› https://download.sqlitebrowser.org/DB.Browser.for.SQLite-3
.11.2-win64.msi
J
J Instalarea driverului SQLite
› Descarcati sqlite-jdbc-(VERSION).jar

› https://jar-download.com/artifacts/org.xerial/sqlite-jd
bc/3.8.11.2/source-code

› Adaugati fisierul in classpath:


J
J
J
J
J
J
J Conectarea la o baza de date
import java.sql.*;

public class Main {

public static void main(String[] args) {


Connection c = null;

try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:paooL10.db");
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
System.out.println("Opened database successfully");
}
}
J Stabilirea unei conexiuni cu baza de date
› Importarea pachetelor JDBC
› Inregistrarea driverului JDBC
› Formularea adresei bazei de date
› Crearea unui obiect conexiune
J Importarea pachetelor JDBC
import java.sql.* ; // for standard JDBC programs
J Inregistrarea driverului JDBC
› Metoda I – Class.forName()
› Metoda II – DriverManager.registerDriver()
J Class.forName("org.sqlite.JDBC");
› La crearea unei instante a unei clase folosind operatorul new se realizeaza:
– Incarcarea clasei respective in memorie daca nu este incarcata (crearea reprezentarii in
memorie a clasei respective din fisierul .class corespunzator astfel incat o instanta sa poata fi
creata. Include si initializarea variabilelor
– Crearea instantei clasei respective si stocarea adresei intr-o referinta

› Class.forName(…) realizeaza doar primul lucru, incarca clasa in memorie si


intoarce referinta respectiva ca o instanta a Class. Crearea instantei se poate
realiza invocand metoda newInstance()
› Avantajul oferit de Class.forName() este acela ca poate accepta numele clasei
ca argument String astfel incat numele clasei poate fi furnizat in mod dinamic
› Implicit, initializeaza toti membri statici ai clasei si blocurile statice
› Motivul pentru care un driver jdbc este incarcat folosind Class.forName() este
acela ca driverul poate fi schimbat dinamic. Astfel la apelul
Class.forName(“org.sqlite.JDBC”) driver-ul clasei va fi incarcat, instantiat si
inregistrat cu DriverManager
J Class.forName("org.sqlite.JDBC");
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
System.exit(1);
}
› Exemplul de mai sus incarca automat driverul clasei in memorie si il
inregistreaza
J DriverManager.registerDriver()
› Aceasta abordare se recomanda atunci cand se foloseste un JDK
care nu este compliant JVM (precum cel furnizat de Microsoft)
› Exemplul urmator ilustreaza inregistrarea unui driver Oracle
try {
Driver myDriver = new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver( myDriver );
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
System.exit(1);
}
J Formularea unui URL al bazei de date
› Pentru stabilirea unei conexiuni DriverManager expune 3 supraincarcari
ale metodei getConnection()
getConnection(String url)
getConnection(String url, Properties prop)
getConnection(String url, String user, String password)

› Fiecare necesita adresa URL (Uniform Resource Locator) a bazei de


date formulata functie de tipul acesteia
RDBMS JDBC driver URL format
MySQL com.mysql.jdbc.Driver jdbc:mysql://hostname/databaseName
ORACLE oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@hostname:port
Number:databaseName
DB2 COM.ibm.db2.jdbc.net.DB2Driver jdbc:db2:hostname:port Number/databaseName
Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:hostname: port
Number/databaseName
SQLite org.sqlite.JDBC jdbc:sqlite:test.db
J Crearea unei conexiuni
› Interfata Connection – conexiune (sesiune) cu o baza de date specifica
› Interogarile SQL sunt executate iar rezultatele sunt returnate in contextul
unei conexiuni
› Un obiect Conection al unei baze de date furnizeaza informatii ce
descriu tabelele, gramatica SQL suportata, procedurile de stocare,
capabilitatile conexiunii etc.
› Implicit Connection efectueaza automat modificarile dupa executia
fiecarei comenzi
› Daca “auto commit” este dezactivat, un commit explicit trebuie executat
altfel modificarile nu vor fi salvate in baza de date
Connection c = DriverManager.getConnection("jdbc:sqlite:test.db");

› Daca fisierul exista baza de date va fi deschisa altfel va fi creata


J Inchiderea unei conexiuni
› La finalul unui program se recomanda inchiderea explicita a tuturor
conexiunilor
› In caz contrar, garbage collector va inchide conexiunea dar nu se
recomanda aceasta practica.


c.close();
J Crearea unei tabele
› Odata conexiunea stabilita se poate interactiona cu baza de date
› Interfetele Statement, CallableStatement si PreparedStatemen
definesc metode si proprietati ce permit trimiterea de comenzi SQL si
receptia datelor din baza de date
Interfata Recomandare
Statement General-purpose acces la baza de date
Util cand se folosest statements SQL statice la runtime
Nu accepta parametri
PreparedStatement Util atunci cand se folosesc multe statement-uri
Accepta parametri la runtime
CallableStatement Util atunci cand se doreste executia unor proceduri
J Obiecte Statement
› Creare:

Statement stmt = null;


try {
stmt = conn.createStatement( );
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}
J Obiecte Statement
› Utilizare:
– boolean execute(String SQL); - return true dacă un obiect ResultSet poate fi
obtinut si false altfel. Se va folosi pentru executie SQL DDL (Data Definition
Language) statements (statements care modifica structura bazei de date: creare,
stergere, modificare sau cea a obiectelor: tabele, view-uri)
– int executeUpdate(String SQL); - returneaza un numar de inregistrari (rows)
corespunzator executiei SQL statement. Se va folosi aceasta metoda atunci cand un
numar de inregistrari vor fi afectate, ex: INSERT, UPDATE, DELETE
– ResultSet executeQuery(String SQL); - returneaza un obiect ResultSet. Se
va folosi aceasta metoda atunci cand ne asteptam ca rezultatul sa fie un result set in
urma unui SELECT statement
› Inchidere:
– Asa cum o conexiune trebuie inchisa pentru a salva resursele bazei de date, in
acelasi mod un obiect statement trebuie inchis: stmt.close();
– Inchiderea unei conexiuni determina si inchiderea unui statement, totusi aceasta
practica nu se recomanda si inchiderea trebuie facuta explicit.
import java.sql.*;
public class Main {
public static void main(String[] args) {
J Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:company.db");
stmt = c.createStatement();
String sql = "CREATE TABLE COMPANY " +
"(ID INT PRIMARY KEY NOT NULL," +
" NAME TEXT NOT NULL, " +
" AGE INT NOT NULL, " +
" ADDRESS CHAR(50), " +
" SALARY REAL)";
stmt.executeUpdate(sql);
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
System.out.println("Table created successfully");
}
J
J Operatia INSERT
› Se vor crea obiecte String cu statement-uri (comenzi) SQL si se vor
executa (stm.executeUpdate(sql);)
› Conexiunile sunt in mod implicit in modul auto commit. Se recomanda ca
SQL statements sa fie grupate in tranzactii si finalizate prin apelul
commit() sau sterse si revenire la starea anterioara cu rollback()
import java.sql.*;
public class Main {
public static void main(String[] args) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:company.db");
c.setAutoCommit(false);
stmt = c.createStatement();
… … …
String sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
"VALUES (1, 'Paul', 32, 'California', 20000.00 );";
J stmt.executeUpdate(sql);
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
"VALUES (2, 'Allen', 25, 'Texas', 15000.00 );";
stmt.executeUpdate(sql);
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
"VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );";
stmt.executeUpdate(sql);
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
"VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
stmt.executeUpdate(sql);
stmt.close();
c.commit();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
System.out.println(“Records created successfully");
}
}
J
J Operatia SELECT
› Un obiect ResultSet mentine un cursor ce pointeaza catre inregistrarea
curenta (row data)
› Initial cursorul este pozitionat inainte de prima inregistrare
› Metoda boolean next() muta cursorul pe urmatoarea inregistrare
corespunzatoare interogarii. Daca nu mai sunt inregistrari returneaza
false, altfel true, motiv pentru care poate fi folosita intr-o bucla while
pentru parcurgerea rezultatelor
› Interfata ResultSet furnizeaza metode getter pentru obtinerea valorilor
coloanelor inregistrarii curente.
› Valorile pot fi obtinute furnizandu-se fie un index al coloanei fie numele
coloanei
J Operatia SELECT

import java.sql.*;
public class Main {
public static void main(String[] args) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:company.db");
c.setAutoCommit(false);
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
while ( rs.next() ) {
int id = rs.getInt("id");
J String name = rs.getString("name");
int age = rs.getInt("age");
String address = rs.getString("address");
float salary = rs.getFloat("salary");
System.out.println( "ID = " + id );
System.out.println( "NAME = " + name );
System.out.println( "AGE = " + age );
System.out.println( "ADDRESS = " + address );
System.out.println( "SALARY = " + salary );
System.out.println();
}
rs.close();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
System.out.println("Operation done successfully");
}
}
ID = 1
NAME = Paul
AGE = 32

J Operatia SELECT
ADDRESS = California
SALARY = 20000.0

ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0

ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0

ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0

Operation done successfully


J Operatia UPDATE

import java.sql.*;
public class Main {
public static void main(String[] args) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:company.db");
c.setAutoCommit(false);
stmt = c.createStatement();
String sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1;";
stmt.executeUpdate(sql);
c.commit();
ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
while ( rs.next() ) {
int id = rs.getInt("id");
J String name = rs.getString("name");
int age = rs.getInt("age");
String address = rs.getString("address");
float salary = rs.getFloat("salary");
System.out.println( "ID = " + id );
System.out.println( "NAME = " + name );
System.out.println( "AGE = " + age );
System.out.println( "ADDRESS = " + address );
System.out.println( "SALARY = " + salary );
System.out.println();
}
rs.close();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
System.out.println("Operation done successfully");
}
}
ID = 1 ID = 1
NAME = Paul NAME = Paul
AGE = 32 AGE = 32
J Old ADDRESS = California
SALARY = 20000.0 New ADDRESS = California
SALARY = 25000.0

ID = 2 ID = 2
NAME = Allen NAME = Allen
AGE = 25 AGE = 25
ADDRESS = Texas ADDRESS = Texas
SALARY = 15000.0 SALARY = 15000.0

ID = 3 ID = 3
NAME = Teddy NAME = Teddy
AGE = 23 AGE = 23
ADDRESS = Norway ADDRESS = Norway
SALARY = 20000.0 SALARY = 20000.0

ID = 4 ID = 4
NAME = Mark NAME = Mark
AGE = 25 AGE = 25
ADDRESS = Rich-Mond ADDRESS = Rich-Mond
SALARY = 65000.0 SALARY = 65000.0

Operation done successfully Operation done successfully


J
› Old

› New
J Operatia DELETE
import java.sql.*;
public class Main {
public static void main(String[] args) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:company.db");
c.setAutoCommit(false);
stmt = c.createStatement();
String sql = "DELETE from COMPANY where ID=2;";
stmt.executeUpdate(sql);
c.commit();
ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
while ( rs.next() ) {
int id = rs.getInt("id");
J String name = rs.getString("name");
int age = rs.getInt("age");
String address = rs.getString("address");
float salary = rs.getFloat("salary");
System.out.println( "ID = " + id );
System.out.println( "NAME = " + name );
System.out.println( "AGE = " + age );
System.out.println( "ADDRESS = " + address );
System.out.println( "SALARY = " + salary );
System.out.println();
}
rs.close();
stmt.close();
c.close();
}
catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
System.out.println("Operation done successfully");
}
ID = 1 ID = 1
NAME = Paul NAME = Paul
AGE = 32 AGE = 32
J Old ADDRESS = California
SALARY = 25000.0 New ADDRESS = California
SALARY = 25000.0

ID = 2 ID = 3
NAME = Allen NAME = Teddy
AGE = 25 AGE = 23
ADDRESS = Texas ADDRESS = Norway
SALARY = 15000.0 SALARY = 20000.0

ID = 3 ID = 4
NAME = Teddy NAME = Mark
AGE = 23 AGE = 25
ADDRESS = Norway ADDRESS = Rich-Mond
SALARY = 20000.0 SALARY = 65000.0

ID = 4 Operation done successfully


NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0

Operation done successfully


J
› Old

› New

S-ar putea să vă placă și