Anagrafica -- concatenazione di stringhe jdbc query update

di il
3 risposte

Anagrafica -- concatenazione di stringhe jdbc query update


public ArrayList<Anagrafica> aggiornaAnagrafica(String nome, String cognome, String citta, int eta, int id) {
		boolean verifica = false;
		String queryUpdate = "update anagrafica set";
		String addNome = null, addCitta = null, addCognome = null, addId = "where id = ?", virgola = ",";
		int addEta = 0;

		Connection dbConnection = null;
		Statement statement = null;
		ResultSet rSet = null;
		PreparedStatement pStatement = null;
		int condizione = 1;

		try {
			dbConnection = Database.getConnection();
			statement = dbConnection.createStatement();

			if (nome != null && !"".equals(nome.trim())) {

				if (verifica) {
					// fai l'aggiornamento della query precedente
					addNome = " nome = ? ";
					queryUpdate += virgola + addNome; // concatena e aggiorna
				} else {
					addNome = " nome = ? ";
					queryUpdate += addNome; // concatena e aggiorna
				}
				verifica = true;
			}

			System.out.println(queryUpdate);

			if (cognome != null && !"".equals(cognome.trim())) {

				if (verifica) {
					// fai l'aggiornamento della query precedente
					addCognome = " cognome = ? ";
					queryUpdate += virgola + addCognome; // concatena e aggiorna
				} else {
					addCognome = " cognome = ? ";
					queryUpdate += addCognome; // concatena e aggiorna
				}
				verifica = true;
			}

			System.out.println(queryUpdate);

			if (citta != null && !"".equals(citta.trim())) {

				if (verifica) {
					// fai l'aggiornamento della query precedente
					addCitta = " citta = ? ";
					queryUpdate += virgola + addCitta; // concatena e aggiorna
				} else {
					addCitta = " citta = ? ";
					queryUpdate += addCitta; // concatena e aggiorna
				}
				verifica = true;
			}

			System.out.println(queryUpdate);

			if (eta != 0) {
				if(verifica) {
					queryUpdate += virgola + String.valueOf(addEta);//concatena e aggiorna
				}else {
					queryUpdate += String.valueOf(addEta);
				}
				verifica = true;
			}

			System.out.println(queryUpdate);

			if (id != 0) {
				queryUpdate += addId;
				verifica = true;
			}

			System.out.println("Update: " + queryUpdate);

			// Avvia l'aggiornamento in sql oracle
			pStatement = dbConnection.prepareStatement(queryUpdate);

			// aggiorna nome
			if (nome != null && !nome.trim().equals("")) {
				pStatement.setString(condizione++, nome);
			}

			// aggiorna cognome
			if (cognome != null && !cognome.trim().equals("")) {
				pStatement.setString(condizione++, cognome);
			}

			// aggiorna citta
			if (citta != null && !citta.trim().equals("")) {
				pStatement.setString(condizione++, citta);
			}

			// aggiorna eta
			if (eta != 0) {
				pStatement.setInt(condizione++, eta);
			}

			// aggiorna id
			if (id != 0) {
				pStatement.setInt(condizione++, id);
			}

			System.out.println("Update: " + queryUpdate);

			pStatement.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (dbConnection != null && statement != null && rSet != null && pStatement != null) {
					dbConnection.close();
					statement.close();
					rSet.close();
					pStatement.close();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return lista;
	}



L'errore che mi dà è questo:

update anagrafica set nome = ? , cognome = ? , citta = ?
update anagrafica set nome = ? , cognome = ? , citta = ? ,0
Update: update anagrafica set nome = ? , cognome = ? , citta = ? ,0where id = ?
java.sql.SQLException: Parameter index out of range (5 > number of parameters, which is 4).
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3288)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3272)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3314)
at com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:3258)
at it.daoImpl.AnagraficaImpl.aggiornaAnagrafica(AnagraficaImpl.java:250)
at it.test.MioTest.main(MioTest.java:26)

3 Risposte

  • Re: Anagrafica -- concatenazione di stringhe jdbc query update

    
      if (eta != 0) {
                if(verifica) {
                   queryUpdate += virgola + String.valueOf(addEta);//concatena e aggiorna
                }else {
                   queryUpdate += String.valueOf(addEta);
                }
                verifica = true;
             }
    
    penso che l'errore è qui, per la concatenazione di stringhe non me l'ho fà
  • Re: Anagrafica -- concatenazione di stringhe jdbc query update

    Risolto
  • Re: Anagrafica -- concatenazione di stringhe jdbc query update

    robot ha scritto:


    penso che l'errore è qui, per la concatenazione di stringhe non me l'ho fà
    Quando si devono fare queste cose con JDBC, ovvero query (di update o altro) con PreparedStatement in cui il numero di "?" è variabile perché dipende dalla presenza o meno di certi valori ... bisogna fare la cosa in modo un po' "pulito" e logico, altrimenti rischi solo di fare cose poco chiare e per niente mantenibili.

    Ecco un esempio (molto abbozzato ma giusto per dare l'idea):
        public List<Anagrafica> aggiornaAnagrafica(String nome, String cognome, String citta, int eta, int id) {
            boolean usaNome = nome != null && !nome.trim().isEmpty();
            boolean usaCognome = cognome != null && !cognome.trim().isEmpty();
            // .... altro ecc...
    
            String setClause = "";
    
            if (usaNome) {
                setClause += (setClause.isEmpty() ? "" : ", ") + "nome=?";
            }
    
            if (usaCognome) {
                setClause += (setClause.isEmpty() ? "" : ", ") + "cognome=?";
            }
    
            // ....altro ecc...
    
            String queryUpdate = "update anagrafica set " + setClause + " where id = ?";
    
            PreparedStatement pStatement = dbConnection.prepareStatement(queryUpdate);
    
            int paramIndex = 1;
    
            if (usaNome) {
                pStatement.setString(paramIndex++, nome);
            }
    
            // ....esecuzione ecc...
        }
    Ho:
    - isolato e non ripetuto le condizioni di test della presenza dei parametri
    - isolato la sola clausola di set
    - reso leggibile la query complessiva

    Che comunque sarebbe già 5 volte meglio del tuo approccio. Unica questione: se c'è/esiste il caso in cui tutti i parametri possono mancare, bisogna valutare cosa fare.

    Sarebbe comunque ancora migliorabile astraendo alcune logiche (es. ci sono librerie come la Apache Commons Lang che hanno metodi come StringUtils.isNotBlank(str) ).


    P.S. se devi fare cose del genere una o due volte, è accettabile. Se dovessi farlo per molte query (da 3/4 in su), allora valuta la realizzazione di una piccola "architettura" (piccola, nulla di esoterico) al di sopra del PreparedStatement).
Devi accedere o registrarti per scrivere nel forum
3 risposte