datenbankabfrage in sql mit java

Status
Nicht offen für weitere Antworten.

apfelkuchen

Mitglied
hallo.

ich muss aus einer sql datenbank informationen rausholen. leider ist mir java neu und ich kenne mich nicht gut aus.

ich hab jetzt aus 2 programme eines gemacht (ein daten ein/ausgabe programm, und eine abfrage aus eine sql datenbank-programm)

wie kann ich die beiden jetzt zusammenfügen.

dass ich halt irgendwas am bildschirm eingebe, diese datei dann z.b.: bei "SELECT * from taxis WHERE farbe='xxxxx'


wobei xxxxx mein eingegebenes wort wäre....

dies ist mein code... nur leider kann ich es nicht mal dazu bringen, dass das programm beide befehle (ein/ausgabe und dann einfach nur eine select abfrage (unabhängig von der ein/ausgabe) durchführt. die ein/ausgabe findet schon statt. und dann schliesst sich das programm...

Code:
import java.io.*;
import java.sql.*;


public class DatenEintragen {
    
    public static void main(String args[]) throws IOException
      InputStreamReader inStream =
        new InputStreamReader( System.in ) ;
    BufferedReader stdin =
        new BufferedReader( inStream );

    String inData;

    System.out.println("Geben Sie Daten ein:");
    inData = stdin.readLine();

    System.out.println("Sie haben eingegeben: " + inData );
  {

    	
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost/taxiservice","root","kennwort");
            PreparedStatement pstmt = con.prepareStatement("insert into taxis (Marke, Taxi_nummer, color) values('jack V',1230,'gelb')");
            pstmt.executeUpdate();
            pstmt.close();
            con.close();
        }
        catch (SQLException e) {
            System.out.println(e);
            System.out.println(e.getSQLState());
            System.out.println(e.getErrorCode());
        }
        catch (ClassNotFoundException e) {
            System.out.println(e);
        }
    }
}


danke für euere hilfe...
 
also der wird das ganze wohl einmal durchführen. nach dem ersten insert machst du die connection zu.

ferner liest du vom eingangsstream wenn dann nur die erste zeile ein

edit: wobei dein problem imho zu ungenau definiert ist... 😉
 
