Statement und ResultSet

Hi,

ich habe eine mySQL Datenbank erstellt mit 3 Spalten. Die erste ist Index auto_increment. Die anderen 2 heissen “name” und “vorname”. Die Tabele besteht aus 4 Zeilen, dort habe ich Namen von Leuten gespeichert.

Ich konnte erfolgreich Verbindung zu meiner mySQL Datenbank herstellen.
Ich habe aber ein paar Fragen dazu. Hier ist mein Code:

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.Connection;


public class Verbindung {

	public static void main(String[] args) {
		
		//Klassen-Loader
		try {
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("Treiber geladen.");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Connection connection = null;
		
		String db = "jdbc:mysql://localhost/vladi";
		String user = "root";
		String pw = "";
		
		try {
			connection = (Connection) DriverManager.getConnection(db,user,pw);
			System.out.println("Verbindung hergestellt");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		
		Statement statement = null;
		
		try {
			statement = connection.createStatement();
			System.out.println("Statement wurde erzeugt");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		String sql = "SELECT * FROM test";
		
		try {
			ResultSet res = statement.executeQuery(sql);
			System.out.println("Querry wurde durchgeführt");
			
			while(res.next()){
				String name = res.getString("name");
				String vorname = res.getString("vorname");
				System.out.println(name+" "+vorname);
			}
		
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

}
  1. Ich habe in Java gelernt, dass wenn ich ein Objekt benutzen will, muss ich neue Instanz von dem erzeugen, hier wird keine Instanz erzeugt und das Objekt wird auf null gesetzt. Warum?
  2. Könnte mir jemand diese 2 Klassen Statement und ResultSet näher erläuter? Also was die hier genau machen und wofür ich die hier brauche?
    Ich verstehe das so: Die Statement Klasse macht eine Anfrage zu der Datenbank und die ResultSet Klasse holt und speichert Daten aus dieser Anfrage(also Statement). Ist ResultSet nur für Ausgabe der Daten aus der Anfrage gedacht?
  3. Warum musste ich mein DriverManager Objekt zu Connection umwandeln? Auf der DVD hat er ohne diese Umwandlung gemacht und Eclipse hat nicht gemeckert.

So wenn die Fragen beantwortet sind, kommen dann meine weitere Fragen :D.

Danke.

so um dich bisschen Aufzuklären :wink:

  1. in meinen Augen schlechte Programmierung extrem Fehler anfällig ich würde niemals etwas auf null setzen nur wenn es nicht anders geht.
    Die initialisierung ist bei dem DriverManager.getConnection, das gibt dir die Connection zurück und du musst die auch nichtmehr casten das ist schon eine Connection

  2. Das Statement ist im gewissen Sinne dein Fenster wo du die Abfragen und so eingeben kannst, und das ResultSet das Ergebnis und da du nur ein Ergebnis bei SELECT bekommst nimmt man auch nur da das Resultset

  3. siehe 1. :wink: und das ist kein Objekt du benutzt eine statische Methode der Klasse

Hmm, also wenn ich es nicht umwandle dann sag er mir

Type mismatch: cannot convert from Connection to Connection. ::crazy . Habe ich falsche Klasse importiert?

Wie würdest du es ohne null schreiben?

jop falsche Connection :wink:
einfach java.sql.Connection importieren
und ohne null einfach weglassen :wink:

Wenn ich null entferne, dann sagt eclipse: The local variable connection may not have been initialized. Wenn ich dann eclipse lasse den Fehler zu beheben, dann fügt eclipse auch “= null” hinzu.

achso ja
das liegt an den try catch Block
mach mal einen großen dann gibs diese Probleme nichtmehr

Darf man Fragen warum!?

So jetzt kommt nächste Frage. Ich möchte jetzt zb nur Daten aus der 3 Zeile(Index 2) auslesen. Ich muss bestimmt diesen String anpassen „SELECT * FROM test“ oder? Wenn ja, wie :smiley: ?

wolltest du nicht einen Bogen um SQL machen :wink:

SELECT [column [AS name] [,colmn [AS name], … ] | * FROM [name], [table [name], …] WHERE

als Info du kannst statt dem * auch die Spaltennamen schreiben passen dir die Namen der Spalten nicht kannst du auch sagen Spalte AS neuername

nach FROM kommt immer eine Tabelle (oder mehrere) und wenn du sagst Tabelle t kannst du statt dem Tabellennamen danach auch t schreiben

danach kommt dann WHERE damit kannst du das eingrenzen mit Spaltenname = Bedingung, statt = kannste auch <> machen

das als kleiner schnell Kurs SQL :wink:

weil du dadurch schnell übersiehst ob etwas initialisiert wurde oder nicht, das hatte ersteiner bei mir im Studium, er wundert sich warum er laufend null hat bis er dann gesehen hat das er irgendwie die Wertezuweisung vergessen hat.
Hätte er das = null nicht gemacht hätte Eclipse/Java was gesagt

Als SQL-Neuling wird dir diese Seite vermutlich auch weiterhelfen

http://www.techonthenet.com/index.php

[edit]

[QUOTE=EagleEye]weil du dadurch schnell übersiehst ob etwas initialisiert wurde oder nicht, das hatte ersteiner bei mir im Studium, er wundert sich warum er laufend null hat bis er dann gesehen hat das er irgendwie die Wertezuweisung vergessen hat.
Hätte er das = null nicht gemacht hätte Eclipse/Java was gesagt[/QUOTE]

Hm, Ansichtssache. Ich persönlich bekomm lieber ne NullPointer um die Ohren geworfen. Gibt Situationen (z. B. nen try-catch Block :wink: ) wo ich einfach die Variable außerhalb auch brauch. Gut, ich kann dann falls wirklich ein Fehler auftritt der Variable immer noch null oder einen Wert zuweisen, aber irgendwie hab ich mir das so angewöhnt. Ist denk ich mal auch ne Geschmackssache.

Hab jetzt nur gedacht, du kennst einen wirklich driftigen Grund warum man das so nicht machen sollte (Mal ausgenommen von der eigenen Verplantheit :wink: ).

String sql = “SELECT [column [AS index 1] FROM test”;

Also so funktioniert nicht? Wie muss das richtig heissen?

SELECT vorname, name FROM Test WHERE id = 2

Schau dir die Seite mal an, ist echt spitze :wink:

[QUOTE=Null]SELECT vorname, name FROM Test WHERE id = 2

Schau dir die Seite mal an, ist echt spitze ;)[/QUOTE]

Danke für die Seite, die ist echt gut. Mit dem Code passt noch nicht ganz. Die id steht für index?

Aus deinem Post hab ich net 100pro rauslesen können wie deine Index-Spalte jetzt heißt. Also einfach „id“ durch den Namen deiner Index-Spalte ersetzen. Dann sollte es funktionieren …

Das Feld heisst index und besteht aus 1, 2, 3, 4 Feldern/Werten.

jup, dann einfach

SELECT name, vorname FROM test WHERE index = 2

kann sein, dass MySQL am Ende noch ein Semikolon benötigt. Hab aber wirklich kA, normalerweiße benutze ich nur HSQL.

Also ich will dass er nur mir Daten aus der Zeile zb 2 ausgibt, das ist index 2 Zeile. Dort steht zb John Smith.

Treiber geladen.
Verbindung hergestellt
Statement wurde erzeugt
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘index = 2’ at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3118)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3047)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1166)
at Verbindung.main(Verbindung.java:47)

EDIT:

ich habe so versucht
String sql = “SELECT vorname, name FROM test WHERE index = 2”;
und dann so
String sql = “SELECT vorname, name FROM test WHERE index = 2;”;

Hm, imho ist da alles richtig. Schick das Statment mal aus einer SQL-Konsole ab ob du da auch einen Fehler bekommst.

[edit] Bzw. poste mal den genauen Aufbau deiner Tabelle.