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:
|
<<: Detaillierte Erklärung der Docker-Datenspeichervolumes
>>: Detaillierte Erklärung der Bind-Mounts für die Docker-Datenspeicherung
Hier ist eine kurze Zusammenfassung der Installat...
[LeetCode] 185. Die drei höchsten Gehälter der Ab...
Grundlegende Vorbereitung Für diese Implementieru...
Vorwort Das MySQL Slow Query Log ist eine Funktio...
Die Tabellenstruktur ist wie folgt: Ich würde var...
In HTML haben <, >, & usw. eine speziell...
Inhaltsverzeichnis Hintergrund 1. Was ist DNS-Pre...
Inhaltsverzeichnis Vorwort Erkennen des geöffnete...
Wenn die erstellte Registerkartenbeschriftung den...
serializable Serialisierung (kein Problem) Transa...
Motivation Aus Lerngründen habe ich einen VPS-Die...
Ich liebe das Programmieren, es macht mich glückl...
Inhaltsverzeichnis Oracle-Isolationsebenen MySQL-...
Ich habe einen Artikel des Yahoo-Teams über die O...
Zusammenfassung: Dieser Artikel erläutert hauptsä...