apfelkuchen hat gesagt.:
[..]
dies ist mein code... nur leider kann ich es nicht mal dazu bringen, dass das programm beide befehle (ein/ausgabe und dann einfach nur eine select abfrage (unabhängig von der ein/ausgabe) durchführt. die ein/ausgabe findet schon statt. und dann schliesst sich das programm...

[..]
danke für euere hilfe...

Das ist auch kein Wunder, denn es sind einige Fehler im Code. Hier auf die Schnelle dein Programm in abgewandelter, lauffähiger Form. Jetzt wird die Eingabe auch ausgeführt, sofern sie syntaktisch und inhaltlich richtig ist:
Code:
import java.io.*;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;


public class DatenEintragen {

	public static void main(String args[]) throws IOException {
		InputStreamReader inStream = new InputStreamReader(System.in);
		BufferedReader stdin = new BufferedReader(inStream);

		String host = "localhost";
		String db = "taxiservice";

		String inData;

		System.out.println("Geben Sie Ihr INSERT-Statement ein (ohne Semikolon):");
		inData = stdin.readLine();

		System.out.println("Sie haben eingegeben: " + inData);
		{

			try {
				Class.forName("com.mysql.jdbc.Driver").newInstance();
				//Class.forName("org.gjt.mm.mysql.Driver");
				/*
				 * Connection con = DriverManager.getConnection(
				 *    "jdbc:mysql://localhost/taxiservice", "root",
				 *    "kennwort");
				 * 
				 */
				Connection con = DriverManager.getConnection("jdbc:mysql://"+host+"/"+db,
					      "root", "kennwort");
				//PreparedStatement pstmt = con
				//		.prepareStatement("insert into taxis (Marke, Taxi_nummer, color) values('jack V',1230,'gelb')");
				PreparedStatement pstmt = con
						.prepareStatement(inData);
				pstmt.executeUpdate();
				pstmt.close();
				con.close();
			} catch (SQLException e) {
				System.out.println(e);
				System.out.println(e.getSQLState());
				System.out.println(e.getErrorCode());
			} catch (ClassNotFoundException e) {
				System.out.println(e);
			} catch (Exception e) {
				System.err.println("Ausnahme/Exception: " + e.getMessage());
				System.err.println("Ausnahme/Exception: " + e.getCause());
			}
		}
	}
}
 
das passst schon so.. aber kann ich das inData so benutzen, dass ich einfach nur die sachen eingeben muss die nötig sind...

z.b: steht am bildschirm:

Geben Sie die gewünschte Farbe ein:

dann wird diese eingegeben. und es wird automatisch ein Select befehlr ausgeführt, und die eingegebene farbe wird ins sql statement eingefügt?
 
apfelkuchen hat gesagt.:
das passst schon so.. aber kann ich das inData so benutzen, dass ich einfach nur die sachen eingeben muss die nötig sind...
z.b: steht am bildschirm:
Geben Sie die gewünschte Farbe ein:
dann wird diese eingegeben. und es wird automatisch ein Select befehlr ausgeführt, und die eingegebene farbe wird ins sql statement eingefügt?

Nein, so einfach geht das mit diesem Code natürlich nicht. Der erwartet einen vollständig korrekten SQL-Befehl (z.B. DML). Wenn das so wie du beschreibst funktionieren soll, müsstest du dir beispielsweise eine Auswahl einbauen, auf die du dann das entsprechende Schlüsselwort in den SELECT-Befehl einfügst. Im Code muss zudem klar sein, welche Tabelle mit welcher Spalte du ansprichst.

DP hat hat oben bereits geschrieben, dass er dein Problem n.s.M. ungenau beschrieben ist. Vielleicht stellst du noch einmal detailliert dar, was du genau und möglichst wie du es erreichen möchtest.
 
hi

ich lerne in der schule zwar java verstehe es jedoch nicht

wie kann ich am schnellsten lernen mit JDBC zu arbeiten?

lg
 
hätte eine frage zum folgenden programmteil
-------------------------------------------------
Code:
package u07plf;

import java.sql.*;
import java.util.*;

public class u07main {

  public static void main(String args[]){
    myFactory myFa=new myFactory();
    Connection dbcon=null;
    IHouse house = new House(1);

    try {
      dbcon = myFa.createConnection("user", "pwd");
      house.setConnection(dbcon);
    }
    catch (Exception e) {
      System.out.println("Fehler!");
    }

    house.get();
    System.out.println(house);

   }
}
-------------------------------------------
kann i des house net so ausgeben weil er liest ma de daten aus da datenbank aus

Edit von L-ectron-X: Code-Tags eingefügt.
 
kann ich das house nicht so ausgeben
er liest mit die daten aus der datenbank heraus jedoch schreibt er sie mir nicht auf den bildschirm

verstehst du mich sonst nicht?
 
re hat gesagt.:
kann ich das house nicht so ausgeben
er liest mit die daten aus der datenbank heraus jedoch schreibt er sie mir nicht auf den bildschirm

verstehst du mich sonst nicht?

Das Objekt "house" kannst du auch nicht so einfach ausgeben.

Wie ist das Objekt "house" aufgebaut?
 
ich habe noch nicht alle methoden ausprogrammiert
------------------------------------------------------------
Code:
package u07plf;

import java.util.*;
import java.sql.*;

public class House implements IHouse {

  private int id;
  private String street;
  private int nr;
  private int zipCode;
  private String city;

  private ArrayList myFlats = new ArrayList();
  private Connection connection;

  public House() {
  }

  public House(int id) {
    this.id=id;
  }

  public House(int id, String street, int nr, int zipCode, String city) {
    this.id = id;
    this.street = street;
    this.nr = nr;
    this.zipCode = zipCode;
    this.city = city;
  }

  public void setData(int id, String street, int nr, int zipCode, String city){
    this.id=id;
    this.street=street;
    this.nr=nr;
    this.zipCode=zipCode;
    this.city=city;
  }

  public int getId(){
    return this.id;
  }
  public String getStreet() {
    return this.street;
  }
  public int getNr() {
    return this.nr;
  }
  public int getZipCode() {
    return this.zipCode;
  }
  public String getCity() {
    return this.city;
  }
  public void addFlat(IFlat f) throws InconsistencyException {
  }
  public IFlat getFlat(int top) {
  return null;
  }
  public Collection getFlats() {
   return null;
  }
  public IFlat removeFlat(int top) {
    return null;
  }
  public boolean equals(Object o) {
   return true;
  }
  public String getTableName() {
    return "House";
  }
  public void setConnection(Connection c) {
    try{
      this.connection = c;
    }

    catch (Exception e) {
      System.out.println("Fehler bei Datenbankzugriff!");
      return;
    }

  }
  public IHouse get(int id)
  {
    IHouse h1 = null;
    Statement sqlStmt;
    ResultSet rSet;
    try {
      sqlStmt = connection.createStatement();
      String strSQL = "SELECT * FROM ".concat(this.getTableName()) + " WHERE id = " + id;
      rSet = sqlStmt.executeQuery(strSQL);
    }
    catch (Exception e) {
      System.out.println("Fehler bei Datenbankzugriff!");
      return h1;
    }
    try {
      if (rSet == null) {
        return null;
      }
      while (rSet.next()) {
        int ID_db = rSet.getInt("id");
        String street_db = rSet.getString(2);
        int number_db = rSet.getInt("number");
        int zipcode_db = rSet.getInt("zipcode");
        String city_db = rSet.getString(5);
        h1 = new House(ID_db, street_db, number_db, zipcode_db, city_db);
      }
      sqlStmt.close();
      return h1;
    }
    catch (Exception e) {
      System.out.println("Fehler bei Tabellenabfrage!");
      return null;
    }

  }
  public void get() {
    Statement sqlStmt = null;
    ResultSet rSet = null;

    try{
      sqlStmt = connection.createStatement();
      String strSQL = "SELECT * FROM ".concat(this.getTableName()).concat(" WHERE id = ") + this.id;
     System.out.println(strSQL);
      rSet = sqlStmt.executeQuery (strSQL);
    }
    catch (Exception e) {
       System.out.println("Fehler bei Datenbankzugriff!");
    }
    try {
      while (rSet.next()) {
        int ID_db = rSet.getInt("id");
        String street_db = rSet.getString(2);
        int number_db = rSet.getInt("nr");
        int zipcode_db = rSet.getInt("zipcode");
        String city_db = rSet.getString(5);
        this.setData(ID_db, street_db, number_db, zipcode_db, city_db);
      }
      sqlStmt.close ();
    }
    catch (Exception e) {
      System.out.println("Fehler bei Tabellenabfrage!");
    }
  }

  public void save() throws InconsistencyException {
  }
  public Collection list() {
    return null;
  }
  public Collection list(String where) {
    return null;
  }
  public void delete() throws InconsistencyException {
  }
  public int compareTo(Object o) {
    return 0;
  }
}


Edit von L-ectron-X: Code-Tags eingefügt.
 
habe meinen fehler gerade gefunden

ohne toString lässt sich das nicht ausgeben

irgendwie logisch aber ok

wie verstehe ich jdbc am schnellsten?

lg
 
int ID_db = rSet.getInt("id");
String street_db = rSet.getString(2);
int number_db = rSet.getInt("number");
int zipcode_db = rSet.getInt("zipcode");
String city_db = rSet.getString(5);
h1 = new House(ID_db, street_db, number_db, zipcode_db, city_db);
}

