Šta je novo?

Java atributi i metodi-pomoc

majavujovic

Cenjen
Učlanjen(a)
18.09.2012
Poruke
3
Poena
151
Molila bih za pomoc. Imam sledeci zadatak da uradim:
Kreirati MySQL bazu podataka prodaja, sa tabelama proizvodi, računi i zaposleni.

Kreirati odgovarajuće klase (Proizvod, Racun i Zaposleni) koje imaju mogućnost manipulacije određenim tabelama unutar baze podataka.

Klase Proizvod, Racun i Zaposleni, treba da sadrže implementaciju metoda insert, delete, update, getall, getfromid...

Metod insert na osnovu kreirane klase (na primer Proizvod), vrši upis u bazu podataka. Metod delete, briše podatak iz baze koji je prosleđen kao parametar ovom metodu. Metod update vrši ažuriranje podataka u bazi na osnovu aktuelnog objekta i metodi getbyid i getall vraćaju kolekcije objekata ili samo jedan objekat. Za svaki račun dovoljno je čuvati samo jedan proizvod.


Zadatak proslediti u tekstualnoj formi.

Za uspešno urađen zadatak, potrebno je minimalno uraditi SQL skriptu i bar jednu klasu.

Uradila sam sledece:
Bazu za koju prof kaze da je dobra:
CREATE DATABASE Prodaja;

CREATE TABLE Proizvodi (

productID int(10) not null,
productName varchar(32) not null,
productValue double not null,
primary key (productID)
);

INSERT INTO Proizvodi (productID, productName, productValue) values (100, 'jabuka', 50);
INSERT INTO Proizvodi (productID, productName, productValue) values (101, 'kruska', 80);

CREATE TABLE Racuni (

orderNumber int (10) not null,
productID varchar(32) not null,
quantityOrdered int(20) not null,
orderValue double not null,
primary key (orderNumber)
);

INSERT INTO Racuni (orderNumber, productID, quantityOrdered, orderValue) values (10, 100, 3, 150);
INSERT INTO Racuni (orderNumber, productID, quantityOrdered, orderValue) values (11, 101, 2, 160);

CREATE TABLE Zaposleni (
employeeID int(10) not null,
firstName varchar (20) not null,
lastName varchar (20) not null
primary key (employeeID)
);

INSERT INTO Zaposleni (employeeID, firstName, lastName) values (1, 'Maja', 'Vujovic');
INSERT INTO Zaposleni (employeeID, firstName, lastName) values (2, 'Marko', 'Markovic');

ali imam veliki problem sa kodom u javi. ja sam uradila sledece ali trebam da izmenim tako da definisem atribute i metode....
Molim za pomoc vec dugo se mucim sa ovim.
//definisanje klase
public class Proizvod {

//definisanje atributa klase
private int productID ;
private String productName;
private int productValue;


public static void main(String[] args) {

//konekcija
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance ();
conn = DriverManager.getConnection("jdbc:mysql://localhost/prodaja", "root", "");

//za insert, delete i update

String query = "insert into Proizvod (productID, productName, productValue) values (?,?)";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setInt(1, 102);
preparedStmt.setString(2, "ringlov");
preparedStmt.setInt(3, 100);
preparedStmt.execute();

String query = "delete from Proizvod where productID = ?";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setInt(1, 100);
preparedStmt.execute();

String query = "update Proizvod set productName = ? where productID = ?";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setInt (1, 101);
preparedStmt.setString(2, "orah");
preparedStmt.executeUpdate();

//za getall i getbyid

Statement getall = conn.prepareStatement();
getall.executeQuery("select * from Proizvodi");
ResultSet rs = getall.getResultSet();
rs.next();

Statement getbyid = conn.prepareStatement();
getbyid.executeQuery("select * from Proizvodi where productID = 101");
ResultSet rs = getbyid.getResultSet();
rs.next();

//konekcija kraj

conn.close();
catch (Exception ex)
}

}
}
 
