Heim >Java >JavaInterview Fragen >Interviewfragen zur Java-Persistenzschicht
Was ist ein ORM? (Empfohlenes Lernen: Java-Interviewfragen )
Object-Relational Mapping (ORM) ist ein Beziehungsmodell von objektorientierten und Datenbankmodellen zur Lösung von Programmproblemen ; Vereinfacht gesagt speichert ORM automatisch Objekte im Programm, indem es Metadaten verwendet, die die Zuordnung zwischen Objekten und Datenbanken beschreiben (XML oder Annotationen können in Java verwendet werden) in eine relationale Datenbank oder konvertiert Zeilen in einer relationalen Datenbanktabelle in Java-Objekte, was im Wesentlichen die Konvertierung von Daten von einer Form in eine andere bedeutet.Ist SessionFactory im Ruhezustand threadsicher? Ist die Sitzung threadsicher (können zwei Threads dieselbe Sitzung gemeinsam nutzen)?
SessionFactory entspricht einem Datenspeicherkonzept von Hibernate. Es ist threadsicher und kann von mehreren Threads gleichzeitig aufgerufen werden. SessionFactory wird im Allgemeinen nur beim Start erstellt. Für Anwendungen ist es am besten, SessionFactory im Singleton-Modus zu kapseln, um den Zugriff zu erleichtern. Sitzung ist ein leichtes, nicht threadsicheres Objekt (Sitzung kann nicht zwischen Threads geteilt werden), das eine Arbeitseinheit darstellt, die mit der Datenbank interagiert. Die Sitzung wird von SessionFactory erstellt und nach Abschluss der Aufgabe geschlossen. Die Sitzung ist die Hauptschnittstelle, die vom Persistenzschichtdienst bereitgestellt wird. Die Sitzung verzögert den Erhalt der Datenbankverbindung (d. h. sie wird nur bei Bedarf hergestellt). Um zu vermeiden, dass zu viele Sitzungen erstellt werden, können Sie ThreadLocal verwenden, um die Sitzung an den aktuellen Thread zu binden, sodass derselbe Thread immer dieselbe Sitzung erhält. Die getCurrentSession()-Methode von SessionFactory in Hibernate 3 kann dies tun.Was bewirken die Methoden save(), update(), merge(), lock(), saveOrUpdate() und persist() von Session? Was ist der Unterschied?
Hibernate-Objekte haben drei Zustände: vorübergehend, dauerhaft und getrennt. Transiente Instanzen können durch Aufruf von save(), persist() oder saveOrUpdate() dauerhaft gemacht werden. Freie Instanzen können durch Aufruf von update(), saveOrUpdate(), lock() dauerhaft gemacht werden. ) oder Replicate() wird persistent. save() und persist() lösen SQL INSERT-Anweisungen aus, und update() oder merge() lösen UPDATE-Anweisungen aus. Der Unterschied zwischen save() und update() besteht darin, dass eines ein transientes Objekt in einen dauerhaften Zustand und das andere ein freies Objekt in einen dauerhaften Zustand umwandelt. Die Methode merge() kann die Funktionen der Methoden save() und update() vervollständigen. Ihre Absicht besteht darin, den neuen Status mit dem vorhandenen persistenten Objekt zusammenzuführen oder ein neues persistentes Objekt zu erstellen.Befolgen Sie für die Methode persist() die Anweisungen in der offiziellen Dokumentation:
1 Die Methode persist() speichert eine vorübergehende Instanz, garantiert jedoch keine Identifizierung . Der Bezeichner wird sofort in die persistente Instanz eingefügt und das Ausfüllen des Bezeichners kann bis zum Flush-Zeitpunkt verzögert werden. 2 Die Methode persist() garantiert, dass sie beim Aufruf nicht ausgelöst wird Wenn eine INSERT-Anweisung einen langen Sitzungsprozess kapseln muss, ist die Methode persist() erforderlich it Die INSERT-Anweisung wird sofort ausgeführt, egal ob innerhalb oder außerhalb der Transaktion. Was den Unterschied zwischen der lock()-Methode und der update()-Methode betrifft, besteht die update()-Methode darin, ein Objekt, das in einem getrennten Zustand geändert wurde, in einen dauerhaften Zustand zu ändern. Die Methode besteht darin, ein Objekt zu ändern, das nicht geändert wurde. Ein Objekt in einem losgelösten Zustand wird zu einem dauerhaften Zustand.Erklärt den Prozess des Ladens von Entitätsobjekten in Session.
1. Bevor die Datenbankabfragefunktion aufgerufen wird, durchsucht die Sitzung zunächst den Entitätstyp und den Primärschlüssel im Cache der ersten Ebene , es wird direkt zurückgegeben;
2. Wenn im Cache der ersten Ebene kein Treffer vorhanden ist, sucht die Sitzung im aktuellen NonExists-Datensatz (entspricht einer Abfrage-Blacklist). Eine Beurteilung kann schnell erfolgen, um die Leistung zu verbessern. Wenn die gleiche Abfragebedingung in NonExists vorliegt, geben Sie null zurück. Wenn die Cache-Abfrage der zweiten Ebene fehlschlägt. Level-Cache-Treffer, direkt zurückgeben; 4. Wenn keine der Abfragen getroffen wird, wird eine SQL-Anweisung ausgegeben. Wenn der entsprechende Datensatz nicht in der Abfrage gefunden wird, wird die Abfrage hinzugefügt NonExists der aufzuzeichnenden Sitzung und null werden gemäß der Mapping-Konfiguration und dem SQL-Anweisungs-ResultSet zurückgegeben und das entsprechende Entitätsobjekt erstellt Objekt in die Verwaltung der Sitzung (Cache der Ebene eins); 7. Wenn es einen entsprechenden Interceptor gibt, führen Sie die Methode onLoad aus Verwenden Sie den Cache der zweiten Ebene. Das Datenobjekt wird in den Cache der zweiten Ebene aufgenommen. 9.# Behandeln Sie die eingehenden Daten als Zeichenfolge und fügen Sie den eingehenden Daten automatisch Anführungszeichen hinzu. $ wird direkt eingegeben in SQL angezeigt und generiert.
Hinweis: Die Verwendung des Platzhalters „$“ kann zu SQL-Injection-Angriffen führen. Verwenden Sie „$“ nicht, wenn „#“ verwendet werden kann, wenn Sie die Order-by-Klausel schreiben.
Erklären Sie die Rolle des Namespace in MyBatis.
In großen Projekten kann es eine große Anzahl von SQL-Anweisungen geben. Derzeit ist es nicht einfach, jeder SQL-Anweisung eine eindeutige Identifikation (ID) zu geben.
Um dieses Problem zu lösen, können Sie in MyBatis für jede Mapping-Datei einen eindeutigen Namespace erstellen, sodass jede in dieser Mapping-Datei definierte SQL-Anweisung in diesem Namespace eine ID erhält.
Solange wir sicherstellen können, dass diese ID in jedem Namespace eindeutig ist, treten keine Konflikte mehr auf, auch wenn die Anweisungs-IDs in verschiedenen Zuordnungsdateien gleich sind.
Was bedeutet dynamisches SQL in MyBatis?
Für einige komplexe Abfragen können wir mehrere Abfragebedingungen angeben, aber diese Bedingungen können vorhanden sein oder auch nicht. Wenn wir das Persistenzschicht-Framework nicht verwenden, müssen wir die SQL-Anweisungen möglicherweise selbst zusammenstellen. Aber MyBatis bietet dynamische SQL-Funktionalität, um dieses Problem zu lösen. Zu den Elementen, die zur Implementierung von dynamischem SQL in MyBatis verwendet werden, gehören hauptsächlich:
- if - choose / when / otherwise - trim - where - set - foreach
Verwendungsbeispiele:
<select id="foo" parameterType="Blog" resultType="Blog"> select * from t_blog where 1 = 1 <if test="title != null"> and title = #{title} </if> <if test="content != null"> and content = #{content} </if> <if test="owner != null"> and owner = #{owner} </if> </select>
Was sind die Mängel der JDBC-Programmierung und wie MyBatis sie behebt Diese Fragen?
1. JDBC: Häufiges Erstellen und Freigeben von Datenbankverknüpfungen führt zu einer Verschwendung von Systemressourcen und beeinträchtigt die Systemleistung. Dieses Problem kann durch die Verwendung eines Datenbankverbindungspools gelöst werden.
MyBatis: Konfigurieren Sie den Datenlinkpool in SqlMapConfig.xml und verwenden Sie den Verbindungspool zum Verwalten von Datenbanklinks.
2. SQL-Anweisungen sind in den Code geschrieben, was die Wartung des Codes erschwert. Die tatsächliche Anwendung von SQL kann sich stark ändern, und SQL-Änderungen erfordern Änderungen am Java-Code.
MyBatis: Konfigurieren Sie die SQL-Anweisung in der Datei XXXXmapper.xml und trennen Sie sie vom Java-Code.
3. JDBC: Es ist mühsam, Parameter an die SQL-Anweisung zu übergeben, da die Where-Bedingung der SQL-Anweisung nicht unbedingt sicher ist, sie kann mehr oder weniger sein und die Platzhalter müssen den Parametern entsprechen eins zu eins.
MyBatis: Mybatis ordnet Java-Objekte automatisch SQL-Anweisungen zu.
4. Das Parsen der Ergebnismenge ist mühsam. SQL-Änderungen führen zu Änderungen im Parsing-Code und müssen vor dem Parsen der Datenbankdatensätze durchlaufen werden Objekte.
MyBatis: Mybatis ordnet SQL-Ausführungsergebnisse automatisch Java-Objekten zu.
Was sind die Unterschiede zwischen MyBatis und Hibernate?
1. Mybatis unterscheidet sich von Hibernate. Es handelt sich nicht vollständig um ein ORM-Framework, da MyBatis von Programmierern verlangt, SQL-Anweisungen selbst zu schreiben, aber Mybatis kann die SQL-Anweisungen flexibel für die Ausführung über XML oder Anmerkungen konfigurieren Und ordnen Sie Java-Objekte und SQL-Anweisungen zu, um das endgültig ausgeführte SQL zu generieren, und ordnen Sie schließlich die Ergebnisse der SQL-Ausführung zu, um Java-Objekte zu generieren.
2. Mybatis hat eine niedrige Lernschwelle und ist leicht zu erlernen. Es kann die SQL-Ausführungsleistung streng steuern und eignet sich sehr gut für die Softwareentwicklung Hohe Anforderungen an relationale Datenmodelle wie Internetsoftware, Unternehmensbetriebssoftware usw. Da sich die Anforderungen dieser Art von Software häufig ändern, müssen die Ergebnisse schnell ausgegeben werden, sobald sich die Anforderungen ändern.
Die Voraussetzung für Flexibilität ist jedoch, dass mybatis nicht datenbankunabhängig sein kann. Wenn Sie Software implementieren müssen, die mehrere Datenbanken unterstützt, müssen Sie mehrere Sätze von SQL-Zuordnungsdateien anpassen, was eine hohe Arbeitsbelastung darstellt.
3. Hibernate verfügt über starke Objekt-/Relational-Mapping-Funktionen und eine gute Datenbankunabhängigkeit. Wenn Sie Hibernate für die Entwicklung verwenden, können Sie hohe Anforderungen an relationale Modelle stellen viel Code und Verbesserung der Effizienz.
Der Nachteil von Hibernate besteht jedoch darin, dass die Lernschwelle hoch ist und die Schwelle zur Beherrschung noch höher ist. Darüber hinaus ist es wichtig, wie man O/R-Mapping gestaltet, wie man einen Kompromiss zwischen Leistung und Objektmodell eingeht Wie man Hibernate gut nutzt, erfordert viel Erfahrung und Können. Eine Softwarearchitektur mit guter Wartbarkeit und Skalierbarkeit gemäß den Bedürfnissen der Benutzer ist eine gute Architektur, daher ist das Framework nur dann das Beste, wenn es geeignet ist.
(Sie können hier auch auf der Grundlage Ihres eigenen Verständnisses sprechen, lassen Sie sich nicht überfordern)
Kurz über den First-Level-Cache und den Second-Level-Cache von MyBatis sprechen?Mybatis fragt zunächst die Ergebnismenge im Cache ab. Wenn keine Ergebnismenge vorhanden ist, fragt es die Datenbank ab. Wenn vorhanden, ruft es die Ergebnismenge aus dem Cache ab und gibt sie zurück Datenbank. Der interne Speichercache von Mybatis verwendet eine HashMap und der Schlüssel ist die Anweisung hashCode+sqlId+Sql. value ist das Java-Objekt, das durch Mapping aus der Abfrage generiert wird.
Der Cache der zweiten Ebene von Mybatis ist der Abfrage-Cache. Sein Bereich ist der Namespace eines Mappers, d. h. das Abfragen von SQL im selben Namespace kann Daten aus dem abrufen Cache. Der Cache der zweiten Ebene kann SqlSession umfassen.
Das obige ist der detaillierte Inhalt vonInterviewfragen zur Java-Persistenzschicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!