spaltennamen würde ich dynamisch auslagern und referenzieren...

String strSQL = "SELECT * FROM ".concat(this.getTableName()).concat(" WHERE id = ") + this.id;

nimm lieber den stringbuffer, der string-concat bricht dir irgendwann den hals...

ansonsten biste mit dem jdbc ja schon gut zugange... geh mal die api von connection, statement/preparedstatement und resultset durch, dann siehst du was alles geht und der rest ist kein akt mehr.

die kommunikation mit dem rdbmc funktioniert ja schon, der rest ist "kinderkacke" 😉
 
naja so wirklich kenne ich mich noch nicht aus aber ist wird schön langsam

mein einziges problem ist das ich in der schule dann nur zwei stunden zeit habe um die aufgabe zu lösen und das geht sich bei mir nie aus weil ich zu lange brauche

werde mir jetzt mal die API anschauen
danke
 
ich werde aus der API nicht wirklich schlauer

wie soll ich einen datensatz löschen bzw. einfügen?

bitte helft mir
 
ich habe wieder ein problem
wenn ich das insert in die datenbank mache geht es wenn ich durchsteppe, wenn ich das programm jedoch von alleine laufen lasse geht es nicht

wieso?
 
re hat gesagt.:
ich habe wieder ein problem
wenn ich das insert in die datenbank mache geht es wenn ich durchsteppe, wenn ich das programm jedoch von alleine laufen lasse geht es nicht