Sigurno ti niko nece resiti ceo zadatak, ne ocekuj uopste, to nije praksa ni ovde, ni nigde 🙂 . Bolje reci koji ti je problem i gde si zapela, pa cemo vec pomoci, jer to i nisi rekla.

Edit:
Sada vidim, napisala si kroz kod. Jedan predlog, kod stavljaj u
Kod:
 tagove jer je tako mnogo citljiviji.
 
Poslednja izmena:
Prethodna poruka mi je zakljucana za izmenu.

Za pocetak, ako ti je bas ovakav kod u javi , ovo je mesanje baba i zaba. Klase nemaju main funkciju, one se ne izvrsavaju na takav nacin. Jedan program ima jednu main funkciju kroz koju se polazi kada se pokrene program A unutar te main funkcije ces praviti objekte (instance) klasa nad kojima ces pozivati metode definisane nad tim objektima. Ovo je uprosceno, ti mozes praviti objekte jednih klasa unutar drugih klasa, ali ovo kako sam objasnio je skroz pocetnicki.

Ako ti je poznatiji proceduralni nacin programiranja, klasa ti je tip npr. int, a objekat je promenjiva npr. int i. Samo sto u objektno orijentisanom programiranju klasa malo kompleksniji tip, nad kojim definises i operacije, sto su te metode. Nemoj ovako da objasnjavas nekom profesoru, to nije pametno, neka ovo ostane medju nama 😀 .

To ispadne ovako nekako u main funkciji:
Kod:
 Proizvod p = new Proizvod("nekiAtributi");
p.update();

Ovo sto je tebi dato je poznati pattern tj. cesto primenjivan nacin za kreiranje objekata u programu na osnovu podataka u bazi i on ti izgleda ovako:

Kod:
BAZA PODATAKA <==> OBJEKTI <===> Funkcionalni deo programa

Sto bi znacilo, klase pored standardnih get/set metoda, drugih metoda imaju i dodatne metode koje bukvalno uzimaju vrednosti atributa tog objekta i pretvaraju ih u SQL naredbu koja ce se izvrsiti nad bazom i te atribute pretvoriti u jednu ili vise torki. Tako da kasnije mozes od tih torki da napravis objekte, odnosno od teksta i brojeva iz baze napravis objekte neke klase.

Profesor vam je dodatno zakomplikovao zivot tako sto te klase imaju dva dodatna metoda koji prolaze kroz npr. tabelu Proizvodi i na osnovu svih torki prave kolekciju (niz, listu...) objekata klase Proizvod. Ti metodi se ne mogu vezati za jedan objekat konkretno, tako da ce ti metodi biti staticki. To znaci da se mogu pozvati bez kreiranja bilo kog objekta.

Ovo je bilo na vrat, na nos, ako ti neki od ovih pojmova nije jasan, pitaj dalje, ali je ipak pametnije da iskoristis neku knjigu jer su mnogi ljudi opisali te stvari mnogo bolje nego sto bih ja mogao ovako i za neko razumno vreme.

Napisacu primer za klasu Proizvod, ali ne mogu ga isprobati bas lako sada, pa moras sama da se pozabavis detaljima, moguce da ima gresaka. Preostale dve klase su po istom principu. U svakom slucaju, here we go:

Kod:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;


public class Proizvod {
	private int productID ;
	private String productName;
	private int productValue;


	public Proizvod(int productID, String productName, int productValue) {
		this.productID = productID;
		this.productName = productName;
		this.productValue = productValue;
	}

//morao sam da dodam konstruktore

	public Proizvod() {
	}

