Announcement

Collapse
No announcement yet.

Query aus einer anderen Klasse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Query aus einer anderen Klasse

    Hallo liebe Entwickler,

    Ich habe eine DBVerbindung Klasse. Die stellt die Verbindung zur Datenbank her. Die Querys habe ich in eine andere Klasse ausgelagert. Wie ist es am Besten gehandhabt mit dem PreparedStatements und ResultSets hier ein unvollständiger Programmcode

    Code:
    public static void einfuegen(String titel, String hinweise,
            String sichtbar,int kategorieid) throws Exception,SQLException{
        DBVerbindung cn=new DBVerbindung();
        try{
            
            String query="INSERT INTO `sor`.`themenebt` (`themenid`, `titel`, `hinweise`, `sichtbar`, `kategorieid`)"+ 
                    "VALUES (null,?,?,?,?)";
            PreparedStatement pst=cn.verbindung().prepareStatement(query);
            
            
        }
        catch(SQLException e){
            
        }
        finally{
            pst.close();
            rs.close();
            cn.close();
            
        }
    
    
    }
    Code:
    public Connection verbindung() throws Exception{
        Connection conn;
        String dbUrl="jdbc:mysql://"+ url +":"+ port + "/" +dbname;
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection(dbUrl, benutzer, passwort);
        return conn;
        }
    public PreparedStatement prestatement(){
        verbindung();
        PreparedStatement pstmt=verbindung().prepareStatement(query);
        return pstmt;
    }

  • #2
    Wie ist es am Besten gehandhabt mit dem PreparedStatements und ResultSets
    Was genau ist die Frage? Andere Klasse? Prepared Statements?

    Prepared Statements: http://docs.oracle.com/javase/tutori.../prepared.html


    Die Methoden in der Klasse mit den ausgelagerten SQL-Statements haben dann entsprechende Aufrufparameter und auch entsprechende Rückgabeparameter

    public static void einfuegen

    wäre zu ändern, wenn die Methode ein Resultset zurückgibt.

    Methoden, bei denen das SQL-Statements nichts zurückgibt, können ein boolean (true/false) zurückgeben und damit anzeigen, ob der Aufruf erfolgreich war

    Methoden, die ein Resultset zurückgeben, geben null zurück, um anzuzeigen, dass der Aufruf fehlerhaft war
    Christian

    Comment


    • #3
      Hallo Christian,
      zunächst bedanke ich mich für die schnelle Antwort. Wie könnte das im Kontext denn aussehen. Ich habe mehrere JDBC Bücher zur Hand. Das Zusammenspiel der Klassen (Objektorientierung) wird da leider nicht beschrieben. Ich habe jetzt das ein wenig ausgeweitet.

      Code:
      public Connection verbindung() throws Exception{
          Connection conn;
          String dbUrl="jdbc:mysql://"+ url +":"+ port + "/" +dbname;
          Class.forName("com.mysql.jdbc.Driver");
          conn = DriverManager.getConnection(dbUrl, benutzer, passwort);
          return conn;
          }
      /**
       * Diese Methode erzeugt ein PreparedStatement.
       * @return
       * @throws SQLException
       * @throws Exception
       */
      
      public PreparedStatement prestatement() throws SQLException, Exception{
          try{
          PreparedStatement pstmt=verbindung().prepareStatement(null);
          return pstmt;
             }
          catch(SQLException e){
          return null;    
             }
          }
      
      public ResultSet resultset() throws SQLException, Exception{
          try{
          ResultSet rs= prestatement().executeQuery();
          return rs;
          }
          catch(SQLException e){
              return null;
          }
          
      }
      /**
       * Diese Methode schliesst ResultSet, PreparedStatement, Connection.
       */
      public void close(){
          try{
              if(this.resultset()!=null){
                  this.resultset().close();
              }
              else if(this.prestatement()!=null){
                  this.prestatement().close();
              }
              else if(this.verbindung()!=null){
                  this.verbindung().close();
              }
          }
          catch(Exception e){ }
          }
      }
      Code:
      public void einfuegen(String titel, String hinweise,
              String sichtbar,int kategorieid) throws Exception,SQLException{
          DBVerbindung cn=new DBVerbindung();
          try{
              
              String query="INSERT INTO `sor`.`themenebt` (`themenid`, `titel`, `hinweise`, `sichtbar`, `kategorieid`)"+ 
                      "VALUES (null,?,?,?,?)";
              PreparedStatement pst=cn.verbindung().prepareStatement(query);
              
              
          }
          catch(SQLException e){
              
          }
          finally{
              
             
              close();
              
          }
      }
      Meine Fragen:
      Wie kann ich die executeQuery() in die einfuegen() Methode einbringen?

      Wie kann ich die close() Methode aus der Verbindungsklasse in der SQLStatement Klasse aufrufen ?

      Comment


      • #4
        Deine erste Klasse ist nicht sinnvoll

        Wozu sollten resultset und preperedStatement über einen Methodenaufruf weiterleben; sie werden immer genau für einen Aufruf benötigt?

        Implementiere die Verbindungsklasse als Singelton und du hast nur eine Instanz und kannst dort von überall darauf zugreifen
        Christian

        Comment


        • #5
          Hmm aber wenn ich die Verbindungsklasse als Singelton implementiere dann wird ja von der Verbindungsklasse nur eine Instanz erzeugt und keine weiteren. Aber das soll am Ende eine Webanwendung sein, die mehrere Verbindungen herstellen muss. Ist das von der Performance her gut?

          Comment


          • #6
            Wozu benötigt eine Webanwendung mehrere Verbindungen? Es wäre schlecht, bei jedem Request der eine DB-Anfrage macht, eine Verbindung zu öffnen und wieder zu schließen
            Christian

            Comment

            Working...
            X