wieso?

Meinst du, wenn du mit dem Debugger durchsteppst, oder was?
 
ich arbeite mit Borland JBuilder X Foundation
wenn ich F8 drücke und dann in das programm hineingehe geht es wenn ich nur auf den grünen pfeil drücke geht es nicht
 
Mit dem kenne ich mich nicht aus, aber F8 deutet auf eine Debugger-Funktionalität hin. Ich denke, dass es damit aus internen Gründen nicht geht. Das ist ohnehin ein grundsätzliches Problem bei DB-Transaktionen, dass man die nicht ohne weiteres schrittweise "durchsteppen" kann.

Ich habe so ein Tool für Oracle-DBen, damit kann man das (für Stored Procedures in der DB).
 
es ist nur komisch weil wenn ich durchsteppe geht es
dann probiere ich den gleichen datensatz nochmals einzufügen und lasse das programm alleine durchlaufen er gibt mir dann auch den richtigen fehler aus das der datensatz schon vorhanden ist. jedoch ohne durchsteppen tut er nichts

andere sache: ich möchte nicht kritisieren aber die uhr im forum ist noch auf winterzeit

ich weiß nicht wie ich das problem lösen soll, dass es auch ohne steppen geht

lg
 
re hat gesagt.:
es ist nur komisch weil wenn ich durchsteppe geht es
dann probiere ich den gleichen datensatz nochmals einzufügen und lasse das programm alleine durchlaufen er gibt mir dann auch den richtigen fehler aus das der datensatz schon vorhanden ist. jedoch ohne durchsteppen tut er nichts
[..]
ich weiß nicht wie ich das problem lösen soll, dass es auch ohne steppen geht

lg

Ach so, ich habe dich da falsch verstanden: Mit Durchsteppen geht es und ohne nicht!

Dann lasse dir den INSERT-Befehl einmal an der betreffenden Stelle aus dem Programm heraus auf die Konsole ausgeben. Vielleicht kommst du dann weiter.
 
vielleicht sieht's du ja den fehler ich finde ihn nicht
----------------------------------------------------------
wenn du willst kann ich dir auch die gesamte angabe schicken dann ist es vielleicht aufschlußreicher was ich machensoll
-----------------------------------------------------------------------
Code:
public void save() throws InconsistencyException {
    Statement sqlStmt = null;
    ResultSet rSet = null;

    try {
      sqlStmt = connection.createStatement();
      String strSQL = "INSERT INTO "+this.getTableName()+" values("+this.id+",'" +this.street+"',"+this.nr+","+this.zipCode+",'"+this.city+"')";
      System.out.println(strSQL);
      int change=sqlStmt.executeUpdate(strSQL);

      connection.commit();
    }

    catch (Exception e) {
      System.out.println("Fehler bei Datenbankzugriff!");
    }
  }

Edit von L-ectron-X
@re: Bitte Code-Tags benutzen!
 
das ist einmal die angabe
--------------------------------------
Gebäudeverwaltung mittels JDBC

