Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator02 [2014/10/20 12:11]
Andrei Roșu-Cojocaru [Activitate de Laborator]
laboratoare:laborator02 [2014/10/31 04:14] (current)
Andrei Roșu-Cojocaru [Soluții]
Line 18: Line 18:
 ===== Materiale Ajutătoare ====== ===== Materiale Ajutătoare ======
  
 +{{ :​laboratoare:​aipi2014-lab02-slides.pdf }}
 +
 +{{ :​laboratoare:​aipi2014-lab02-slides-3pp.pdf }}
 ===== Java Database Connectivity - aspecte generale ===== ===== Java Database Connectivity - aspecte generale =====
  
Line 521: Line 524:
 Throwable cause = exception.getCause();​ Throwable cause = exception.getCause();​
 while (cause != null) { while (cause != null) {
-    System.out.println("​Cauza" ​: +cause);+    System.out.println("​Cauza: ​"+cause);
     cause = cause.getClause();​     cause = cause.getClause();​
 } }
Line 851: Line 854:
 ===== Activitate de Laborator ===== ===== Activitate de Laborator =====
  
 +{{ :​laboratoare:​aipi2014-lab02-eclipse.zip }} <​html><​font color="​red">​(actualizat 22.10.2014, 18:​40)</​font></​html>​
  
 +{{ :​laboratoare:​aipi2014-lab02-netbeans.zip }} <​html><​font color="​red">​(actualizat 22.10.2014, 18:​40)</​font></​html>​
  
-<note tip>​Rezolvarea fiecarui exercitiu va fi realizata ca metoda distincta in clasa ''​Bookstore''​ din pachetul ''​ro.cs.pub.aipi.main'',​ denumita ''​exerciseX'',​ unde ''​X''​ reprezinta numarul exercitiului.</​note>​+<note tip>​Rezolvarea fiecarui exercitiu va fi realizata ca metoda distincta ​(denumita ''​exerciseX()''​) ​in clasa ''​Bookstore''​ din pachetul ''​ro.cs.pub.aipi.main'',​ unde ''​X''​ reprezinta numarul exercitiului ​(''​X = 02 ... 11''​). </​note>​ 
 + 
 +<note tip>Se poate rula suita de teste unitare ''​AllTests''​ din directorul ''​tests''​ (pachetul ''​ro.pub.cs.aipi.main''​),​ sau se poate defini metoda ''​main()''​ in clasa ''​Bookstore''​ din pachetul ''​ro.pub.cs.aipi.main''​ apelandu-se succesiv metodele ''​exerciseX()''​.</​note>​
  
 Se doreşte proiectarea unei aplicaţii care exploatează o bază de date ce urmează să fie integrată în cadrul unui sistem ERP pentru o librărie care comercializează doar cărţi. Se va porni de la schema conceptuală,​ respectiv de la structura bazei de date construite în cadrul laboratorului anterior. Se doreşte proiectarea unei aplicaţii care exploatează o bază de date ce urmează să fie integrată în cadrul unui sistem ERP pentru o librărie care comercializează doar cărţi. Se va porni de la schema conceptuală,​ respectiv de la structura bazei de date construite în cadrul laboratorului anterior.
-  - [**0 puncte**] ​În MySQL Workbench, să se execute script-ul ''​Laborator2l.sql''​ unde se crează structura şi diferite obiecte ale bazei de date libarie.\\ ​În clasa ''​Constants''​ din pachetul ''​ro.pub.cs.aipi.general'',​ să se modifice valoarea constantei ''​DATABASE_PASSWORD''​ cu cea corespunzătoare sistemului de gestiune pentru baze de date instalat pe maşina proprie. +  - [**0 puncte**] În clasa ''​Constants''​ din pachetul ''​ro.pub.cs.aipi.general'',​ să se modifice valoarea constantei ''​DATABASE_PASSWORD''​ cu cea corespunzătoare sistemului de gestiune pentru baze de date instalat pe maşina proprie.\\  
-  - [**10 puncte**] ​În clasa ''​DataBaseWrapperImplementation'' ​din pachetul ​''​ro.pub.cs.aipi.dataaccess'', ​să se implementeze metoda ''​getTableNumberOfRows()''​ care determină numărul de înregistrări al unei tabele identificata prin nume (primit ​ca parametru). <code java>+    * Daca nu se folosesc testele unitare, in MySQL Workbench, să se execute script-ul ''​Laborator2l.sql''​ (din directorul ''​scripts''​) unde se crează structura şi diferite obiecte ale bazei de date ''​bookstore'';​ 
 +    * Daca se folosesc testele unitare, nu sunt necesare alte configurari,​ intrucat inainte de rularea suitei de teste, se va instala baza de date in mod automat. 
 +  - [**10 puncte**] ​Să se implementeze metoda ''​getTableNumberOfRows()''​ din clasa ''​DataBaseWrapperImplementation'' ​a pachetului ​''​ro.pub.cs.aipi.dataaccess'', ​ce determină numărul de înregistrări al unei tabele identificata prin denumire ​(transmisa ​ca parametru). <code java>
 public int getTableNumberOfRows(String tableName) throws SQLException;​ public int getTableNumberOfRows(String tableName) throws SQLException;​
 </​code> ​ </​code> ​
