# SELECT bei Datenbankverbindung



## invictus (2. Jan 2014)

Hallo,

Ich sitze momentan an einem Programm für die Datenbankverbindung durch mySQL.
Zunächst frage ich im Menü ab, welchen SQL-Befehl ich ausführen will: SELECT, INSERT, DELETE und UPDATE.
Wähle ich SELECT werde ich nach 2 Attributen gefragt nach welchen ich suchen will, z.B. Vorname und Name. Allerdings wird weder der Datensatz ausgegeben, noch irgendwelchen Fehlermeldungen.
Mein Lehrer meint, dass liegt darin, dass die Anführungstriche im Menü mit erfasst werden und im Datensatz ja keine Anführungsstriche sind. Wie man diesen Problem behebt, wusste er selber nicht.

Ich habe gelesen, dass man durch replace die Anführungsstriche dann entfernen kann. Es funktioniert dennoch nicht.

Hier mein Quellcode:

[JAVA=42]public class TestMySQL {
	public static void main(String[] args) {
		String driver = "com.mysql.jdbc.Driver";
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException ex) {
			System.out.println("Treiber nicht gefunden!");
		}
		String url = "jdbc:mysql://localhost:3306/kontakte";
		String usr = "root";
		String pwd = "";
		Connection db;
		ResultSet rs;
		String sql;

		String[] options = new String[] { "SELECT", "INSERT", "DELETE",
				"UPDATE" };
		String[] antwortOptions = {
				  "SELECT", "INSERT", "DELETE", "UPDATE" };

				String antwort = (String) JOptionPane.showInputDialog( null,
				          "Optionen",
				          "Was möchtest du ausführen=",
				          JOptionPane.QUESTION_MESSAGE,
				          null, antwortOptions,
				          antwortOptions[1] );

		if (antwort.equals("SELECT")) {
			String[] options1 = new String[] { "","kontaktid", "name", "vorname","email","telefon",
			"PLZ" };
			String[] antwortOptions1 = {
					"", "kontaktid", "name", "vorname","email","telefon",
					"PLZ" };
			String[] antwortOptions2 = {
					"", "kontaktid", "name", "vorname","email","telefon",
					"PLZ" };

			String antwort1 = (String) JOptionPane.showInputDialog( null,
			          "Optionen",
			          "Nach welchen Attribut willst du suchen?",
			          JOptionPane.QUESTION_MESSAGE,
			          null, antwortOptions1,
			          antwortOptions1[1]);

			String filter1 = JOptionPane.showInputDialog("filter1: ");

			String antwort2 = (String) JOptionPane.showInputDialog( null,
			          "Optionen",
			          "Nach welchen weiteren Attribut willst du suchen?",
			          JOptionPane.QUESTION_MESSAGE,
			          null, antwortOptions2,
			          antwortOptions2[1]);

			String filter2 = JOptionPane.showInputDialog("filter2: ");

			antwort1.replace("\"","");
			antwort2.replace("\"","");
//			antwort1 = antwort1.replace(char(34), "");
//			antwort2 = antwort2.replace(char(34), "");
			try {
				db = DriverManager.getConnection(url, usr, pwd);

  // Erstes ? = antwort1, Zweites ? = filter 1, Drittes ? = antwort2, Viertes ? = filter2
				sql = "select * from kontakte where ? like ? and ? like ?";
				PreparedStatement stmt = db.prepareStatement(sql);
				stmt.setString(1, antwort1);
				stmt.setString(2, filter1 + "%");
				stmt.setString(3, antwort2);
				stmt.setString(4, filter2 + "%");

				rs = stmt.executeQuery();

				while (rs.next()) {

					String name = rs.getString("name");
					String vorname = rs.getString("vorname");
					String eMail = rs.getString("eMail");
					String telefon = rs.getString("telefon");
					String PLZ = rs.getString("PLZ");
					JOptionPane.showMessageDialog(null, "Name: "+name+"\n"+"Vorname: "+vorname+"\n"+"email: "
							+eMail+"\n"+"Telefon: "+telefon+"\n"+"PLZ: "+PLZ+"\n");
				}
				db.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}[/code]

Ich bitte um Hilfe.


----------



## fastjack (3. Jan 2014)

select * from kontakte where ? like ? and ? like ?

geht nicht.

select * from kontakte where name like ? and vorname like ?


----------



## invictus (3. Jan 2014)

Und wie kann ich dann zwei beliebige Attribute wählen? Vorname und Name wäre ja fest vorgeschrieben. Ich möchte aber dass man selber entscheidet wonach man sucht, z.B. Vorname und PLZ.


----------



## fastjack (3. Jan 2014)

Dann musst Du das Query dynamisch zusammenbauen, je nachdem was ausgewählt wurde. Kurz gesagt braucht Du mehrere Queries.


----------



## invictus (3. Jan 2014)

Bei meiner Anzahl von Attributen gäbe es zuviele Kombinationsmöglichkeiten.
Der Quellcode wäre viel zu lang, um das zu realisieren.

Gibt es keine andere Möglichkeit?


----------



## fastjack (3. Jan 2014)

Wie gesagt, du musst das Query dynamisch zusammenbauen. Also in einer Schleife, in der Du durch die ausgewählten Felder gehst.


----------



## turtle (3. Jan 2014)

Ich möchte (wieder) mein Lieblingsframework myBATIS nennen.

Dieses kann sehr einfach mit dynamischen SQL umgehen.

Hier mal ein Beispiel, mit dem nach Vorname und/oder Nachname gesucht werden kann.

[XML]	<select id="selectAllPersons" resultType="entities.Person" parameterType="entities.Person">
		select id,vorname,nachname from person
		<where>
		<if test="vorname != null">
			AND vorname like #{vorname}
		</if>
		<if test="nachname != null">
			AND nachname like #{nachname}
		</if>
		</where>
	</select>
[/XML]
Gibt der Benutzer nur den Vornamen ein

```
Person searchPerson = new Person();
				searchPerson.setVorname("Angela");
				List<Person> listPersons = sqlSession.selectList(
						"Person.selectAllPersons", searchPerson);
```
wird folgender SQL-Befehl abgesetzt	

```
select id,vorname,nachname from person WHERE vorname like ?
```
Wird Vor- UND Nachname eingegeben, wird folgender SQL-Befehl abgesetzt. Man beachte das automatische Entfernen vom ersten AND.

```
select id,vorname,nachname from person WHERE vorname like ? AND nachname like ?
```


----------

