# Datenbankanbindung in Java : Newbie-Frage



## major7 (18. Apr 2005)

Hallo, 

ich habe meine erste Datenbank in Java (embedded mckoi) erfolgreich angebunden, und möchte nun SQL-Queries darüber laufen lassen.
Bisher sieht das ganze so aus: 

Klasse für die Verbindung:

```
import java.sql.*;

public class DbConnection {

	DbConnection(){
		try {
		      Class.forName("com.mckoi.JDBCDriver").newInstance();
		    }
		    catch (Exception e) {
		      System.out.println(
		        "Unable to register the JDBC Driver.\n" +
		        "Make sure the JDBC driver is in the\n" +
		        "classpath.\n");
		      System.exit(1);
	    }	
		String url = "jdbc:mckoi:local://G:/eclipse/workspace/quoteindex/mckoi/db.conf";
		String username = "admin_user";
	    String password = "aupass00";

	    Connection connection;
	    try {
	      connection = DriverManager.getConnection(url, username, password);
	      System.out.println("connection to database established");
	    }
	    catch (SQLException e) {
	      System.out.println(
	        "Unable to make a connection to the database.\n" +
	        "The reason: " + e.getMessage());
	      System.exit(1);
	      return;
	    }
	}
}
```

Klasse für die Abfrage:

```
import java.sql.*;

public class RandomQuote {
	String Quote;
	DbConnection DBC;
	RandomQuote(){
		
                        /* HIER WÜRDE ICH GERNE EIN ARRAY MIT ALLEN DATENSÄTZEN SCHREIBEN */
		

	}
	public String recite(){
		Quote = new String("Hallo");
		return Quote; 
	}
	
}
```

Kann mir jemand mal grundsätzlich die Javasyntax für eine SQL-Abfrage mit Anschliessender Ausgabe o.ä. aufschreiben? Ich komme aus dem MySQL/PHP-Bereich, da gehts so (zur Verdeutlichung, was ich meine): 


```
$stmt="Select * from table";
$result=mysql_query($stmt);
while ($row=mysql_fetch_array($result)){
     echo $row["column"];
}
```

hab schon gesucht, aber kein tutorial gefunden...


----------



## major7 (18. Apr 2005)

Hmmm. nach einigem schmökern habe ich wild probiert, und es klappt. Würde mich noch interessieren ob das halbwegs sauber gecoded ist... 

So siehts nun aus : 


```
import java.sql.*;

public class RandomQuote {
	String Quote;
	DbConnection DBC;
	Statement st;
	
	RandomQuote(){
		
		DBC = new DbConnection();
		st=DBC.makeSt();
		
		try{
			String stmt = "SELECT * FROM quotes";
			ResultSet result = st.executeQuery(stmt);
			while (result.next())
			{
				System.out.println(result.getString("quote"));
			}
		}
		catch(SQLException e){
			System.out.println(
	        "SQL Query erroneous.\n" +
	        "Error: " + e.getMessage());
		}
	}
	public String recite(){
		Quote = new String("Hallo");
		return Quote; 
	}
	
}

/***************************************************************************************/

import java.sql.*;

public class DbConnection {
	Statement stmt;
	Connection connection;
	
	DbConnection(){
		try {
		      Class.forName("com.mckoi.JDBCDriver").newInstance();
		    }
		    catch (Exception e) {
		      System.out.println(
		        "Unable to register the JDBC Driver.\n" +
		        "Make sure the JDBC driver is in the\n" +
		        "classpath.\n");
		      System.exit(1);
	    }	
		String url = "jdbc:mckoi:local://G:/eclipse/workspace/quoteindex/mckoi/db.conf";
		String username = "admin_user";
	    String password = "aupass00";

	    
	    try {
	      connection = DriverManager.getConnection(url, username, password);
	      System.out.println("connection to database established");
	    }
	    catch (SQLException e) {
	      System.out.println(
	        "Unable to make a connection to the database.\n" +
	        "The reason: " + e.getMessage());
	      System.exit(1);
	      return;
	    }
	}
	
	public Statement makeSt(){
		try{
			stmt = connection.createStatement();
			return stmt;
		}catch(SQLException e){
			 System.out.println(
			        "Unable to create a statement.\n" +
			        "The reason: " + e.getMessage());
		}
		return stmt;
	}
}
```

würde mich über sicherheitshinweise, tipps etc freuen.


----------



## abollm (18. Apr 2005)

Ich habe mir deinen Code jetzt nicht im Detail angesehen. Vielleicht noch folgende Hinweise zum Thema "preparedStatement" vs. "executeQuery", die teilweise auch sicherheitsrelevant sind.

Vorteile von preparedStatement:

1. wenn du bestimmte SQL-Abfragen mehrmals hintereinander ausführen musst (z.B. in einer Schleife etc.), dann werden bzw. müssen die betr. Variablen nicht jedes Mal zur Laufzeit gebunden werden, also sind i.d.R. Performanz-Gewinne die Folge, sowie

2. ist es bei einem PreparedStatement wohl auch theoretisch so gut wie unmöglich, den an die DB gesendeten SQL-Code während der Laufzeit von außen zu manipulieren, da es sich bei ihnen ja um parametrisierte und zunächst deklarierte SQL-Anweisungen handelt, die vor dem eigentlichen Ausführen bereits vorkompiliert sind.

Es wird allerdings stets von einigen Zeitgenossen behauptet, dass für Einmal-Aufrufe der Statement-Aufruf schneller sei. Dagegen spricht aber wiederum die Erfahrung, dass bei üblichen SQL-Statements normale Statement-Abfragen sich _nicht_ oder nicht entscheidend performanter gegenüber den entsprechenden PreparedStatement-Abfragen verhalten.

Im übrigen hängt der Gebrauch von PreparedStatement auch immer von der realen RDBMS-Unterstützung ab. Da musst du dich halt vorher informieren.

Also zusammenfassend als einfache Merkregel:

Im Regelfalle - sofern möglich - besser gleich mit PreparedStatement arbeiten., sofern nicht bestimmte zwingende Gründe dagegen sprechen.
Für einfache und schnelle, ausschließliche Testzwecke ist ein Gebrauch von executeQuery dagegen häufig vorzuziehen.


----------

