Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    181

    [Java/SQL]update "dinamico" con preparedstatement

    Salve ragazzi,

    supponiamo che io abbia una tabella con questi campi(codice, nome cognome)

    e supponiamo che questo sia il metodo che esegue l'aggiornamento dei dati della stessa:

    codice:
    public boolean update(Integer Id) throws ClassNotFoundException, SQLException {
    		  DBManager DBM = new DBManager();
    		  DBM.startConnection();		 
    		  String SQL = "UPDATE Persona SET ";
    		  SQL += "nome = ?, ";
    		  SQL += "cognome = ? ";
    		  SQL += "WHERE Codice="+codice+";";
    	      PreparedStatement pst= DBM.getConnection().prepareStatement(SQL); 
    		  pst.setString(1, nome);
    	      pst.setString(2, cognome);
    		  boolean esito = DBM.executeUpdatePS(pst, SQL);
    		  return esito;  
      }
    Supponiamo il caso in cui io debba aggiornare SOLO uno dei due campi, ad esempio nome. Se eseguo questo metodo ci sarà un errore perchè non viene settato il valore del campo cognome.

    Come posso risolvere questo problema?

    EDIT: io un modo credo di averlo trovato. Verifico che i vari campi siano diversi da null. Se un campo è diverso da null incremento un contatore (il contatore mi serve per memorizzare il valore dell'indice). C'è un metodo migliore?

    grazie

  2. #2
    Non puoi, devi modificare la query magari creando un metoto updateNome(...)
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    181
    servirebbe un'istruzione per dire di non apportare modifiche se un campo è NULL...

    comunque il mio metodo descritto prima dovrebbe funzionare..solo che magari è un po laborioso..

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ma se non hai l'altro valore, significa che questo resta come era prima.
    Quindi carica l'istanza dal database, metti il valore che hai in ingresso quello che aggiorni, per l'altro prendi quello letto dal db, anche se personalmente non userei preparedstatement per queste cose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    181
    capito. Beh preparedstatement fa in automatico l'escape di apici ed altri caratteri antipatici al dbms, credo sia fondamentale no?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    prepared statement significa anche una query pre-compilata sempre presente in un dbms, utile quando fai molte interrogazioni simili, poco utile quando fai operazioni come questa (anche perché dovresti prevedere ogni caso e fare ogni update) che non è detto che tu faccia spesso (specie per tutti i campi).
    Senza passare a sistemi complessi o altro, se la scelta è oculata va benissimo, se la scelta è fatta solo per salvarti dagli escape e poi per poter fare un update o impazzisci coi valori null oppure ti devi caricare prima l'istanza per poter prelevare il valore che non hai capisci bene che è sfruttare male quello che il sistema mette a disposizione (dal mio punto di vista).

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    181
    beh ho letto che i preparedstatement oltre a fare l'escape sono utili contro attacchi di sql
    injection e offrono migliori prestazioni. L'unico svantaggio a mio avviso è proprio quello che ho documentato nel primo post..ho letto e apprezzato la tua critica ma non ho capito cosa mi consigli. Dovrei tornare allo statement?

    e come faccio l'escape? esiste qualche metodo di java o devo crearlo io?

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Attento non ho detto che lo statement è migliore del prepared statement, ti ho solo invitato a fare delle considerazioni: in una situazione reale, avere una istruzione sql pre-compilata migliora l'efficienza e i tempi di risposta della stessa (e questa è una cosa che ho visto con i miei occhi). Ma ricorda che hai roba sempre pre-compilata, se inizi ad averne tanta rischi di rallentare tutto per il carico eccessivo che dai al dbms.
    Nella realtà ho visto usare preparedstatement per le istruzioni che vengono fatte più frequentemente (tipo il listato del database).

    Passando ad insert e update, è chiaro che avere un prepared aiuta a migliorare sia tempi di risposta che livelli di sicurezza, ma fai un conto che devi prepararne uno per ogni tabella (e se diventano tante è un mezzo casotto) e mantenerlo. Ora per alcune tabelle non c'è un movimento tale da giustificare il prepared statement sempre pronto, in quei casi è più efficiente fare lo statement.
    Stesso dicasi per gli update. Rifletti bene che in questo caso un semplice update lo devi fare in 2 passi, nel primo prelevi i dati da db, nel secondo fai l'update vero e proprio.

    Riguardo la protezione contro sql injection, hai perfettamente ragione, ma devi sapere anche tu come avviene per poterla applicare. Una regex ben scritta e delle sostituzioni ti aiutano a proteggerti. Il prepared ti aiuta perché non puoi passare una query con quello che hai, ma devi fornire parametri di un determinato tipo, quindi è la tipizzazione a proteggerti.

    Questo per invitarti a "valutare" entrambe le opzioni e a scegliere non la migliore in assoluto, ma la migliore per te e per il tuo problema. Se tu ritieni opportuno usare questo metodo nessuno ti vieta di farlo, ma che la scelta sia oculata, tutto qui.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    181
    in effetti appena ho capito i vantaggi dei prepared statement ho deciso di convertire le query di inserimento e aggiornamento soprattutto per evitare di fare l'escape.

    Ho fatto un'altra ricerca e ho trovato una classe: http://commons.apache.org/lang/api-2...capeUtils.html che fa Escapes and unescapes di Stringhe per Java, Java Script, HTML, XML, e SQL.

    in alcuni casi potrei utilizzare questa associata allo statement..

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da user0
    in effetti appena ho capito i vantaggi dei prepared statement ho deciso di convertire le query di inserimento e aggiornamento soprattutto per evitare di fare l'escape.

    Ho fatto un'altra ricerca e ho trovato una classe: http://commons.apache.org/lang/api-2...capeUtils.html che fa Escapes and unescapes di Stringhe per Java, Java Script, HTML, XML, e SQL.

    in alcuni casi potrei utilizzare questa associata allo statement..
    Esatto, valuta bene quando è meglio globalmente avere uno e avere l'altro, tanto il modo per fare controlli lo hai trovato.
    Buona giornata

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.