Erstelle eine Java-Applikation, die Häuser mit deren Wohnungen in einer relationalen Datenbank verwaltet.

Ein Haus besitzt:
•Id (pos. Zahl, Primärschlüssel)
•Straße (String, max. 50 Zeichen)
•Hausnummer (3-stellige, pos. Zahl)
•Postleitzahl (4-stellige, pos. Zahl)
•Ort (String, max. 30 Zeichen)

Ein Haus besteht aus mehreren Wohnungen (0-n).
Zu jeder Wohnung wird gespeichert:
•Top (=Wohnungsnummer, 2-stellige, pos. Zahl)
•Fläche in m2 (Zahl)
•Belegt (ja/nein)

Die Verwaltung soll nun folgende Funktionalität umfassen:
•Neues Haus anlegen
•Hausdaten ändern
•Haus löschen
•Wohnung zu Haus hinzufügen
•Wohnungsdaten ändern
•Wohnung löschen

Wohnungen müssen einem Haus eindeutig (über dessen Id) zugeordnet sein.
Ein Haus kann nur dann gelöscht werden, wenn es keine Wohnungen besitzt, die belegt sind.

Die Anwendung soll vorläufig noch ohne grafische Oberfläche arbeiten, sodass Präsentationsklassen erst später mit Swing erstellt werden. Stattdessen sollen einfache Konsolen-Testklassen verwendet werden, um die komplette Funktionalität der Applikation überprüfen zu können.

Damit auch jemand anderer deine Implementierung weiterverwenden kann, musst du folgende Interfaces verwenden:

Code:
public interface IHouse extends Comparable {
// public House(int id);
// public House(int id, String street, int nr, int zipCode, string city);
public void setData(int id, String street, int nr, int zipCode, string city);
public int getId();
public String getStreet();
public int getNr();
public int getZipCode();
public String getCity();
public void addFlat(IFlat f) throws InconsistencyException;
public IFlat getFlat(int top);
public Collection getFlats(); // liefert alle Wohnungen des Hauses
public IFlat removeFlat(int top); // entfernt eine Wohnung vom Haus (auch aus der DB!), falls sie frei ist oder liefert null
public boolean equals(Object o); // vergleicht zwei Häuser mittels Id
public String getTableName(); // liefert den Namen der DB-Tabelle
public void setConnection(java.sql.Connection c);
public IHouse get(int id); // liefert ein Haus aus der DB oder null
public void get(); 	// lädt sich selbst aus der DB,  d.h. setzt seine eigenen Attributewerte
public void save() throws InconsistencyException; // speichert sich selbst in die 
// Datenbank
public Collection list(); liefert alle Objekte der Klasse House
public Collection list(String where); // liefert alle Objekte der Klasse House entsprechend der übergebenen where-Klausel
public void delete() throws InconsistencyException; // löscht sich selbst aus der DB
} 

public interface IFlat extends Comparable {
// public Flat(int houseId, int top);
public void setData(int area, boolean occupied);
public int getTop();
public int getArea();
public boolean isOccupied();
public boolean equals(Object o); vergleicht zwei Wohnungen mittels top
public String getTableName();
public void setConnection(java.sql.Connection c);
public IFlat get(int id); // liefert eine Wohnung aus der DB oder null
public void get(); // lädt sich selbst aus der DB,  d.h. setzt seine eigenen Attributwerte
public void save() throws InconsistencyException; // speichert sich selbst in die Datenbank
public Collection list(); liefert alle Objekte der Klasse Flat
public Collection list(String where); // liefert alle Objekt der Klasse Flat entsprechend der übergebenen where-Klausel
public void delete() throws InconsistencyException; 
// löscht sich selbst aus der DB, falls nicht belegt!
}

Erweiterung:

Um die die Herstellung einer Verbindung zur Datenbank zu kapseln und möglichst wieder verwendbar zu machen, verwende folgendes Interface:

Code:
public interface ConnectionFactory {
  public java.sql.Connection createConnection(String user, String pwd);
}

