# Datenbank-Klasse erstellen - brauche Ansatz!



## onebigman (27. April 2005)

Hi,

ich hab mich nun nen bissel in Java eingelesen und bin jetzt dabei mir eine JavaKlasse für eine MySql-Datenbank zu erstellen.

habe auch schon nen bissel was, aber hab da nen Problem. Eigentlich möcht ich erst mit der DB eine Verbindung aufbauen, dann die Methoden Update/Insert und Select hinzufügen. 

habe aber immer nen Problem mit dem Statement bekommen.

Dann hab ich es aber erst mal so gelöst:


```
import java.sql.*;

public class mysql_verbindungstest02 {
  Statement stm;
  String db;
  String user;
  String pw;
  String sql;
  Connection verbindung = null;

  public void db_insert(String sql) {
    try
    {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Kann Treiber laden");
            try {
                    verbindung = DriverManager.getConnection(db,user,pw);
                    Statement stm;
                    try {
                      stm = verbindung.createStatement();
                      System.out.println("verbindung ok");
                      /////////////////////////////////////////
                      try {
                        int anzahl = stm.executeUpdate(sql);
                      } catch (SQLException e) { }
                      /////////////////////////////////////////

                    } catch (SQLException e) {}
            } catch (Exception e) {
                    System.out.println("Exception: " + e);
            }
    } catch(Exception e) {
            System.err.println("Kann Treiber nicht laden");
    }
  }

    public static void main(String[] args) throws Exception
    {
      String sql;
      mysql_verbindungstest02 objDB = new mysql_verbindungstest02();

      objDB.db = "jdbc:mysql://localhost:3306/#####";
      objDB.user = "######";
      objDB.pw = "######";

      sql ="insert into testdb1 (id,name,vorname)  values ('','testname', 'testvorname')";

      try {
        objDB.db_insert(sql);
      } catch(Exception ex) {
        System.out.print( sql + "kann nicht eingetragen werden");
      }
    }
}
```

auf dieser Art müßte ich jedesmal neu Verbinden, da ich ja noch ne Methode zum auslesen benötige (Select).

Wie kann ich das vereinfachen?


----------



## kicmad00 (27. April 2005)

Ich löse alle Datenbankprogramme auf diese Art:


```
import java.sql.*;

public class MyConnection extends java.lang.Object {
 
    public MyConnection() {
            try {
           Class.forName("com.mysql.jdbc.Driver").newInstance();
	    connection = DriverManager.getConnection(
		"jdbc:mysql://localhost/Weihnachtsgeschenke");
        }
        catch(SQLException e) {   
            System.out.println(e.getMessage());
            System.out.println(e.getSQLState());
            System.out.println(e.getErrorCode());
        }
        catch(Exception e) {      
            System.out.println(e.getClass().toString() +" / "+ e.getMessage());
        }
    }
    public ResultSet executeSQL(String sqlStatement) //SQL Statement ausführen
    {
        try {
            Statement stmt=connection.createStatement();   
            return stmt.executeQuery(sqlStatement);
        }
        catch(SQLException e){
            System.out.println(e.getSQLState());
        }
        return null;
    }
       public void executeUpdate (String sqlStatement){
        try {
            Statement stmt = connection.createStatement();
            stmt.executeUpdate(sqlStatement);
        }
        catch (SQLException e){
            System.out.println(e.getSQLState());
        }
    }    
    private Connection connection;    
}
```

Vielleicht hilft dir das ja weiter


----------



## Toastbrot666 (27. April 2005)

Ich wuerde es auch so lösen wie mein Vorredner schonmal im Quellcode gezeigt hat.

Du brauchst eigene Methoden die unterschiedliche Dinge machen. D.H. erstmal lässt Du die Verbindung aufbauen und dann wählst du unterschiedliche Methoden aus, um die genannten Statements auszuführen.

Ich habe das mir noch weiter getrieben das ich selbst für das Statement, die Connection und den DriverLoad eigene Methoden habe.

Der Vorteil ist, wenn du diese Isolierte Klasse dann irgendwann hast kannste das in all deinen anderen Projekten wiederverwenden. Spart wunderbar viel arbeit.


----------



## Thomas Darimont (27. April 2005)

Hallo!

Wenn du unbedingt mit Plain JDBC Programmieren musst dann solltest du dir mal das Springframework anschauen: http://www.springframework.org/
Dort gibt's (neben vielen anderen schönen Dingen) eine extra für Plain JDBC Aufgaben vorgesehene Klasse namens JDBCTemplate welche dir sehr viel unangenehme Aufgaben (Exception Handling / Datenbankresourcenverwaltung...) etc. abnehmen kann...

Damit kann man beispielsweise sowas machen:

```
private List<Employee> queryForPersons(String sql) {
		final List<Employee> list = new ArrayList<Employee>();
		getJdbcTemplate().query(sql, new RowCallbackHandler() {
			public void processRow(ResultSet rs) throws SQLException {
				Employee emp = new Employee();
				emp.setEmpNo(Integer.valueOf(rs.getInt(1)));
				emp.setName(rs.getString(2));
				emp.setJobTitle(rs.getString(3));
				emp.setHireDate(rs.getDate(4));
				emp.setSalary(Double.valueOf(rs.getDouble(5)));
				list.add(emp);
			}
		});
		return list;
	}
```
...wenn man muss...

Ansonsten solltest du dir mal "alternative" Persistenzstrategien anschauen ... (JDO, Hibernate....). Man muss heut zu tage kein Plain JDBC mehr schreiben um Daten in einer Datenbank zu speichern ;-)

Gruß Tom


----------



## onebigman (28. April 2005)

danke, danke für die schnellen antworten.

@kicmad00

dein ansatz ist gut hatte es schon fast so, hatte aber diesen teil nicht



```
public ResultSet executeSQL(String sqlStatement) //SQL Statement ausführen
    {
        try {
            Statement stmt=connection.createStatement();   
            return stmt.executeQuery(sqlStatement);
        }
        catch(SQLException e){
            System.out.println(e.getSQLState());
        }
        return null;
    }
```


@Toastbrot666 deinen Ansatz werde ich hoffentlich verwirklichen können - müsste ja jetzt nich mehr viel sein....

und zu guter letzt @Thomas Darimont

wow, was machst du da

habe mir das Framework zwar noch nich durchgelesen - das was du hier schreibst is glaub ich noch ne nummer zu hoch für mich. Ich befasse mich mit Java erst seit zwei wochen. mal sehen wenn ich das verstehe....

Danke@All


----------

