Wstawiasz nazwę użytkownika bezpośrednio do SQL bez uciekania lub nawet cytowania. Myślę, że po prostu przegapiłeś apostrofy.
Aby zapobiec problemom z wstrzykiwaniem SQL, NIGDY nie wstawiaj stałych łańcuchowych SQL z danych dynamicznych, ZAWSZE używaj PreparedStatement i wstawiaj znaczniki.
Alternatywnie, unikaj wartości, ale używanie znaczników jest znacznie bezpieczniejsze i poprawia wydajność SQL, umożliwiając bazie danych buforowanie skompilowanej instrukcji SQL.
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());
Uwaga: Odpowiedź rozszerzona o problem z testem zerowym.
Gdy używasz prostego wstrzykiwania ciągu znaków, "A='" + name + "'"
staje się A='Joe'
dla wartości innej niż null, ale A='null'
dla wartości null, co zdecydowanie nie jest tym, czego chcesz.
Używając znaczników parametrów, wartość ?
może być null
, co oznacza, że IFNULL(?, Name)
da dokładnie potrzebne zachowanie, tj. przy użyciu wartości ?
kiedy nie jest null, a wartość NAME
kiedy ?
jest zerowe.