Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 40

Discussione: Query & Mysql

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110

    Query & Mysql

    Salve,
    nel mio programma di gestione del magazzino vorrei abilitare l'opzione che durante l'inserimento di un nuovo prodotto mi vada a controllare se il suddetto prodotto esiste già o meno (check su nomeprodotto).
    Qualora esista mi dovrebbe incrementare nel db il valore disponibilita di un valore pari alla nuova disponibilita inserita (vecchia disponibilità + nuova disponibilità). Qualora invece il prodotto non esista lo inserisca ex novo.
    sto avendo problemi con la ricerca e l'incremento... potreste aiutarmi?
    Ecco il codice:

    codice:
    	public void connetti(Prodotto prodotto){	
    	    	try {
        		
     		    		
        		String sql1 = "S E L E C T F R O M listaprodotti W H E R E nomeprodotto = ?";
        		
        		PreparedStatement insertStatement1 = con.prepareStatement(sql1);
        		insertStatement1.setString(1, prodotto.getNomeProdotto());
        		
        		rs = insertStatement1.executeQuery();
        		
        		if(rs.next()){
        			//String sql2 = "U P D A T E listaprodotti S E T disponibilita = disponibilita " + prodotto.getDisponibilita() " WHERE disponibilita = "
        			JOptionPane.showMessageDialog(null, "Prodotto esistente!");
        		}
        		
        		else {
                          INSERIMENTO NORMALE
                    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    sto avendo problemi con la ricerca e l'incremento... potreste aiutarmi?
    Quale è esattamente il dubbio o problema?
    Tra l'altro ehm .... è solo postato male qui oppure hai davvero scritto nella stringa S E L E C T (S spazio E spazio L .....)??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    I problemi sono due:
    1) nella ricerca inserendo la parola "ovetto" come nome prodotto (che c'è già in db) mi esce questo errore:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM listaprodotti WHERE nomeprodotto = 'Ovetto'' at line 1
    2) non so come incrementare il valore pre esistente...

    una cosa del genere?

    String sql2 = "U P D A T E listaprodotti S E T disponibilita = disponibilita " + prodotto.getDisponibilita() " W H E R E disponibilita = "
    3) no ma se pubblico il codice normale mi blocca il post dicendo che c'è un sql injection... ho dovuto ingegnarmi :P

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    1) nella ricerca inserendo la parola "ovetto" come nome prodotto (che c'è già in db) mi esce questo errore:
    Ero più preoccupato degli spazi e non ho notato subito che dopo SELECT hai messo subito FROM. Tra SELECT e FROM ci deve essere almeno un nome di colonna o al limite l'asterisco *

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    2) non so come incrementare il valore pre esistente...
    UPDATE listaprodotti SET disponibilita = disponibilita+1 WHERE ....condizione...

    Questo è SQL corretto. Nella espressione (quella a destra del = ) da assegnare alla colonna PUOI usare un'altra colonna o anche la stessa.

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    3) no ma se pubblico il codice normale mi blocca il post dicendo che c'è un sql injection... ho dovuto ingegnarmi :P
    Vero ... l'ho sperimentato anche io adesso che sto provando a postare.
    Ovviamente non ci devono essere spazi nelle "parole chiave" SQL.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    UPDATE listaprodotti SET disponibilita = disponibilita+1 WHERE ....condizione...

    Questo è SQL corretto. Nella espressione (quella a destra del = ) da assegnare alla colonna PUOI usare un'altra colonna o anche la stessa.

    ma a me interessa incrementare non di 1 ma incrementare del valore inserito...
    Es.

    ovetto - disponibilità 3
    inserisco
    ovetto - disponibilità 4
    visto che ovetto c'è già dovrebbe aggiornare il db mettendo disponibilità 7

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    ma a me interessa incrementare non di 1 ma incrementare del valore inserito...
    Es.

    ovetto - disponibilità 3
    inserisco
    ovetto - disponibilità 4
    visto che ovetto c'è già dovrebbe aggiornare il db mettendo disponibilità 7
    Allora (con PreparedStatement)

    UPDATE listaprodotti SET disponibilita = disponibilita + ? WHERE ....condizione....

    Dove il ? deve essere chiaramente un parametro numerico.

    La condizione del WHERE in questi casi tipicamente è su un ID specifico della tabella. Es. WHERE id = ?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Sto cercando di utilizzare un grado di separazione tra gui, db e altro come impostato dal mio prof per la creazione di questo programma di gestione magazzino.

    Voglio che il programma mi controlli se la quantità richiesta da rifornire sia realmente disponibile con un check nel nel db nella colonna "maxordinabile" ma non so come fare seguendo le modalità del mio prof di istanziare la connessione al db stesso...
    Mi spiego:

    CLASSE DB CONNECTIONS

    codice:
    import java.sql.Connection;import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Vector;
    
    
    import javax.swing.JOptionPane;
    
    
    public class DbConnection {
    
    
    	//Connection con;
    	Statement st;
    	ResultSet rs;
    	
    	   private static Connection db;       // La connessione col Database
    	   private static boolean connesso;    // Flag che indica se la connessione è attiva o meno
    	   private static DbConnection instance; //istanza statica della classe
    
    
    	   public static DbConnection getInstance() {
    		   if(instance == null)
    			   instance = new DbConnection();
    		   if(connesso != true)
    				connetti("magazzino", "root", "Admin123");
    		   return instance;
    	   }
    	
    	   
    	   public static boolean connetti(String nomeDB, String nomeUtente, String pwdUtente) {
    
    
    			  connesso = false;
    		      try {
    
    
    		         // Carico il driver JDBC per la connessione con il database MySQL
    		         Class.forName("com.mysql.jdbc.Driver");
    		         db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/" + nomeDB + "?user=" + nomeUtente + "&password=" + pwdUtente);
    		         connesso=true;
    		         
    		      } catch (Exception e) {
    		    	  e.printStackTrace(); 
    		     }
    		      return connesso;
    	 }
    	   
    	   public Vector<String[]> eseguiQuery(String query) {
    		      Vector<String[]> v = null;
    		      String [] record;
    		      int colonne = 0;
    		      try {
    		         Statement stmt = db.createStatement();     // Creo lo Statement per l'esecuzione della query
    		         ResultSet rs = stmt.executeQuery(query);   // Ottengo il ResultSet dell'esecuzione della query
    		         v = new Vector<String[]>();
    		         ResultSetMetaData rsmd = rs.getMetaData();
    		         colonne = rsmd.getColumnCount();
    
    
    		         while(rs.next()) {   // Creo il vettore risultato scorrendo tutto il ResultSet
    		            record = new String[colonne];
    		            for (int i=0; i<colonne; i++) record[i] = rs.getString(i+1);
    		            v.add( (String[]) record.clone() );
    		         }
    		         rs.close();     // Chiudo il ResultSet
    		         stmt.close();   // Chiudo lo Statement
    		      } catch (Exception e) { e.printStackTrace(); }
    
    
    		      return v;
    		   }
    }
    CLASSE ProdottoManager
    codice:
    public class ProdottoManager {
    
    		private static ProdottoManager instance;
    		
    		//SINGLETON
    		public static ProdottoManager getInstance()
    		{
    			if(instance == null)
    				instance = new ProdottoManager();
    			return instance;
    		}
    		
    		public boolean verificaRifornimento(String nomeprodotto, int quantita)
    		{
    			Prodotto prodotto = new Prodotto();
    			prodotto.setNomeProdotto(nomeprodotto);
    			return prodotto.verificaRifornimento(prodotto.getNomeProdotto(), quantita);
    		}
    		
    	}
    CLASSE Prodotto
    codice:
    public class Prodotto {
    	private int id;
    	private String nomeprodotto;
    	private String categoria;
    	private String descrizione;
    	private double prezzo;
    	private int disponibilita;
    	private int maxordinabile;
    	private String produttore;
    	private String fornitore;
    		
    	public Prodotto(){
    		nomeprodotto="";
    		categoria="";
    		descrizione="";
    		prezzo=0;
    		disponibilita=0;
    		maxordinabile=0;
    		produttore="";
    		fornitore="";
    	}
    		
    	public void setNomeProdotto(String nome){
    		nomeprodotto = nome;
    	}
    	
    	public void setCategoria(String categoriaprodotto){
    		categoria = categoriaprodotto;
    	}
    	
    	public void setDescrizione(String descrizioneprodotto){
    		descrizione = descrizioneprodotto;
    	}
    
    
    	public void setPrezzo(double prezzoprodotto){
    		prezzo = prezzoprodotto;
    	}
    	
    	public void setDisponibilita(int disponibilitaprodotto){
    		disponibilita = disponibilitaprodotto;
    	}
    	
    	public void setMaxOrdinabile(int maxordinabileprodotto){
    		maxordinabile = maxordinabileprodotto;
    	}
    	
    	public void setProduttore(String produttoreprodotto){
    		produttore = produttoreprodotto;
    	}
    	
    	public void setFornitore(String fornitoreprodotto){
    		fornitore = fornitoreprodotto;
    	}
    	
    		
    	public String getNomeProdotto(){
    		return nomeprodotto;
    	}
    	
    	public String getCategoria(){
    		return categoria;
    	}
    	
    	public String getDescrizione(){
    		return descrizione;
    	}
    	
    	public double getPrezzo(){
    		return prezzo;
    	}
    	
    	public int getDisponibilita(){
    		return disponibilita;
    	}
    	
    	public int getMaxOrdinabile(){
    		return maxordinabile;
    	}
    	
    	public String getProduttore(){
    		return produttore;
    	}
    	
    	public String getFornitore(){
    		return fornitore;
    	}
    	
    	public boolean verificaRifornimento(String nomeprodotto, int quantita){
    		return MagazziniereDAO.getInstance().checkRifornimento(this);
    	}
    	
    	public void scriviOutput(){
    		System.out.println("Prodotto: " + getNomeProdotto());
    		System.out.println("Categoria: " + getCategoria());
    		System.out.println("Descrizione: " + getDescrizione());
    		System.out.println("Prezzo: " + getPrezzo());
    		System.out.println("Disponibilità in magazzino: " + getDisponibilita());
    		System.out.println("Prodotto ordinabile: " + getMaxOrdinabile());
    	}
    }
    CLASSE MagazziniereDAO
    codice:
    import java.util.Vector;
    
    
    import settepietro20021377.magazzino.dbinterface.DbConnection;
    import settepietro20021377.magazzino.model.Prodotto;
    
    
    public class MagazziniereDAO {
    
    
    	private static MagazziniereDAO instance;
    	
    	public static MagazziniereDAO getInstance()
    	{
    		if(instance==null)
    		{	
    			instance = new MagazziniereDAO();
    		}
    		return instance;
    	}
    	
    	public boolean checkRifornimento(Prodotto prodotto, int quantita){
    		String nomeprodotto = prodotto.getNomeProdotto();
    		int maxordinabili = prodotto.getMaxOrdinabile();
    		Vector<String[]> result=DbConnection.getInstance().eseguiQuery("select * from listaprodotti where nomeprodotto=\""+ nomeprodotto+"\"");
    		
    		if(quantita()<= result(<maxordinabile){
    			return true;
    		}
    		
    
    
    	}
    Ora, come imposto la classe MagazziniereDAO per far si che mi restutisca un boolean true in prodotto.VerificaRifornimento?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    La classe DbConnection è fatta parecchio male .... sorvoliamo (per ora) ....
    Ma un'altra cosa decisamente non buona è che in Prodotto (che dovrebbe solo essere una classe di "bean" e slegata da qualunque altra nozione sull'accesso alla base dati) sei andato ad usare MagazziniereDAO. Questo NON va bene.
    Ultima modifica di andbin; 26-01-2017 a 15:36
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    La classe DbConnection è fatta parecchio male .... sorvoliamo (per ora) ....
    Ma un'altra cosa decisamente non buona è che in Prodotto (che dovrebbe solo essere una classe di "bean" e slegata da qualunque altra nozione sull'accesso alla base dati) sei andato ad usare MagazziniereDAO. Questo NON va bene.
    E quindi come dovrei fare?
    E per fare la query di confronto con quel template in DbConnection come si fa? Io ho fatto sempre connessione e ricerca nella classe stessa (e funzionava) ma sto provando ad usare quest'altra modalità...

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    E quindi come dovrei fare?
    La classe di Dao, dovrebbe essere la classe "stupida" che sa solo come accedere alla base dati, leggere una lista di record, leggere un singolo record, inserire un record ecc...
    Non dovrebbe contenere alcuna logica applicativa. Invece un if(quantita()<= result(<maxordinabile) è un concetto di livello applicativo e quindi non dovrebbe stare nel Dao. Dovrebbe stare in una classe di livello superiore. Nelle web application (specialmente quelle con Spring framework), la logica applicativa la si tiene in classi "Service" che sono concettualmente ad un livello superiore dei Dao.
    Tu chiamala pure come vuoi, es. MagazzinoService, LogicaMagazzino o come vuoi. Questa userà il Dao ed avrà dei metodi che applicano della logica applicativa, come appunto es. checkRifornimento.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.