Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Atualize as colunas se os valores de entrada não forem nulos, caso contrário, ignore e mantenha os valores existentes da coluna no banco de dados


Você está inserindo o nome de usuário diretamente no SQL sem escapar ou mesmo citar. Acho que você simplesmente perdeu os apóstrofos.

Para evitar problemas de injeção de SQL, NUNCA insira constantes de string SQL de dados dinâmicos, SEMPRE use PreparedStatement e insira marcadores.

Como alternativa, escape os valores, mas usar marcadores é muito mais seguro e melhora o desempenho do SQL, permitindo que o banco de dados armazene em cache a instrução SQL compilada.
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());

Observação: Resposta estendida para cobrir o problema de verificação nula.

Ao usar injeção de string simples, "A='" + name + "'" torna-se A='Joe' para um valor não nulo, mas A='null' para um valor nulo, que definitivamente não é o que você deseja.

Usando marcadores de parâmetro, o valor de ? pode ser null , o que significa que IFNULL(?, Name) fornecerá o comportamento exato necessário, ou seja, usando o valor de ? quando não é nulo e o valor de NAME quando ? é nulo.