Wyszukiwanie (java + mysql)

0

Witam,
mam oto taki problem. Pisze prosciutka aplikacje bazodanowa (java+mysql) do katalogowania ksiazek. Zalozmy ze w bazie mam jedna tabele Ksiazki z kolumnami, np. autor, tytul, wydawca, rok_wydania, isbn, cena. W programie chce umozliwic uzytkownikowi wyszukiwanie ksiazek po tych polach, przy czym nie kazde z pol musi byc wypelnione. Czyli np. uzytkownik wyszukuje ksiazki tylko po tytule lub po autorze i wydawcy lub w dowolnej innej kombinacji. Problem polega na tym, ze teraz nie wiem w jaki sposob zapisac zapytanie do bazy w programie w jakis uniwersalny sposob. Bezsensu byloby przeciez pisac zapytanie dla kazdej mozliwej kombinacji wyszukiwania i wybranie odpowiedniej w zaleznosci od wypelnionych pol przez uzytkownika, czyli np:

select ... where autor = ... and wydawca = ...
select ... where cena = ...
select ... where autor = ... and tytul = ... and cena =...
itd

W jaki sposob to rozwiazac?

0

po prostu wygeneruj je dynamicznie.

Może to wyglądać mniejwięcej tak:
(Nie testowałem, mogą być błędy).

...
JTextField autor;
JTextField isbn;
JTextField tytul;
JTextField autor;
JComboBox rokwydania;
....

public PreparedStatement generujZapytanie(Connection conn) throws SQLException {
	int autorIndex = -1;
	int isbnIndex = -1;
	int tytulIndex = -1;
	int rokIndex = -1;
	
	int currentIndex = 1;

	String select = "SELECT * FROM ksiazka WHERE ";

	if(!autor.getText().trim().isEmpty()) {
		select += "autor = ? AND ";
		autorIndex = currentIndex;
		currentIndex++;
	}
	if(!isbn.getText().trim().isEmpty()) {
		select += "isbn = ? AND ";
		isbnIndex = currentIndex;
		currentIndex++;
	}
	if(!tytul.getText().trim().isEmpty()) {
		select += "tytul = ? AND ";
		tytulIndex = currentIndex;
		currentIndex++;
	}
	if(rokwydania.getSelectedIndex() != -1) {
		select += "rok = ? AND ";
		rokIndex = currentIndex;
		currentIndex++;
	}
	
	if(select.endsWith(" WHERE "))
		select = select.substring(0, select.length() - " WHERE ".length());
	else if(select.endsWith(" AND "))
		select = select.substring(0, select.length() - " AND ".length());
	
	PreparedStatement pstmt = connection.prepareStatement(select);

	if(autorIndex != -1)
		pstmt.setString(autorIndex, autor.getText());
	if(isbnIndex != -1)
		pstmt.setString(isbnIndex, isbn.getText());
	if(tytulIndex != -1)
		pstmt.setString(tytulIndex, tytul.getText());	
	if(rokIndex != -1)
		pstmt.setString(rokIndex, rok.getSelectedItem().toString());
	
	return pstmt;
}
...
0

Ogromne dzieki, o to mi chodzilo. Wystarczylaby sama idea rozwiazania a widze ze nawet przykladowy kod zamiesciles. Tym bardziej Ci dziekuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1