Anda memasukkan nama pengguna langsung ke SQL tanpa keluar atau bahkan mengutip. Saya pikir Anda hanya melewatkan apostrof.
Untuk mencegah masalah injeksi SQL, JANGAN PERNAH menyisipkan konstanta string SQL dari data dinamis, SELALU gunakan PreparedStatement dan sisipkan spidol.
Atau, keluar dari nilai, tetapi menggunakan penanda jauh lebih aman, dan meningkatkan kinerja SQL dengan mengizinkan database untuk menyimpan pernyataan SQL yang dikompilasi ke cache.
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());
Catatan: Jawaban diperluas untuk mencakup masalah cek nol.
Saat Anda menggunakan injeksi string sederhana, "A='" + name + "'"
menjadi A='Joe'
untuk nilai bukan nol tetapi A='null'
untuk nilai nol, yang jelas bukan yang Anda inginkan.
Dengan menggunakan penanda parameter, nilai ?
bisa null
, yang artinya IFNULL(?, Name)
akan memberikan perilaku yang tepat yang dibutuhkan, yaitu menggunakan nilai ?
bila bukan nol, dan nilai NAME
kapan ?
adalah nol.