1. Erklären Sie zuerst, was JDBC ist
Bevor ich dieses Substantiv auf den ersten Blick sah, hielt ich es für notwendig zu wissen, wie sein vollständiger englischer Name war. Java -Datenbankkonnektivität, die buchstäblich in eine verbindbare Java -Datenbank übersetzt wird. Um es unverblümt auszudrücken, möchte ich einen Satz mittlerer Links bereitstellen, um Java -Code und Datenbank zu verbinden, damit die Datenbank direkt durch Betrieb von Java -Code steuern kann.
2. Die Essenz von JDBC
Es ist eine Java -Lösung, um auf Datenbanken zuzugreifen. Es hofft, auf verschiedene Datenbanken zugreifen zu können, um eine Java -Operation -Schnittstelle zu erreichen, die nicht mit der spezifischen Datenbank zusammenhängt.
JDBC ist im Wesentlichen ein Satz standardisierter Schnittstellen. Verschiedene Datenbankhersteller implementieren diese Schnittstelle nach ihren eigenen Datenbankmerkmalen, und wir müssen uns nicht um die spezifischen Implementierungsmethoden kümmern.
Die wichtigsten Schnittstellen, die von Datenbankherstellern in JDBC implementiert werden, sind wie folgt:
DriverManager: Treiberverwaltung
Verbindung,
Databasemetadata: Verbindung zur Schnittstelle herstellen
Stellungnahme,
Vorbereitete Station
Callablestatement: Anweisungsobjektschnittstelle
Ergebnis,
ResultsetMetadata: Ergebnissensgrenze
3. Wie JDBC funktioniert
Der Programmierer ruft den vom zugrunde liegenden Datenbankhersteller implementierten Teil auf.
Das heißt: 1) Implementieren Sie den ersten Schritt der Verbindung über die Verbindungsschnittstelle
2) SQL -Anweisungen durch Angabenergebnisse übertragen
3) Der Hauptprozess zum Speichern der Datenbankrenditeergebnisse in der Ergebnis -Set -Set -Schnittstelle kann als:
1) Laden Sie den Treiber und erstellen Sie die Verbindung
2) Erstellen Sie ein Anweisungsobjekt
3) SQL -Anweisungen ausführen
4) Senden Sie das Ergebnissatz zurück
5) Schließen Sie die Verbindung
Im Folgenden werde ich die Oracle -Datenbank nehmen, die ich gelernt habe, und kooperieren Sie mit Eclips als Beispiel, um zu erklären, wie JDBC implementiert wird
1) Laden des Treibers
Die verwendete Methode ist: class.forname ("Treiber");
Was ich darüber weiß, wie man diesen Treiber bekommt, ist: Erweitern Sie das JDBC-JAR-Paket, wenn ich ojdbc6.jar verwende, Oracle.jdbc.driver finde, oracledriver finde, dann mit der rechten Maustaste auf QualityCopy und einfügen und in Zitate einfügen, wie z.
2) Erstellen Sie eine Verbindung
Die verwendete Methode lautet: conn = driverManager.getConnection ("JDBC: Oracle: Thin: @IP -Adresse: 1521: ORCL", "Datenbankkonto", "Datenbankkennwort");
Zum Beispiel: conn = driverManager.getConnection ("JDBC: Oracle: Thin:@172.16.3.8: 1521: orcl", "JSD1601", "JSD1601");
3) Erstellen Sie ein Anweisungsobjekt
Die verwendete Methode ist: Anweisung STMT = Conn.CreateStatement ();
Es ist zu beachten, dass die im zweite Schritt erstellte Verbindung zum Aufrufen der Methode verwendet wird
Rufen Sie die ExecuteUpdate -Methode an und geben Sie die SQL -Anweisung darin weiter, um die schriftliche SQL -Anweisung auszuführen. Es ist hier zu beachten, dass die SQL -Arten, die die ExecuteUpdate -Methode ausführen kann, einfügen, aktualisieren, löschen
Zum Beispiel: Anweisung STMT = Conn.CreateStatement ();
String SQL = "In EMP_JIAWENZHE (EMPNO, ENAME, SAL, DEPTNO) VULDE (1000, 'JIA Wenzhe', 1500,10) einfügen;
int i = stmt.executeUpdate (SQL);
Der Rückgabewert, den ich hier ist, ist die Anzahl der betroffenen Zeilen. Wir können beurteilen, ob die Operation aufgrund der Anzahl der betroffenen Zeilen erfolgreich ist.
4) Die zurückgegebene Ergebnismenge bezieht sich hauptsächlich auf den Auswahlvorgang (hier nicht erwähnt)
5) Schließlich schließen Sie die Verbindung
Zum Beispiel: conn.close ();
Listen Sie einen ganzen Code auf, einschließlich Kommentaren:
Paket jdbc_day01; importieren java.sql. args) löst SQLEXception aus {// Anforderungen: Erstellen Sie einen Mitarbeiter, Mitarbeiternummer, Mitarbeitername, Gehalt, Abteilungsnummer // 1, Verbindung conn = null; try {class.forname ("oracle.jdbc.driver.oracledriver"); System.out.println ("Treiberbelastung erfolgreich"); // 2. conn = driverManager.getConnection ("jdbc: oracle: dünn:@172.16.3.8: 1521: orcl", "JSD1601", "JSD1601"); System.out.println (conn.getClass (). GetName ()); // 3. // Aussageanweisung Objekt. Senden und führen Sie die SQL -Anweisung/ * * int erschlepupdate (String SQL) aus; * Senden Sie Einfügen, Aktualisieren, Löschen von Anweisung* Rückgabewert int repräsentiert die Anzahl der Zeilen, die die Datenbanktabelle betreffen String SQL = "In EMP_JIAWENZHE (EMPNO, ENAME, SAL, DEPTNO) einfügen" + "Werte (1000, 'Wang Xiaoer', 1500,10)"; int i = stmt.executeUpdate (SQL); if (i> 0) {System.out.println ("erfolgreich speichern!"); }} catch (classNotFoundException e) {e.printstacktrace (); // 1. Notieren Sie das Protokoll // 2. Benachrichtigen Sie den Anrufer, neue RunTimeException zu werfen ("Treiber Fehler", e); } endlich {// Schließen Sie die Verbindung if (conn! = null) {try {conn.close (); } catch (sqlexception e) {e.printstacktrace (); }}}}}}} Hinweis: Das JAR -Paket, das in der Oracle -Datenbank verwendet werden kann: OJDBC14.jar/ojdbc6.jar (Oracle12c verwendet dies)
Das JAR-Paket, das von der MySQL-Datenbank verwendet werden kann: MySQL-Connector-Java-5.0.4 --Bin.jar
Treiberklasse laden:
Class.forname ("com.mysql.jdbc.driver"); 1. Einführung der Verpackungsmethode
Was mich am meisten berührt hat, ist, dass ich, wenn ich eine bestimmte Reihe von Codes schreibe. Die zuvor erwähnte Verwendung von JDBC für Datenbankoperationen (Zugabe, Löschung und Modifikation, da die Abfrage den Betrieb des Ergebnissatzes umfasst und separat deklariert) wird in vier Prozesse unterteilt:
1) Laden des Treibers
2) Erstellen Sie eine Verbindung
3) Erstellen Sie Anweisungsobjekt und senden Sie SQL
4) Schließen Sie die Verbindung
Mit anderen Worten, wenn wir einen Datenbankvorgang ausführen, müssen wir die oben genannten Schritte ausführen, was zur Redundanz des Codes führt. Deshalb haben wir vorgeschlagen, diese gemeinsamen Schritte in eine Klasse zu integrieren, damit sie zu einer Werkzeugkurs für meine Verwendung werden kann.
2. Drei Versionen der Kapselung
Version 1
Als ich lernte, habe ich diese Klassen allmählich schrittweise verkapuliert und sie allmählich verbessert, denn wenn die ultimative Version der Kapselung direkt vorgeschlagen wird, ist es für Anfänger schwierig zu akzeptieren. Ich werde das erste erklären, dh die einfachste Kapselungsmethode:
Sie werden früher herausfinden, dass unabhängig davon, wie Sie die Datenbank bedienen möchten, das Laden des Treibers von wesentlicher Bedeutung ist und der Lade -Treiber hauptsächlich Deklarationen, Treibername, IP -Adresse, Portnummer, Datenbankkontenname, Passwort usw. enthält.
private statische String -Treiberklasse = "oracle.jdbc.driver.oracledriver"; private statische String -URL = "JDBC: Oracle: Thin: LOSTHOST: 1521: ORCL"; private statische String user = "System"; private statische String -Passwort = "123";
Auf diese Weise kann ich beim Erstellen der Verbindung den Namen der Variablen direkt zum Ersetzen der langen Zeichenfolge erhalten. Beim Laden des Treibers wird der Methodenklasse.forname in einem statischen Block deklariert, da der Treiber beim Laden der Daten geladen wird.
Wie unten gezeigt:
static {try {class.forname (driverClass); } catch (classNotFoundException e) {e.printstacktrace (); Neue RunTimeException werfen ("Error", e); }}Zum Erstellen einer Verbindung nennen wir die GetConnection -Methode von TriverManager und geben den entsprechenden Benutzernamen und das Passwort ein. Wir setzen diese Methode direkt in die von mir definierte Methode ein und rufen dann meine Methode direkt auf, um die Verbindung zu erstellen. Es ist zu beachten, dass der Rückgabewert der Methode das Verbindungsobjekt ist, das leicht zu verstehen ist, da wir dieses Verbindungstyp -Objekt abrufen möchten, wie unten gezeigt:
public static Connection getConnection () löscht SQLEXception {Connection conn = driverManager.getConnection (URL, Benutzer, Passwort); Conn zurückgeben; }Erstellen Sie dann ein Anweisungsobjekt und senden Sie SQL. Natürlich ist SQL der einzige besondere Ort hier, denn das, was SQL tun muss, ist sehr unterschiedlich, daher muss dieser Schritt nicht eingekapselt werden.
Schließlich schließen Sie die Verbindung, die als Close () -Methode bezeichnet wird, wie unten gezeigt
public static void close (Verbindung conn) {if (conn! = null) {try {conn.close (); } catch (sqlexception e) {e.printstacktrace (); Neue RunTimeException werfen ("Verbindungsfehler", e); }}}}Die erste Version des Pakets lautet wie folgt:
Paket jbbc_day01; import Java.sql.Connection; Import Java.sql.drivermanager; Importieren Sie Java.sql.sqlexception;/** * Verwendet, um Verbindungen zu verwalten. private statische String -URL = "JDBC: Oracle: Thin: LOSTHOST: 1521: ORCL"; private statische String user = "System"; private statische String -Passwort = "123"; // 1. Ladetreiber statisch {try {class.forname (DriverClass); } catch (classNotFoundException e) {e.printstacktrace (); Neue RunTimeException werfen ("Erladung von Treiber", e); }}} // 2. Erstellen einer Verbindung/** So definieren Sie eine Methode, die eine Verbindung erstellen kann Conn zurückgeben; } // 3. Schließen Sie die Verbindung public static void close (Verbindung conn) {if (conn! = Null) {try {conn.close (); } catch (sqlexception e) {e.printstacktrace (); Neue RunTimeException werfen ("Verbindungsfehler", e); }}}}}Einfach auf diese Weise einkapseln und dann die Kapselungsklasse direkt bei der Durchführung von SQL -Operationen aufrufen. Alles, was Sie schreiben müssen, ist, Ihr Anweisungsobjekt zu erstellen und Ihre SQL -Anweisung zu senden
Version 2
In der Tat ist Version 2 Version 1 sehr ähnlich, um eine der Mängel von Version 1 auszugleichen, dh wenn Sie die Datenbank ändern, sind die Kontokennwörter verschiedener Datenbanken unterschiedlich. Sie müssen daher das Kontokennwort und die IP -Adresse ändern. Ich habe diese zuvor in der Werkzeugklasse in Form einer Zeichenfolge verkapelt, was bedeutet, dass wir die Werkzeugklasse jedes Mal ändern müssen, wenn wir die Datenbank ändern, was sehr unangemessen ist. Daher haben wir eine Verbesserungsmethode vorgeschlagen, um diese Verbindungsdaten in eine Konfigurationsdatei einzufügen, und die Toolklasse liest diese Konfigurationsdatei. Wir können die Konfigurationsdatei bei der Änderung direkt ändern.
Bevor ich diese Version einführte, habe ich eine neue Klasse, Eigenschaften vorgestellt, eine Datei vorgestellt, die den Inhalt der Konfigurationsdatei in Form eines Streams lesen und lesen kann und anschließend an die Werkzeugklasse zurückgegeben wird.
Zunächst werde ich ein Beispiel für die Konfigurationsdatei geben. Tatsächlich muss es nicht erklärt werden. Auf einen Blick ist klar, wie unten gezeigt:
jdbc.driverClass = oracle.jdbc.driver.oracledriverjdbc.url = jdbc: oracle: dünn: localhost: orcljdbc.user = systemjdbc.password = 123
Die Vorderseite ist der Schlüssel, der folgende Wert ist der Wert, und der vorherige Schlüsselwert wird von uns selbst definiert, genau wie das Definieren des variablen Namens ist der nachfolgende Wert die tatsächliche Situation unserer Datenbank. Wir müssen hier besondere Aufmerksamkeit schenken, dass der Suffix -Name dieser Konfigurationsdatei mit .Properties enden muss, denn auf diese Weise kann die Eigenschaftenklasse gelesen werden.
Beispiele für diesen Abschnitt sind wie folgt:
static {try {// Eigenschaftsdateneigenschaften laden Eigenschaften pop = new Properties (); pop.load (dbutil2.class.getClassloader (). getResourceAsStream ("db.properties")); url = pop.getProperty ("jdbc.url"); DriverClass = pop.getProperty ("jdbc.driverClass"); user = pop.getProperty ("jdbc.user"); Passwort = pop.getProperty ("jdbc.password"); Class.ForName (DriverClass); } catch (classNotFoundException e) {e.printstacktrace (); Neue RunTimeException werfen ("Error", e); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); }}Die Methode von Load () besteht darin, es zu lesen, oder es kann als Laden der Konfigurationsdatei angesehen werden. Denken Sie nur an diesen ganzen Satz, ohne sich mit seiner Bedeutung zu befassen. GetProperty () erhält den entsprechenden Wert durch den Schlüssel, der der Form des Erhaltens eines Wertes für das Schlüsselwertpaar sehr ähnlich ist.
Der Gesamtcode lautet wie folgt:
Paket jbbc_day01; import java.io.fileinputstream; import Java.io.ioxception; import Java.io.inputStream; Import Java.SQL.Connection; Importieren Sie Java.sql.Drivermanager; Speichern in Eigenschaften Datei * @Author Jiawenzhe * */Public Class Dbutil2 {private statische String -Treiberklasse; private statische String -URL; privater statischer String -Benutzer; privates statisches String -Passwort; // 1. Treiber statisch laden {try {// Eigenschaftendaten -Dateneigenschaften pop = new Properties (); pop.load (dbutil2.class.getClassloader (). getResourceAsStream ("db.properties")); url = pop.getProperty ("jdbc.url"); DriverClass = pop.getProperty ("jdbc.driverClass"); user = pop.getProperty ("jdbc.user"); Passwort = pop.getProperty ("jdbc.password"); Class.ForName (DriverClass); } catch (classNotFoundException e) {e.printstacktrace (); Neue RunTimeException werfen ("Error", e); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); }} // 2. Erstellen einer Verbindung/** So definieren Sie eine Methode, die eine Verbindung erstellen kann Conn zurückgeben; } // 3. Schließen Sie die Verbindung public static void close (Verbindung conn) {if (conn! = Null) {try {conn.close (); } catch (sqlexception e) {e.printstacktrace (); Neue RunTimeException werfen ("Verbindungsfehler", e); }}}}}