-  - [**20 puncte**] Folosind metoda ''​getTableContent()'',​ să se creeaze un fişier ''​books.txt''​ in directorul ''​output''​ care sa contina lista tuturor cărţilor disponibile în librărie (existente pe stoc).\\ Pentru fiecare carte în parte se va preciza numele şi prenumele autorilor (in situatia in care o carte nu are un autor, se va preciza ​sirul de caractere ''​* * *''​),​ titlul, editura precum şi anul apariţiei, separate prin TAB. +  - [**20 puncte**] Folosind metoda ''​getTableContent()'',​ să se creeaze un fişier ''​books.txt''​ in directorul ''​output''​ care sa contina lista tuturor cărţilor disponibile în librărie (existente pe stoc).\\ Pentru fiecare carte în parte se va preciza ​identificatorul, ​numele şi prenumele autorilor (in situatia in care o carte nu are un autor, se va folosi ​sirul de caractere ''​* * *''​),​ titlul, editura precum şi anul apariţiei, separate prin caracterul ​TAB. 
-  - [**10 puncte**] Să se introduca ​în tabela ''​user''​ o înregistrare ale cărei atribute sunt introduse de la tastatură.\\ Pentru a citi o valoare de la tastatură în Java, se poate folosi următorul cod sursă: <code java>+  - [**10 puncte**] Să se adauge ​în tabela ''​user''​ o înregistrare ale cărei atribute sunt introduse de la tastatură.\\ Pentru a citi o valoare de la tastatură în Java, se poate folosi următorul cod sursă: <code java>
 Scanner scanner = new Scanner(System.in);  ​ Scanner scanner = new Scanner(System.in);  ​
 value = scanner.nextLine();​ value = scanner.nextLine();​
Line 867: Line 876:
 scanner.close();​ scanner.close();​
 </​code>​ </​code>​