	public boolean insert()
	{
		//deo sa try/catch/finally blokom izgleda malo sumovito, ali je namerno tako napravljen kako bi konekcija bila zatvorena, sta god krenulo naopako. Cak i ako zatvaranje konekcije podje naopako u finally bloku, catch ce uhvatiti taj exception. Ako ne znas o cemu govorim, zaboravi :) 

		boolean daLiJeUspelo = false; //povratna vrednost
		Connection conn = null; //objekat konekcije
		try
		{
			try
			{
				Class.forName("com.mysql.jdbc.Driver").newInstance ();
				conn = DriverManager.getConnection("jdbc:mysql://localhost/prodaja", "root", "");
				String query = "insert into Proizvod (productID, productName, productValue) values (?,?,?)"; //po jedan znak pitanja za svaku vrednost
				PreparedStatement preparedStmt = conn.prepareStatement(query);
				preparedStmt.setInt(1, this.productID);
				preparedStmt.setString(2, this.productName);
				preparedStmt.setInt(3, this.productValue);
				daLiJeUspelo = preparedStmt.execute(); //execute vraca true ili false na osnovu toga da li je operacija uspela
			}
			finally
			{
				conn.close();
			}
		}
		catch (Exception e) {
			//uhvati exception
		}
		return daLiJeUspelo;
	}
	
	//sada je takoreci copy/paste posao
	public boolean delete()
	{
		boolean daLiJeUspelo = false;           //povratna vrednost
		Connection conn = null;         //objekat konekcije
		try
		{
			try
			{
				Class.forName("com.mysql.jdbc.Driver").newInstance ();
				conn = DriverManager.getConnection("jdbc:mysql://localhost/prodaja", "root", "");
				String query = "delete from Proizvod where productID = ?"; 
				PreparedStatement preparedStmt = conn.prepareStatement(query);
				preparedStmt.setInt(1, this.productID);
				daLiJeUspelo = preparedStmt.execute(); 
			}
			finally
			{
				conn.close();
			}
		}
		catch (Exception e) {
			//uhvati exception
		}
		return daLiJeUspelo;
	}
	public boolean update()
	{
		boolean daLiJeUspelo = false; //povratna vrednost
		Connection conn = null; //objekat konekcije
		try
		{
			try
			{
				Class.forName("com.mysql.jdbc.Driver").newInstance ();
				conn = DriverManager.getConnection("jdbc:mysql://localhost/prodaja", "root", "");
				String query = "update Proizvod set productName = ?, value = ? where productID = ?"; 
				PreparedStatement preparedStmt = conn.prepareStatement(query);
				preparedStmt.setString(1, this.productName);
				preparedStmt.setInt(2, this.productValue);
				preparedStmt.setInt(3, this.productID);
				daLiJeUspelo = preparedStmt.execute(); 
				
			}
			finally
			{
				conn.close();
			}
		}
		catch (Exception e) {
			//uhvati exception
		}
		return daLiJeUspelo;
	}
	
	//sada idu vec spomenute staticke metode. Uoci da u njima ne mozes koristiti atribute klase

	//metode koje nesto preuzimaju iz baze imaju malo komplikovaniju sintaksu nego prethodne. 
	public static Proizvod getFromId(int id)
	{
		Proizvod retProizvod = null;
		
		Connection conn = null; //objekat konekcije
		try
		{
			try
			{
				Class.forName("com.mysql.jdbc.Driver").newInstance ();
				conn = DriverManager.getConnection("jdbc:mysql://localhost/prodaja", "root", "");
				String query = "select productName, value, productID from Proizvod where productName = ?";          //nikada nemoj da koristis select *
				PreparedStatement preparedStmt = conn.prepareStatement(query);
				preparedStmt.setInt(1, id);
			    ResultSet result = preparedStmt.executeQuery();              //Za prihvatanje rezultata upita koristi se struktura pod imenom ResultSet, nesto kao tabela. U result su ti rezultati upita u ovom slucaju ce biti jedan iil ni jedan
			    while (result.next()) { 					//idemo red po red kroz rezultate... odnosno ili jedan, ili ni jedan
			    	
			    	int pID = result.getInt("productID"); //ovo su imena kolona u rezultujucoj tabeli
			    	int vrednost = result.getInt("value");
			    	String ime=result.getString("productName");
			        retProizvod = new Proizvod(pID,ime,vrednost);
			      }
			}
			finally
			{
				conn.close();
			}
		}
		catch (Exception e) {
			//uhvati exception
		}
		return retProizvod;
	}
	