Je nach verwendeter Datenbank können somit entsprechende Klassen implementiert werden.
----------------------------------------
ich habe jetzt angelegt
House
Flat
IHouse ->Inteface zu House
IFlat->Interface zu Flat

ConnectionFactory
myFactory->hier ist die ConnectionFactory ausprogrammiert
InconsistencyException
Hauptprogramm


Edit von L-ectron-X
@re: Bitte Code-Tags benutzen!
 
Ehrlich gesagt, habe ich zurzeit keinen Ansatz. Noch eine Frage zu deinem INSERT-Statement:

Setzt du das im (nicht geposteten) Hauptprogramm ab?

Übrigens ist die gesamte Angabe mit Bezug auf Praxisrelevanz ein wenig lücken-/fehlerhaft, z.B.

- Keine DB-Angabe für den Foreign Key Gebäude bei Wohnungen
- Man sollte bei einer derartigen Aufgabenstellung Gebäude/Wohnungen _nicht_ einfach aus der DB löschen
- Hausnummern können auch Buchstaben enthalten
- ...
 
package u07plf;

import java.sql.*;
import java.util.*;

public class u07main {

public static void main(String args[]) {
myFactory myFa = new myFactory();
Connection dbcon = null;
IHouse house = new House();

try {
dbcon = myFa.createConnection("User", "pwd");
house.setConnection(dbcon);
}
catch (Exception e) {
System.out.println("Fehler!");
}

house.setData(10, "Hauptstraße", 3, 1020, "Wien");
System.out.println(house);

try {
house.save();
}
catch (InconsistencyException e) {
e.printStackTrace();
}
}
}
 
Hallo, ich konnte jetzt ein bisschen weiterkommen bei meinen db_abfragen. Jetzt stehe ich wieder vor einem problem. Hier sind teile meiner Codes:

Hauptprogramm:

Code:
if (suchen == 2) 
				{
					System.out.println("Vorname eingeben: ");
					
					
					Input.readdbTaxifahrer(eingabe);
					
				}

da ließt er ein, wonach der user in der Datenbank suchen soll und gibt es weiter an eine andere Datei wo die SQL geschichte wartet:

Code:
public static String readdbTaxifahrer (String eingabe)
	 	{
	 	
 		String host = "localhost";
 		String db = "taxiservice";
 		String Befehl = "SELECT * FROM `taxifahrer` ";
 		
 		try {
 			Class.forName("com.mysql.jdbc.Driver").newInstance();
 			Connection con = DriverManager.getConnection("jdbc:mysql://"+host+"/"+db,"root","sync2k");

 		    Statement stmt = con.createStatement();
 		    
 		    String sql = "select * from taxifahrer where Vorname='";
 		    sql = sql + eingabe + "';" ;
 		    
 		    ResultSet results = stmt.executeQuery(sql);
            while(results.next())
            {
                System.out.println();
                System.out.println("Vorname: " + results.getString("Vorname"));
                System.out.println("Nachname: " + results.getString("Nachname"));
                System.out.println("SVN: " + results.getString("SVN"));
            }
 			con.close();
 			
 		}
 		
 		catch (SQLException e) {
 			System.out.println(e);
 			System.out.println(e.getSQLState());
 			System.out.println(e.getErrorCode());
 		}
		
		catch (ClassNotFoundException e) {
			System.out.println(e);
		}	
		
		catch (Exception e)  {
			System.err.println("Ausnahme/Exception: " + e.getMessage());
			System.err.println("Ausnahme/Exception: " + e.getCause());
			
			}
		return Befehl;
		}

jetzt möchte ich es so machen, dass ich nach 3 verschiedenen sachen suchen kann: z.B.: Vorname, Nachname und SVN.... wie kann ich es so machen, dass der User 3 Sachen eingeben kann. und nur die berücksichtigt werden, wo etwas eingegeben wurde.

Falls er beim Vornamen etwas nicht eingibt und einfach auf Enter drückt soll er weitergehen zum nächsten eingabefeld (Nachname)... und dann am Ende soll er die 3 (oder auch nur zwei oder eines) weiterschicken zum SQL Befehl...

danke
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben