Detaillierte Erläuterung der JDBC-Datenbankverknüpfung und der zugehörigen Methodenkapselung

Detaillierte Erläuterung der JDBC-Datenbankverknüpfung und der zugehörigen Methodenkapselung

Detaillierte Erläuterung der JDBC-Datenbankverknüpfung und der zugehörigen Methodenkapselung

Importieren Sie mithilfe der MySQL-Datenbank zuerst die Treiberklasse und beziehen Sie dann den Datenlink basierend auf der Datenbank-URL sowie dem Benutzernamen und Kennwort. Da die MySQL-Datenbank verwendet wird, lautet ihre URL im Allgemeinen jdbc:mysql://Hostadresse:Portnummer/Bibliotheksname.

Nachfolgend finden Sie die spezifische gekapselte Klasse, die Generika und Reflektion verwendet. Es gibt jedoch noch einige Probleme. Es gibt einige Einschränkungen für die verwendeten generischen Objekte. Sie können nur für Objekte verwendet werden, deren Attributnamen von Objekten der generischen Klasse mit den Spaltennamen in der Datenbanktabelle identisch sind, und die Methode zum Initialisieren des Objekts muss die Methode „Set+Attributname“ sein. Ursprünglich wollte ich die Methode zur Initialisierung der Eigenschaften anhand des Rückgabewerttyps und der Parameterliste bestimmen. Aber vielleicht habe ich bisher zu wenig gelernt und erst drei Wochen studiert, deshalb habe ich es nicht implementiert. Ich bin der Meinung, dass diese Methode noch sehr niedrig ist und in Zukunft verbessert werden muss. Ich habe ursprünglich im Internet ein nützliches beanUtils-Paket gesehen, das mithilfe von map eine abgefragte Spalte speichert und direkt in ein Objekt umwandelt, wollte aber einfach die neu erlernte Reflexion ausprobieren. Darüber hinaus kann der endgültige Garbage Collector nicht derselbe sein wie der C++-Destruktor, sodass auch die Stelle, an der die Datenbankverbindung geschlossen wird, verbessert werden muss.

Implementierungscode:

