sql >> Database teknologi >  >> RDS >> Mysql

Opdater kolonner, hvis inputværdier ikke er null, ellers ignorer og behold de eksisterende værdier for kolonne i databasen

Du indsætter brugernavnet direkte i SQL uden at undslippe eller endda citere. Jeg tror simpelthen, du gik glip af apostroferne.

For at forhindre problemer med SQL-injektion, indsæt ALDRIG SQL-strengkonstanter fra dynamiske data, brug ALTID PreparedStatement og indsæt markører.

Alternativt kan du undslippe værdierne, men brug af markører er meget sikrere og forbedrer SQL-ydeevnen ved at tillade databasen at cache den kompilerede SQL-sætning.

String updateQuery = "UPDATE " + USER_TABLE +
                       " SET " + USER_TABLE_FIRST_NAME + "=IFNULL(? ," + USER_TABLE_FIRST_NAME + ")," +
                                 USER_TABLE_LAST_NAME + "=?," +
                                 USER_TABLE_ABOUT_ME + "=?," +
                                 USER_TABLE_CITY + "=?," +
                                 USER_TABLE_DOB + "=?" +
                     " WHERE " + USER_TABLE_ID + "=?";
PreparedStatement stmt = conn.prepareStatement(updateQuery);
stmt.setString(1, user.getFirstName());
stmt.setString(2, user.getLastName());
stmt.setString(3, user.getAboutMe());
stmt.setString(4, user.getCity());
stmt.setString(5, user.getDateOfBirth());
stmt.setString(6, user.getUserId());

Bemærk: Svaret er udvidet til at dække problemet med nulkontrol.

Når du bruger simpel strenginjektion, "A='" + name + "'" bliver A='Joe' for en værdi, der ikke er nul, men A='null' for en nulværdi, hvilket bestemt ikke er, hvad du ønsker.

Ved at bruge parametermarkører, værdien af ​​? kan være null , hvilket betyder, at IFNULL(?, Name) vil give den nøjagtige adfærd, der er nødvendig, dvs. ved at bruge værdien af ​​? når den ikke er null, og værdien af ​​NAME når ? er nul.



  1. Spring Boot MySQL-databaseinitialiseringsfejl med lagrede procedurer

  2. MySql masseindlæsning af kommandolinjeværktøj

  3. SQL-punktnotation

  4. SQL-forespørgselskonstruktion - adskil data i en kolonne i to kolonner