DB-Verbindungsdetails in separater Klasse!?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • DB-Verbindungsdetails in separater Klasse!?

    Hi

    Ich versuche unter Verwendung v. jfreechart ein Linien Chart zu erstellen. Die Daten dafür liefert eine mysql DB.

    Hatte das Chart darstellen können wenn ich die Verbingung innerhalb der selben Klasse herstelle.

    Wollte dann diese Verbindungsdetails auslagern in die Klasse "database" da ich nicht nur einen Chart konstruieren will.

    Erhalte allerdings beim kompilieren folgenden Error:
    non-static method request() cannot be referenced from a static context.

    Wer kann mir sagen was ich falsch mache u. wie es richtig aussehen muss???

    Ratio class

    Quellcode

    1. private static CategoryDataset createDataset() {
    2. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    3. String sql = "SELECT year,tangible_assets FROM balance_sheet WHERE company_id = 1";
    4. database.request(sql); // ERROR
    5. while (result.next())
    6. {
    7. int value = result.getInt( "tangible_assets" );
    8. String year = result.getString( "year" );
    9. dataset.addValue(value, "Classes", year);
    10. }
    11. return dataset;
    12. }
    Alles anzeigen


    Database class:

    Java-Quellcode

    1. import java.sql.*;
    2. public class database
    3. {
    4. private Connection con;
    5. private Statement statement;
    6. private ResultSet result;
    7. private String driver = "com.mysql.jdbc.Driver";
    8. private String url = "jdbc:mysql://127.0.0.1/financial_data";
    9. private String user = "root";
    10. private String pwd = "";
    11. public void dbConnect()
    12. {
    13. try
    14. {
    15. Class.forName(driver);
    16. con = DriverManager.getConnection(url, user, pwd);
    17. }
    18. catch(ClassNotFoundException e)
    19. {
    20. System.out.println("* Unable to load driver! *");
    21. System.exit(1);
    22. }
    23. catch(SQLException e)
    24. {
    25. System.out.println("* Cannot connect to database! *");
    26. System.exit(1);
    27. }
    28. }
    29. public ResultSet request(String sql)
    30. {
    31. try
    32. {
    33. statement = con.createStatement();
    34. result = statement.executeQuery(sql);
    35. }
    36. catch(SQLException e)
    37. {
    38. System.out.println("* Cannot execute query! *");
    39. e.printStackTrace();
    40. System.exit(1);
    41. }
    42. catch(Exception e)
    43. {
    44. System.out.println("* Error retrieving data! *");
    45. e.printStackTrace();
    46. System.exit(1);
    47. }
    48. finally
    49. {
    50. try
    51. {
    52. statement.close();
    53. con.close();
    54. }
    55. catch(SQLException e)
    56. {
    57. System.out.println("* Unable to disconnect! *");
    58. e.printStackTrace();
    59. }
    60. }
    61. return result;
    62. }
    63. }
    Alles anzeigen


    DANKE
  • createDataset ist static.
    Die Klasse "database" hat keine static Methoden
    -> Fehler: man kann innerhalb einer statischen Methode nicht auf "nicht-statische" Methoden anderer Klassen zugreifen, ohne eine Instanz anzulegen.

    Lösung 1:

    Quellcode

    1. database db = new database ();
    2. db.request (...);


    Lösung 2:
    Die Methoden der Klasse "database" statisch machen

    Quellcode

    1. public static void dbConnect() {...}
    2. public static ResultSet request(String sql) {...}


    Lösung 3:
    Die Klasse database als Singleton implementieren:

    Quellcode

    1. class database {
    2. private static database Instance = null;
    3. private database () { /*private und leer*/ }
    4. public static database getInstance () {
    5. if (Instance == null)
    6. Instance = new database ();
    7. return Instance;
    8. }
    9. ....
    10. }


    Mein Favourite: Lösung 3

    Hint: Klassennamen sollen mit Großbuchstaben anfangen -> Database!
  • Thanks, für die Antwort. Bin soweit jetzt gekommen:

    Erhalte jetzt allerdings diesen Error: unreported exception java.sql.SQLException; must be caught or declared to be thrown.

    Habe jetzt schon einiges über Expctions und throws und deren Reihenfolge gelesen. Allerdings weiss ich nicht wie ich das hier einzusetzen habe - Newbie !?

    Änderungen:

    Class Ratio

    Quellcode

    1. private static CategoryDataset createDataset() {
    2. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    3. Database db = new Database();
    4. String sql = "SELECT year,tangible_assets FROM balance_sheet WHERE company_id = 1";
    5. db.request(sql);
    6. while (db.result.next())
    7. {
    8. int value = db.result.getInt( "tangible_assets" );
    9. String year = db.result.getString( "year" );
    10. dataset.addValue(value, "Classes", year);
    11. }
    12. return dataset;
    13. }
    Alles anzeigen


    Class Database

    Quellcode

    1. import java.sql.*;
    2. public class Database
    3. {
    4. static Connection con;
    5. static Statement statement;
    6. static ResultSet result;
    7. private String driver = "com.mysql.jdbc.Driver";
    8. private String url = "jdbc:mysql://127.0.0.1/financial_data";
    9. private String user = "root";
    10. private String pwd = "";
    11. public void dbConnect()
    12. {
    13. try
    14. {
    15. Class.forName(driver);
    16. con = DriverManager.getConnection(url, user, pwd);
    17. }
    18. catch(ClassNotFoundException e)
    19. {
    20. System.out.println("* Unable to load driver! *");
    21. System.exit(1);
    22. }
    23. catch(SQLException e)
    24. {
    25. System.out.println("* Cannot connect to database! *");
    26. System.exit(1);
    27. }
    28. }
    29. public ResultSet request(String sql)
    30. {
    31. try
    32. {
    33. statement = con.createStatement();
    34. result = statement.executeQuery(sql);
    35. }
    36. catch(SQLException e)
    37. {
    38. System.out.println("* Cannot execute query! *");
    39. e.printStackTrace();
    40. System.exit(1);
    41. }
    42. catch(Exception e)
    43. {
    44. System.out.println("* Error retrieving data! *");
    45. e.printStackTrace();
    46. System.exit(1);
    47. }
    48. finally
    49. {
    50. try
    51. {
    52. statement.close();
    53. con.close();
    54. }
    55. catch(SQLException e)
    56. {
    57. System.out.println("* Unable to disconnect! *");
    58. e.printStackTrace();
    59. }
    60. }
    61. return result;
    62. }
    63. }
    Alles anzeigen
  • Ich schätze mal, dass durch den Zugriff auf "db.result" auch eine SQLException getriggert wird, daher muss der ganze Block auch nich gecatched werden:

    Quellcode

    1. private static CategoryDataset createDataset() {
    2. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    3. Database db = new Database();
    4. try {
    5. String sql = "SELECT year,tangible_assets FROM balance_sheet WHERE company_id = 1";
    6. db.request(sql);
    7. while (db.result.next())
    8. {
    9. int value = db.result.getInt( "tangible_assets" );
    10. String year = db.result.getString( "year" );
    11. dataset.addValue(value, "Classes", year);
    12. }
    13. }
    14. catch (SQLException e)
    15. {
    16. // tu was
    17. }
    18. return dataset;
    19. }
    Alles anzeigen


    hth