öffentliche Klasse Consql {
 private static Consql consql=null;//Singleton-Entwurfsmuster private Connection conn=null;//Datenbanklink private final String url;//Datenbank-URL
 private final String username;//Datenbankbenutzername private final String password;//Datenbankkennwort //Treiberklasse wird geladen static{//Lade die Treiberklasse in Form eines statischen Codeblocks. Der statische Codeblock wird nur einmal ausgeführt, wenn die Klasse geladen wird try {
   Klasse.fürName("com.mysql.jdbc.Driver");
  } Fang (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 //Konstruktor private Consql(String url,String username,String password) throws SQLException{
  diese.url = URL;
  this.username = Benutzername;
  this.password = Passwort;
  open(); //Verbindung herstellen}
 private Verbindung open() wirft SQLException
 {
  Versuchen Sie {//Treiber erhält Datenbanklink conn=DriverManager.getConnection(URL, Benutzername, Passwort);
  } Fang (SQLException e) {
   // TODO Automatisch generierter Catch-Block
   //e.printStackTrace();
   werfen e;
  }  
  Rückverbindung;  
 }
 /**
  * Suche mit Einschränkungsbedingungen * @param sql mit Platzhaltern? SQL-Anweisung * @param t gibt die Klasse des zugehörigen Typobjekts zurück (T.class)
  * @param params ersetzt die Platzhalterdaten, die ein dynamisches Array sind * @return ArrayList<T>
  * @throws SQLException 
  */
 öffentliche <T> ArrayList<T> Auswahl (String sql, Klasse<T> t, Objekt...Params) löst SQLException aus
 {//Alle öffentlichen Methoden der Klasse T abrufen Method[] declaredMethods = t.getDeclaredMethods();
  //Erstellen Sie eine ArrayList<T>-Sammlung, um Objekte dieses Typs aufzunehmen arrayList=new ArrayList<>();
  versuchen Sie (PreparedStatement pStatement=conn.prepareStatement(sql);)
  {   
   für (int i = 0; i < Params.Länge; i++)
   {
    pStatement.setObject(i+1, params[i]);
   }   
   Versuchen Sie (ResultSet rSet = pStatement.executeQuery ();). 
   {
    rData=rSet.getMetaData();
    //Anzahl der Spalten in der Abfrageergebnistabelle abrufen int columnCount = rData.getColumnCount();    
    während (rSet.next()) {
     T a=t.newInstance(); //Erstellen Sie eine generische Klasseninstanz für (int i=0;i<columnCount;i++)
     {//Holen Sie sich die Set-Methode im quadratischen Array. Dies führt zu Einschränkungen. Nur der Spaltenname der Datenbanktabelle kann mit dem Objektnamen übereinstimmen und nur die Set-Methode String aString="set"+rData.getColumnName(i+1);
      für (Methode Methode : deklarierteMethoden) {
       wenn(method.getParameterCount()==1&&method.getReturnType().toString().equals("void")&&method.getName().equalsIgnoreCase(aString))
       {//Hier gibt es ein Problem. Die ersten beiden Beurteilungsbedingungen sind grundsätzlich nutzlos. Der Hauptgrund ist, dass ich die obige Zeichenfolgenmethode nicht verwenden wollte, um zu bestimmen, ob die Methode des Parameters method.setAccessible(true) aufgerufen werden soll.
        //Rufen Sie diese Methode mithilfe der Reflexionsmethode auf.invoke(a, rSet.getObject(i+1));
        brechen;
       }
      }
     }
     arrayList.add(a);
    }
   } Fang (Instanziierungsausnahme e) {
    // TODO Automatisch generierter Catch-Block
    e.printStackTrace();
   } Fang (IllegalAccessException e) {
    // TODO Automatisch generierter Catch-Block
    e.printStackTrace();
   } Fang (IllegalArgumentException e) {
    // TODO Automatisch generierter Catch-Block
    e.printStackTrace();
   } Fang (InvocationTargetException e) {
    // TODO Automatisch generierter Catch-Block
    e.printStackTrace();
   } 
  } Fang (SQLException e) {
   // TODO Automatisch generierter Catch-Block
   werfen e;
  }
  ArrayList zurückgeben;  
 }
 /**
  *Dateneinfügung* @param SQL mit Platzhalter? SQL-Anweisung * @param params ersetzt die Platzhalterdaten, dynamisches Array * @throws SQLException
  */
 öffentliche void insert(String sql,Object...params) wirft SQLException
 {
  versuchen(PreparedStatement pStatement=conn.prepareStatement(sql);) {
   
   für (int i = 0; i < Params.Länge; i++)
   {
    pStatement.setObject(i+1, params[i]);
   }
   pStatement.executeUpdate();
  } Fang (SQLException e) {
   // TODO Automatisch generierter Catch-Block
   werfen e;
  }
 }
 /**
  *Datenaktualisierung* @param SQL mit Platzhalter? SQL-Anweisung * @param params ersetzt die Platzhalterdaten, dynamisches Array * @throws SQLException
  */
 öffentliches void update(String sql,Object...params) löst SQLException aus
 {
  versuchen(PreparedStatement pStatement=conn.prepareStatement(sql);) {
   
   für (int i = 0; i < Params.Länge; i++)
   {
    pStatement.setObject(i+1, params[i]);
   }
   pStatement.executeUpdate();
  } Fang (SQLException e) {
   // TODO Automatisch generierter Catch-Block
   werfen e;
  }
 }
 /**
  * Löschen mit Einschränkungsbedingungen * @param SQL mit Platzhalter? SQL-Anweisung * @param params ersetzt die Platzhalterdaten, dynamisches Array * @throws SQLException
  */
 öffentliche void delete(String sql,Object...params) wirft SQLException
 {
  versuchen(PreparedStatement pStatement=conn.prepareStatement(sql);) {
   
   für (int i = 0; i < Params.Länge; i++)
   {
    pStatement.setObject(i+1, params[i]);
   }
   pStatement.executeUpdate();
  } Fang (SQLException e) {
   // TODO Automatisch generierter Catch-Block
   werfen e;
  }
 }
 /**
  * Alles löschen, ohne Einschränkung * @param sql
  * @throws SQLException
  */
 öffentliche void deleteall(String sql) wirft SQLException
 {
  versuchen(PreparedStatement pStatement=conn.prepareStatement(sql);) {      
   pStatement.executeUpdate();
  } Fang (SQLException e) {
   // TODO Automatisch generierter Catch-Block
   werfen e;
  }
 }
 /**
  * Uneingeschränkte Suche * @param sql 
  * @param t generische Klasse T.class
  * @return ArrayList<T>
  * @throws SQLException 
  */
 öffentliche <T> ArrayList<T> select(String sql,Class<T> t) löst SQLException aus
 {
  Methode[] deklarierteMethods = t.getDeclaredMethods();
  ArrayList<T> arrayList=neue ArrayList<>();
  versuchen Sie (PreparedStatement pStatement=conn.prepareStatement(sql);)
  {      
   Versuchen Sie (ResultSet rSet = pStatement.executeQuery ();). 
   {
    rData=rSet.getMetaData();
    int Spaltenanzahl = rData.getColumnCount();    
    während (rSet.next()) {
     T a=t.newInstance();
     für (int i = 0; i < Spaltenanzahl; i++)
     {
      : String aString="set"+rData.getColumnName(i+1);
      für (Methode Methode : deklarierteMethoden) {
       wenn (Methode.getName().equalsIgnoreCase(aString))
       {
        Methode.SetAccessible(true);
        Methode.aufrufen(a, rSet.getObject(i+1));
        brechen;
       }
      }
     }
     arrayList.add(a);
    }
   } Fang (Instanziierungsausnahme e) {
    // TODO Automatisch generierter Catch-Block
    e.printStackTrace();
   } Fang (IllegalAccessException e) {
    // TODO Automatisch generierter Catch-Block
    e.printStackTrace();
   } Fang (IllegalArgumentException e) {
    // TODO Automatisch generierter Catch-Block
    e.printStackTrace();
   } Fang (InvocationTargetException e) {
    // TODO Automatisch generierter Catch-Block
    e.printStackTrace();
   } 
  } Fang (SQLException e) {
   // TODO Automatisch generierter Catch-Block
   werfen e;
  }
  ArrayList zurückgeben; 
 }
 /**
  * Gibt die Anzahl der Zeilen in der Tabelle zurück * @param tableName Name der Datenbanktabelle * @return Anzahl der Zeilen * @throws SQLException
  */
 public int count(String tableName) löst SQLException aus
 {
  Zeichenfolge sql="Wählen Sie count(*) aus "+tableName;
  versuchen(PreparedStatement pStatement=conn.prepareStatement(sql);
    Ergebnismenge rsSet = pStatement.executeQuery(); )
  {  
   wenn(rsSet.next())
   {
    Gibt rsSet.getInt(1) zurück.
   }   
  } Fang (SQLException e) {
   // TODO Automatisch generierter Catch-Block
   werfen e;
  }
  gebe 0 zurück;
 }
 /**
  * Bestimmen Sie, ob die Daten vorhanden sind * @param SQL enthält Platzhalter? SQL-Anweisung * @param params ersetzt die Platzhalterdaten, dynamisches Array * @return boolean
  * @throws SQLException
  */
 öffentliches boolean isExist(String sql,Object...params) wirft SQLException
 {  
  versuchen(PreparedStatement pStatement=conn.prepareStatement(sql);)
  {
   für (int i = 0; i < Params.Länge; i++)
   {
    pStatement.setObject(i+1, params[i]);
   }
   Versuchen Sie(ResultSet rsSet=pStatement.executeQuery();) {
    wenn(rsSet.next())
    {
     gibt true zurück;
    }
   Endlich
    
   }
  } Fang (SQLException e) {
   // TODO Automatisch generierter Catch-Block
   werfen e;
  }
  gibt false zurück;  
 }
 /**
  * Erstellen Sie eine Instanz * @param url Datenbank-URL
  * @param Benutzername Benutzername * @param Passwort Passwort * @return consql Objekt * @throws SQLException
  */
 öffentliche statische Consql getnewInstance(String url,String username,String password) wirft SQLException
 {
  wenn(consql==null)
   consql = neues Consql (URL, Benutzername, Passwort);
  gibt Consql zurück;  
 }
 // Garbage Collection, es scheint, dass der Effekt des Destruktors protected void finalize() throws Throwable nicht erreicht werden kann
 {
  wenn(conn!=null)
  {
   Verbindung schließen();  
  }
  super.finalize();
 }
}