-  - [**10 puncte**] Pe baza metodei ''​updateRecordsIntoTable()'',​ să se modifice toate comenzile de aprovizionare către editura Harlequin(id = 50, registered_number = 510636670) astfel încât cantităţile să fie crescute cu 20%.\\ Modificările nu vor fi operate decât asupra comenzilor care au fost deja livrate (state='​delivered'​). +  - [**10 puncte**] Pe baza metodei ''​updateRecordsIntoTable()'',​ să se modifice toate comenzile de aprovizionare către editura ​''​Harlequin'' ​(''​id = 50''​, ''​registered_number = 510636670''​) astfel încât cantităţile să fie crescute cu 20%.\\ Modificările nu vor fi operate decât asupra comenzilor care au fost deja livrate (''​state='​delivered''​'). 
-  - [**20 puncte**] ​În clasa ''​DataBaseWrapperImpl''​ din pachetul ​''​ro.pub.cs.aipi.dataaccess''​, să se implementeze metoda ''​deleteRecordsFromTable()''​ care elimină dintr-o tabelă identificată prin nume (primit ​ca parametru) acele înregistrări care au anumite valori corespunzătoare unor atribute sau care respectă o anumită condiţie. <code java>+  - [**20 puncte**] ​Să se implementeze metoda ​''​deleteRecordsFromTable()''​ din clasa ''​DataBaseWrapperImplementation''​ a pachetului ​''​ro.pub.cs.aipi.dataaccess'' ​ce elimină dintr-o tabelă identificată prin denumire ​(transmisa ​ca parametru) acele înregistrări care au anumite valori corespunzătoare unor atribute sau care respectă o anumită condiţie. <code java>
 public void deleteRecordsFromTable(String tableName, ArrayList<​String>​ attributes, ArrayList<​String>​ values, String whereClause) throws SQLException,​ DataBaseException public void deleteRecordsFromTable(String tableName, ArrayList<​String>​ attributes, ArrayList<​String>​ values, String whereClause) throws SQLException,​ DataBaseException
 </​code>​ Dacă ''​attributes = (attribute<​sub>​1</​sub>,​ ..., attribute<​sub>​n</​sub>​)'',​ respectiv ''​values = (value<​sub>​1</​sub>,​ ..., value<​sub>​n</​sub>​)'',​ atunci vor fi şterse înregistrările pentru care ''​attribute<​sub>​1</​sub>​=value<​sub>​1</​sub>​ AND ... AND attribute<​sub>​n</​sub>​=value<​sub>​n</​sub>''​ sau pentru care este îndeplinită condiţia ''​whereClause''​. În cazul în care sunt precizate ''​attributes''​ / ''​values'',​ parametrul ''​whereClause''​ va fi ignorat.\\ Folosind metoda ''​deleteRecordsFromTable()''​ astfel implementată să se şteargă acele edituri care nu au cărţi comercializate de librarie. </​code>​ Dacă ''​attributes = (attribute<​sub>​1</​sub>,​ ..., attribute<​sub>​n</​sub>​)'',​ respectiv ''​values = (value<​sub>​1</​sub>,​ ..., value<​sub>​n</​sub>​)'',​ atunci vor fi şterse înregistrările pentru care ''​attribute<​sub>​1</​sub>​=value<​sub>​1</​sub>​ AND ... AND attribute<​sub>​n</​sub>​=value<​sub>​n</​sub>''​ sau pentru care este îndeplinită condiţia ''​whereClause''​. În cazul în care sunt precizate ''​attributes''​ / ''​values'',​ parametrul ''​whereClause''​ va fi ignorat.\\ Folosind metoda ''​deleteRecordsFromTable()''​ astfel implementată să se şteargă acele edituri care nu au cărţi comercializate de librarie.
   - [**10 puncte**] Folosind procedura stocată ''​calculate_user_total_invoice_value''​ să se determine lista utilizatorilor împreună cu valoarea totala a facturilor asociate fiecăruia. Informatiile vor fi plasate sub forma cod numeric personal TAB valoarea totala a facturilor, cate o informatie pe un rand, in fisierul ''​user_total_invoce_value.txt''​ din directorul ''​output''​.   - [**10 puncte**] Folosind procedura stocată ''​calculate_user_total_invoice_value''​ să se determine lista utilizatorilor împreună cu valoarea totala a facturilor asociate fiecăruia. Informatiile vor fi plasate sub forma cod numeric personal TAB valoarea totala a facturilor, cate o informatie pe un rand, in fisierul ''​user_total_invoce_value.txt''​ din directorul ''​output''​.
   - [**10 puncte**] Folosind funcţia stocată ''​calculate_supply_order_value''​ să se determine lista editurilor către care s-au efectuat cele mai mari plăţi. Informatiile vor fi plasate sub forma denumire factura TAB valoarea totala a comenzilor de aprovizionare,​ cate o informatie pe un rand, in fisierul ''​publishing_house_total_supply_order_value.txt''​ din directorul ''​output'',​ realizandu-se o ordonare descrescatoare in functie de valoarea totala a comenzilor de aprovizionare.   - [**10 puncte**] Folosind funcţia stocată ''​calculate_supply_order_value''​ să se determine lista editurilor către care s-au efectuat cele mai mari plăţi. Informatiile vor fi plasate sub forma denumire factura TAB valoarea totala a comenzilor de aprovizionare,​ cate o informatie pe un rand, in fisierul ''​publishing_house_total_supply_order_value.txt''​ din directorul ''​output'',​ realizandu-se o ordonare descrescatoare in functie de valoarea totala a comenzilor de aprovizionare.
