Mam więc prostą funkcję zwracania czegoś z bazy danych. Następnie mogę zmodyfikować to zapytanie, dodając różne parametry w klauzuli WHERE. Jaki byłby najbardziej elegancki i skuteczny sposób radzenia sobie z tym?Jak używać przygotowanej instrukcji, jeśli nie wiem, ile parametrów będę przekazywać?
Przykład:
public static getUsers(int id, string username, string email) {
Connection conn = null;
PreparedStatement stmt = null;
String sql = "";
sql = "SELECT * FROM users " .........
I to gdzie jestem mylić o klauzuli WHERE. Jeśli wykonuję coś takiego, jak:
"WHERE id = ? AND username = ? AND email = ?";
Co się stanie, jeśli wezwę metodę z tylko identyfikatorem i bez nazwy użytkownika lub adresu e-mail? Przerwa i nie mogę tego mieć.
Również trudno jest zarządzać indeksami, bo gdybym zrobił coś takiego, jak stmt.setInt(1, id)
, ale co, gdybym tylko chciał wywołać metodę z nazwą użytkownika, a ten identyfikator przyjdzie jako zerowy, nie rzuciłby a NPE?
Jestem trochę nowy w Javie, przepraszam ... ale myślę, że powinienem użyć przesłonięć? powinienem zbudować moją klauzulę where w instrukcji warunkowej? Każda pomoc będzie doceniona.
Dzięki
Możemy potencjalnie sprawdź, czy istnieją różne parametry i dołącz je tylko do "WHERE" w tych przypadkach. Alternatywnie funkcja może przyjmować tablicę asocjacyjną, której używa do odwzorowania różnych kryteriów klauzuli WHERE. Prawdopodobnie jednak chcesz sprawdzić poprawność kluczy, aby upewnić się, że otrzymujesz kolumny, które istnieją. – jchapa
To nie jest ładne, ale możesz zmodyfikować ciąg znaków sql za pomocą instrukcji if/else dla każdego parametru, a następnie przygotować instrukcję później: –
@JeffHawthorne to jest to, dokąd zmierzałem, chociaż myślałem, że będzie bardziej eleganckie rozwiązanie. Obsługuje klauzulę WHERE dla sql, ale co z indeksami readstatement? Jak mam to powiedzieć, aby zignorować 'stmt.setInt (1, id)' i że to tak naprawdę 'stmt.setString (1, nazwa użytkownika)', ponieważ szukam po nazwie tym razem zamiast Id? Być może czegoś mi brakuje: P –