Oben finden Sie ein ausführliches Beispiel für die Kapselung von JDBC-Datenbanklinks und verwandten Methoden. Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht oder diskutieren Sie in der Community dieser Site. Vielen Dank fürs Lesen und ich hoffe, allen helfen zu können. Vielen Dank für Ihre Unterstützung dieser Site!

Das könnte Sie auch interessieren:
  • Einfache Kapselung von JDBC (Beispielerklärung)
  • Einfache allgemeine JDBC-Hilfsklassenkapselung (Beispiel)
  • BaseDao basierend auf JDBC-Kapselung (Beispielcode)
  • Einfache Kapselungsmethode für Java JDBC

<<:  Detaillierte Erklärung der Docker-Datenspeichervolumes

>>:  Detaillierte Erklärung der Bind-Mounts für die Docker-Datenspeicherung

Artikel empfehlen

CSS3 erstellt eine Webanimation, um einen springenden Balleffekt zu erzielen

Grundlegende Vorbereitung Für diese Implementieru...

Zwei Abfragemethoden, wenn der MySQL-Abfragefeldtyp JSON ist

Die Tabellenstruktur ist wie folgt: Ich würde var...

Die am häufigsten verwendete HTML-Escape-Sequenz

In HTML haben <, >, & usw. eine speziell...

Problem beim Testen des nicht autorisierten Zugriffs auf Zookeeper

Inhaltsverzeichnis Vorwort Erkennen des geöffnete...

Details zur MySQL-Transaktionsisolationsebene

serializable Serialisierung (kein Problem) Transa...

VPS erstellt Offline-Download-Server (nach der Ära der Netzwerkfestplatten)

Motivation Aus Lerngründen habe ich einen VPS-Die...

Implementierung einer coolen 3D-Würfeltransformationsanimation in CSS3

Ich liebe das Programmieren, es macht mich glückl...

Warum MySQL Repeatable Read als Standardisolationsebene wählt

Inhaltsverzeichnis Oracle-Isolationsebenen MySQL-...

Optimierung der Frontend-Leistung von Websites: JavaScript und CSS

Ich habe einen Artikel des Yahoo-Teams über die O...

Ein grafisches Tutorial zur Installation von MySQL unter Windows

Zusammenfassung: Dieser Artikel erläutert hauptsä...