-  - [**10 puncte**] ​În clasa ''​DataBaseWrapperImplementation'' ​din pachetul ​''​ro.pub.cs.aipi.dataaccess'',​ să se implementeze metoda ''​getReferrences()''​ ce determină pentru o tabelă ​dată prin nume (primit ​ca parametru) care sunt tabelele pe care le referă, precum şi atributele care fac obiectul constrângerii de tip ''​FOREIGN KEY''​. Metoda intoarce o lista de obiecte de tip ''​Referrence''​ care contine denumirea tabelei copil si atributul dependent din cadrul acesteia precum si denumirea tabelei parinte si atributul referit din cadrul acesteia.\\ Pe baza acestei metode, sa se creeze fisierul ''​foreign_key_constraints.txt''​ in directorul ''​output''​ care contine toate constrangerile de tip cheie straina sub forma ''​tabela_copil/​atribut_copil referrences tabela_parinte/​atribut_parinte'',​ cate o inregistrare pe un rand. +  - [**10 puncte**] ​Să se implementeze metoda ''​getReferrences()''​ din clasa ''​DataBaseWrapperImplementation'' ​a pachetului ​''​ro.pub.cs.aipi.dataaccess''​ ce determină pentru o tabelă ​identificata ​prin denumire ​(transmisa ​ca parametru) care sunt tabelele pe care le referă, precum şi atributele care fac obiectul constrângerii de tip ''​FOREIGN KEY''​. Metoda intoarce o lista de obiecte de tip ''​Referrence''​ care contine denumirea tabelei copil si atributul dependent din cadrul acesteia precum si denumirea tabelei parinte si atributul referit din cadrul acesteia.\\ Pe baza acestei metode, sa se creeze fisierul ''​foreign_key_constraints.txt''​ in directorul ''​output''​ care contine toate constrangerile de tip cheie straina sub forma ''​tabela_copil/​atribut_copil referrences tabela_parinte/​atribut_parinte'',​ cate o inregistrare pe un rand. 
-  - [**10 puncte**] Folosind un obiect de tip ''​RowSet''​ deconectat, să se afişeze cărţile comercializate de editură ​(precizându-se titlul şi preţul lor), numele editurii care le-a publicat, numele colecţiei şi numele domeniului din care fac parte. +  - [**10 puncte**] Folosind un obiect de tip ''​RowSet''​ deconectat, să se afişeze cărţile comercializate de librarie ​(precizându-se titlul şi preţul lor), numele editurii care le-a publicat, numele colecţiei şi numele domeniului din care fac parte. Informatiile vor fi stocate in fisierul ''​books_join.txt''​ din directorul ''​output''​ sub forma identificator carte, titlu, pret, denumire editura, denumire colectie si denumire domeniu, separate intre ele prin TAB, cate o inregistrare pe linie. 
-  - [**10 puncte**] Să se filtreze colecţia de date anterioară astfel încât să conţină numai cărţile având preţul cuprins între 1000 şi 5000.+  - [**10 puncte**] Să se filtreze colecţia de date anterioară astfel încât să conţină numai cărţile având preţul cuprins între 1000 şi 5000. Informatiile vor fi stocate in fisierul ''​books_filtered.txt''​ din directorul ''​output'',​ formatul fiind acelasi ca in cazul precedent. 
 +  - [**0 puncte**] 
 +    * Daca nu se folosesc testele unitare, in MySQL Workbench, să se execute script-ul ''​Laborator2u.sql''​ (din directorul ''​scripts''​) unde se sterge baza de date ''​bookstore''​ impreuna cu toate obiectele sale; 
 +    * Daca se folosesc testele unitare, nu sunt necesare alte configurari,​ intrucat dupa rularea suitei de teste, se va dezinstala baza de date in mod automat. 
 ===== Resurse ====== ===== Resurse ======
  
Line 882: Line 895:
 ===== Soluții ===== ===== Soluții =====
  
-disponibile pe 27 octombrie 2014+[[https://​github.com/​aipi2014/​Laborator02/​tree/​master/​Eclipse/​|Proiect Eclipse]]\\ 
 +[[https://​github.com/​aipi2014/​Laborator02/​tree/​master/​NetBeans/​|Proiect NetBeans]]
laboratoare/laborator02.1413796284.txt.gz · Last modified: 2014/10/20 12:11 by Andrei Roșu-Cojocaru
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0