	//i na kraju, funkcija koja vraca kolekciju svih proizvoda iz baze. Iskoristio sam ArrayList jer je prosto zgodnija za ovakav problem od niza.

	public static ArrayList<Proizvod> getAll()
	{
		ArrayList<Proizvod> retProizvodi = new ArrayList<Proizvod>();
		
		Connection conn = null; //objekat konekcije
		try
		{
			try
			{
				Class.forName("com.mysql.jdbc.Driver").newInstance ();
				conn = DriverManager.getConnection("jdbc:mysql://localhost/prodaja", "root", "");
				String query = "select productName, value, productID from Proizvod"; 
				PreparedStatement preparedStmt = conn.prepareStatement(query);
			    ResultSet result = preparedStmt.executeQuery(); 
			    
			    while (result.next()) {//idemo red po red kroz rezultate... Ovde ih moze biti vise. Svakim redom inicijalizujemo nov objekat tipa Proizvod i guramo ga u listu.

			    	int pID = result.getInt("productID"); //ovo su imena kolona u rezultujucoj tabeli
			    	int vrednost = result.getInt("value");
			    	String ime=result.getString("productName");
			    	Proizvod p = new Proizvod(pID,ime,vrednost); //kreiranje proizvoda na osnvu aktuelne torke 
			    	retProizvodi.add(p); //dodavanje proizvoda u listu
			      }
			}
			finally
			{
				conn.close();
			}
		}
		catch (Exception e) {
			//uhvati exception
		}
		return retProizvodi;
	}
}

Stvarno imas srece sto nisam imao nista pametnije da radim 😀
 
Poslednja izmena:
Ne znam tačno taj API, ali pretpostavljam da rezultat zna koliko record-a ima, pa bi sa tom vrednošću trebalo da konstruišeš ArrayList, a ne praznim konstruktorom. 🙂
 
I na moje veliko zaprepascenje - nema 😀 . Moze egzibicijama, ali to nije smisao sada.
 
Poslednja izmena:
Sigurno ti niko nece resiti ceo zadatak, ne ocekuj uopste, to nije praksa ni ovde, ni nigde 🙂 . Bolje reci koji ti je problem i gde si zapela, pa cemo vec pomoci, jer to i nisi rekla.

Edit:
Sada vidim, napisala si kroz kod. Jedan predlog, kod stavljaj u
Kod:
 tagove jer je tako mnogo citljiviji.[/QUOTE]

Nije mi jasno kako da definisem atribute i metode.
Znam kako da ih napravim posebno ali u ovom slucaju mi nije jasno sta moze a sta ne i kako konkretno to treba da izgleda.
Ako moze primer, samo da vidim princip, ja cu odraditi sve ostalo.
Hvala unapred!
 
Ako ti napisani primer nije dovoljan, onda ne znam stvarno sta da radim :d .
 
Ne znam tačno taj API, ali pretpostavljam da rezultat zna koliko record-a ima, pa bi sa tom vrednošću trebalo da konstruišeš ArrayList, a ne praznim konstruktorom. 🙂

Ne zna se koliko će linija baza vratiti kao rezultat upita dok se sve ne pročitaju.

Jedino rešenje je da se prvo uradi select count(*)... ili da se count integriše u postojeći upit: SELECT fld1, fld2,..., count(*) over () from some_table; (Oracle SQL sintaksa, ali pretpostavljam da je slično i za druge baze).
 
Da... prelistao sam specifikaciju MySQL protokola, i stvarno server samo šalje redove bez prethodne informacije koliko će ih ima. Mora da je to zbog performansi, server bi verovatno morao da završi ceo proces pravljenja rezultata da bi video koliki će rezultat biti, što znači da bi morao da zadrži rezultat kod sebe u memoriji da bi mogao prvo da pošlje veličinu, pa onda redove. A pošto su veličine rezultata nepoznate, a mogu biti velike, i ko zna koliko konekcija može istovremeno da traži redove, ovakav protokol je bolji, jer server praktično, dok gradi rezultat, može odmah da šalje bez zadržavanja u svojoj memoriji.
 
Nazad
Vrh Dno