MyBatis Framework Ausführungsprozess:
1. Konfigurieren Sie die MyBatis -Konfigurationsdatei, sqlmapconfig.xml (der Name ist nicht behoben)
2. Laden Sie die MyBatis -Auslaufumgebung über Konfigurationsdateien und erstellen Sie die SQLSessionFactory Session Factory
SQLSessionFactory wird bei der tatsächlichen Verwendung auf Singleton verwendet.
3.. Erstellen Sie SQLSession durch SQLSessionFactory
SQLSession ist eine benutzerorientierte Schnittstelle (Bereitstellung von Betriebsdatenbankmethoden). Das Implementierungsobjekt ist Thread-Insecure. Es wird empfohlen, dass sich das Anwendungsszenario von SQLSession innerhalb des Method -Körpers befindet.
4. Rufen Sie die SQLSession -Methode an, um Daten zu manipulieren.
Wenn Sie eine Transaktion begehen müssen, müssen Sie die CONDY () -Methode der SQLSession ausführen.
5. Ressourcen freigeben und SQLSession schließen
Mapper -Agentenentwicklungsmethode (empfohlen)
Nur Programmierer müssen die Mapper -Schnittstelle schreiben (dh DAO -Schnittstelle)
Programmierer müssen beim Schreiben von mapper.xml (Mapping -Dateien) und Mapper.java eine Entwicklungsspezifikation befolgen:
1. Namespace in mapper.xml ist der vollständige Pfad der Mapper.java -Klasse.
2. Die ID der Anweisung in mappper.xml entspricht dem Methodennamen in mappper.java.
3. Die Parametertyp der Anweisung in mapper.xml gibt den Typ des Eingabeparameters und den Typ des Eingabeparameters der Mapper.java -Methode an.
4. Der Ergebnistyp der Anweisung in Mapper.xml gibt den Ausgabetyp und den Rückgabewerttyp der Mapper.java -Methode an.
Inhalt dieses Artikels:
Analysieren Sie das Bestellproduktdatenmodell.
Erweiterte Zuordnung: (lernen)
Implementieren Sie Eins-zu-Eins-Anfragen, Eins-zu-Viele-zu-Many-Anfragen und viele zu viele Anfragen.
Verzögerung der Belastung
Abfragesteuer
Stufe 1 Cache
Stufe 2 Cache (Verstehen Sie die Nutzungsszenarien von MyBatis Level 2 Cache)
MyBatis und Spirng Integration (Master)
Reverse Engineering (kann verwenden)
Produktdatenmodell bestellen
Ideen für Datenmodellanalyse
1. Dateninhalt in jeder Tabelle aufgezeichnet
Mit dem in jeder Tabelle vom Modul aufgezeichneten Inhalt zu vertraut ist dem Prozess der Lernsystemanforderungen (Funktionen).
2. Wichtige Feldeinstellungen für jede Tabelle
Nicht-leere Felder, ausländische Schlüsselfelder
3. Die Beziehung zwischen Tabellen auf Datenbankebene
Fremdschlüsselbeziehung
4. Geschäftsbeziehung zwischen Tabellen
Bei der Analyse der Geschäftsbeziehung zwischen Tabellen ist es notwendig, sie auf der Grundlage einer bestimmten geschäftlichen Bedeutung zu analysieren.
Datenmodellanalyse
Benutzer Tabelle Benutzer:
Notieren Sie Benutzerinformationen des gekauften Produkts
Bestell Tabelle: Bestellungen
Notiert die vom Benutzer erstellte Bestellung (Bestellung zum Kauf von Artikeln).
Bestelldetail: orderDetail:
Notieren Sie die detaillierten Informationen der Bestellung, nämlich die Informationen des Kaufs
Produktliste: Artikel
Aufgezeichnete Produktinformationen
Geschäftsbeziehung zwischen Tabellen:
Bei der Analyse der Geschäftsbeziehung zwischen Tabellen ist es notwendig, sie auf der Grundlage einer bestimmten geschäftlichen Bedeutung zu analysieren.
Analysieren Sie zunächst die Geschäftsbeziehung zwischen Tabellen mit Beziehungen zwischen Datenebenen:
Usre und Bestellungen:
Benutzer —-> Bestellungen: Ein Benutzer kann mehrere Bestellungen zu vielen erstellen
Bestellungen -> Benutzer: Eine Bestellung wird von nur einem Benutzer erstellt, eins zu eins
Bestellungen und Auftragsdetail:
Bestellungen> OrderDetail: Eine Bestellung kann mehrere Bestelldetails enthalten, da eine Bestellung mehrere Artikel kaufen kann und die Kaufinformationen jedes Artikels in der orderdetailer und ein-zu-Viele-Beziehung aufgezeichnet werden können
orderDetail> Bestellungen: Ein Bestelldetail kann nur in einer Bestellung enthalten sein, eins zu eins
orderDetail und itemsm:
orderDetail-> itemsms: Eine Bestelldetails entspricht nur einer Produktinformation, eins zu eins
Artikel> OrderDetail: Ein Produkt kann in mehreren Bestelldetails enthalten sein, eins zu vielen
Analysieren Sie dann, ob es eine Geschäftsbeziehung zwischen Tabellen gibt, die nicht mit der Datenbankebene zusammenhängen:
Bestellungen und Gegenstände:
Die Beziehung zwischen Bestellungen und Gegenständen kann über die OrderDetail -Tabelle festgelegt werden.
Benutzer und Elemente: Stellen Sie eine viele zu viele Beziehung durch andere Tabellen dar
Eins-zu-Eins-Anfrage
Anforderungen: Abfrageinformationen und Associate Abfrage Benutzerinformationen zum Erstellen von Bestellungen assoziieren
Verwenden Sie das Ergebnistyp zum Abfragen
Berücksichtigung der Verwendung von SQL -Anweisungen
Bestimmen Sie die primäre Tabelle der Abfrage: Bestellentabelle
Bestimmen Sie die Assoziationstabelle für die Abfrage: Benutzertabelle
Verwendet die Association -Abfrage einen internen Link oder einen externen Link?
Da es in der Bestellentabelle einen Fremdschlüssel (user_id) gibt, kann nur ein Datensatz gefunden werden, indem die Benutzertabelle über fremde Schlüsselvereinigung abfragt und interne Links verwendet werden können.
Bestellungen auswählen.*, User.username, user.sex, user.address Fromorders, Benutzer wobei ordnungen.user_id = user.id
Pojo erstellen (ordnerscustom.java)
Zeichnen Sie die Ergebnisse der obigen SQL -Abfrage in Pojo ab, die alle Spaltennamen der Abfrage enthalten müssen.
Die ursprünglichen Bestellungen. Java kann nicht alle Felder zuordnen, und ein neu erstelltes Pojo ist erforderlich.
Erstellen Sie eine PO -Klasse, die eine PO -Klasse erbt, die viele Abfragefelder enthält.
BestellungenMapperCustom.xml
BestellungenMapperCustom.java
Schreiben Sie Testkurse
Klicken Sie mit der rechten Maustaste auf die ordersMapperCustom.java-Datei> Neue> Andere aus Wählen
Schreiben Sie den folgenden Code in BestellungenMapperCustomTest.java:
public class ordersMapperCustomTest {private sqlSessionFactory SQLSessionFactory; // Diese Methode soll @BeforePublic void setup () ausführen {// sqlSessionFactory // MyBatis Configuration Datei String Resource = " Resources.getResourceAsStream(resource);// Create a session factory and pass in mybatis configuration file information sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindOrdersUser() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();// Create Proxy -Objekt -BestellungenMapperCustom ordnersMapperCustom = sqlSession.getMapper (ordnersmapperCustom.class); // Aufrufen von Mapper -Methodenliste <ordnerscustom> list = ordersmapperCustom.FindorderSuser ();Verwenden Sie Ergebnismap zur Abfrage
SQL -Anweisung: SQL im selben Ergebnistyp implementiert
Ideen für die Verwendung von Ergebnismap -Mapping
Verwenden Sie Ergebnismap, um die Auftragsinformationen im Abfrageergebnis dem Objekt des Bestells zuordnen, das Benutzerattribut in der Klasse der Bestellungen hinzuzufügen und die zugeordneten Abfrage -Benutzerinformationen dem Benutzerattribut im Objekt des Bestells abzuordnen.
Benutzerattribut zur Bestellungsklasse hinzufügen
BestellungenMapperCustom.xml
Resultmap definieren
TYEP: bedeutet, die Ergebnisse der gesamten Abfrage auf eine bestimmte Klasse abzubilden, z.
ID: Repräsentiert die eindeutige Kennung der Abfragespalte in der Datenbanktabelle, die eindeutige Kennung in den Auftragsinformationen. Wenn es mehrere Spalten gibt, die eine eindeutige Kennung bilden, konfigurieren Sie mehrere IDs.
Spalte: Eine eindeutige Spalte für Identifikationen für Bestellinformationen in der Datenbanktabelle
Eigenschaft: Welche Eigenschaft wird von der eindeutigen Identifikationsspalte der Auftragsinformationen auf Bestellungen zugeordnet?
Assoziation: Wird verwendet, um Informationen zum Abfragen einzelner Objekte zu erordnen
Eigenschaft: Welche Eigenschaft in Bestellungen, um die Benutzerinformationen der zugehörigen Abfrage zuzuordnen
Javatype: Welche Eigenschaft dem Benutzer zugeordnet ist
<!-Der Ergebnis des zugeordneten Benutzers ordnet das Ergebnis der gesamten Abfrage in cn.itcast.mybatis.po.Orders-> <resultmap type = "cn.itcast.mybatis.po.Orders" id = "ordnersuserresultmap"> <! Wenn mehrere Spalten zur Bildung einer eindeutigen Kennung vorhanden sind, konfigurieren Sie mehrere IDColumn: Eindeutige Identifikationsspalte der Auftragsinformation Eigenschaft: Welche Eigenschaft in Bestellungen wird durch die eindeutige Identifikatorspalte der Auftragsinformationen abgebildet-> <id column = "id" properation = "id" /> <resultation column = "user_id" userId "userId" /> <resulting columne Column = "Hinweis" Eigenschaft = Hinweis/> <!-Konfigurieren Sie die zugeordneten zugeordneten Benutzerinformationen-> <!-Assoziation: Informationen zum Zuordnen der zugeordneten Query-Einzelobjekteigenschaft: Welche Eigenschaft in Bestellungen zur Zuordnung der Benutzerinformationen der zugeordneten Abfrage zu-> <Association Eigenschaft = "Benutzer" Javatype = "cn.itcast.mybatis.po.Po. Javatype: Welche Eigenschaft, die dem Benutzer zugeordnet ist -> <id column = "user_id" properation = "id"/> <resultal column = "userername
Aussage Definition
BestellungenMapperCustom.java
Testcode
@Testpublic void testfindOrdersuserresultmap () löst Ausnahme aus {sqlSession sqlSession = sqlSessionFactory.OpenSession (); // Proxy -Objektordnungen erstellen ordnungsmapperCustom ordsMapperCustom = SQLSession.getmapper (ordermapperCustom ordersMapperCustom); ordersMapperCustom.FindorderSuserresultmap (); System.out.println (Liste); SQLSession.close ();}resultType und resultmap implementieren ein-zu-eins-Abfragezusammenfassung
ERGEBNISSTYPE: Es ist relativ einfach, mit dem Ergebnistyp zu implementieren. Wenn der Name der Abfragespalten nicht im Pojo enthalten ist, müssen Sie die entsprechenden Attribute des Spaltennamens hinzufügen, um die Zuordnung zu vervollständigen.
Wenn es keine besonderen Anforderungen an Abfrageergebnisse gibt, wird empfohlen, das Ergebnistyp zu verwenden.
resultMap: Der resultmap muss separat definiert werden, was etwas problematisch ist. Wenn es spezielle Anforderungen an Abfrageergebnisse gibt, kann die Verwendung von Ergebnismap die Attribute des zugehörigen Abfrage -Mapping -Pojo abschließen.
resultMap kann faule Laden implementieren, das Ergebnistyp kann keine faulen Laden implementieren.
Eins-zu-Vielfalt-Anfrage
Anforderungen: Abfrageberechnung und Bestelldetails Informationen.
SQL -Anweisung
Bestimmen Sie die Hauptabfragetabelle: Bestellentabelle
Bestimmen Sie die zugehörige Abfragetabelle: Bestelldetails Tabelle
Fügen Sie einfach Bestelldetails List Association basierend auf Eins-zu-Eins-Abfrage hinzu.
SELECTorders.*,USER.username,USER.sex,USER.address,orderdetail.id orderdetail_id,orderdetail.items_id,orderdetail.items_num,orderdetail.orders_idFROMorders,USER,orderdetailWHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
Analyse: Verwenden Sie das Ergebnistyp, um die obigen Abfrageergebnisse in Pojo zuzuordnen, und die Auftragsinformationen sind Duplikation.
Anforderung: Duplizierte Aufzeichnungen können nicht für Bestellungen auftreten.
Fügen Sie die Liste <orderDetail> orderDetails addieren Sie in der Klasse orders.java.
Schließlich werden die Auftragsinformationen in Bestellungen zugeordnet, und die Auftragsdetails, die der Bestellung entsprechen, werden in Bestellungen in die orderDetails -Eigenschaft zugeordnet.
Die Anzahl der in zugeordneten Bestellungen aufgezeichneten Bestellungen beträgt zwei (Bestellinformationen werden nicht wiederholt)
Die orderDetails -Eigenschaft in jedem Bestellungen speichert die Bestelldetails, die der Bestellung entsprechen.
Listenbestelldetails Attribut in ordnes.java hinzufügen
BestellungenMapperCustom.xml
resultMap Definition
Verwenden Sie die Vererbung erweitert, ohne die Zuordnung von Bestellinformationen und Benutzerinformationen in zu konfigurieren
Sammlung: Abfragen Sie mehrere Datensätze, um dem Sammlungsobjekt für die Association -Abfrage zuzuordnen
Eigenschaft: Kartieren Sie die Assoziationsabfrage zu mehreren Datensätzen an cn.itcast.mybatis.po.Orders, welche Eigenschaft cn.itcast.mybatis.po.orders zugeordnet ist
OFTYPE: Gibt den Typ an, der das Pojo im Listensammelsattribut enthält
<!-Der Ergebnismap für Bestellungen und Auftragsdetails wird mithilfe von Erweiterungen vererbt und muss nicht die Zuordnung von Bestellinformationen und Benutzerinformationen darin konfigurieren-> <resultmap type = "cn.itcast.mybatis.po.Orders" id = "ordnersandorderDetailResultmap" Extendeds = "-DestsuSresultMap"> <!-> <!-ustersuSresultMap. Erben muss nicht die Zuordnung von Bestellinformationen und Benutzerinformationen in IT konfigurieren-> <!-Auftragsdetails Informationen Eine Auftragsvereinbarung hat mehrere Details. Um die Sammlung zu verwenden, um die Kartensammlung zu verwenden: MAP Mehrere Datensätze in die Eigenschaft des Sammlungsobjekts: Map Association Abfrage zu mehreren Datensätzen zu cn.itcast.mybatis.po.Orders Welche Eigenschaft von Type: Geben Sie die Art der Pojo-Karte an, um die Sammlungseigenschaften aufzulisten-> <Collection Eigenschaften Die eindeutige Kennung der Bestelldetails zu cn.itcast.mybatis.po.orderDetail-> <id column = "orderDetail_id" Property = "id"/> <resultal = "itsels_id" Property = "itemsId"/> <resulting column = "items_num
BestellungenMapperCustom.java
Testcode:
@Testpublic void testfindordersandorderDetailResultmap () Ausläuft Ausnahme {SQLSession SQLSession = SQLSessionFactory.openSession (); // Proxy -Objektordnungen erstellen. ordersMapperCustom.findordersandorderDetailResultMap (); System.out.println (Liste); SQLSession.close ();}Zusammenfassung
MyBatis verwendet die Sammlung von ResultMap, um mehrere Datensätze der zugehörigen Abfrage in eine Listensammelseigenschaft zuzuordnen.
Implementierung mit Ergebnistyp:
Zuordnungsdetails in OrderDetails In Bestellungen müssen Sie sie selbst verarbeiten, mit einer Doppelschleife durchqueren, doppelte Datensätze entfernen und Auftragsdetails in OrderDetails platzieren.
Viele zu viele Anfragen
Anforderungen: Benutzer- und Benutzerkaufinformationen abfragen.
SQL -Anweisung
Die Haupttabelle der Abfrage ist: Benutzertabelle
Assoziationstabelle: Da der Benutzer und das Produkt nicht direkt miteinander verbunden sind, werden sie durch Bestellungen und Bestelldetails verwandt, sodass die Assoziationstabelle: Bestellungen, OrderDetail, Elemente
SELECT orders.*,USER.username,USER.sex,USER.address,orderdetail.id orderdetail_id,orderdetail.items_id,orderdetail.items_num,orderdetail.orders_id,items.name items_name,items.detail items_detail,items.price items_priceFROMorders,USER,orderdetail,itemsWHERE orders.user_id = user.id und orderDetail.orders_id = orders.id und orderDetail.items_id = itsels.id
Mapping -Ideen
Benutzerinformationen in den Benutzer abgeben.
Fügen Sie die Auftragslisten -Attributliste <Bestellungen> Bestelllist in der Benutzerklasse hinzu, um die vom Benutzer erstellten Bestellungen in die Bestelllistliste zuzuordnen
Fügen Sie Bestelldetails List -Eigenschaftsliste <OrderDetail> orderDetials in Bestellungen zu ordnungsgemäßen orderDetials hinzu
Fügen Sie die Elemente -Eigenschaften in Ordnung hinzu, um die Elemente zu kartieren, die den Bestelldetails entsprechen, zu Elementen
BestellungenMapperCustom.xml
resultMap Definition
<!-Abfragen Sie den Benutzer und die gekauften Produkte-> <resultMap type = "cn.itcast.mybatis.po.User" id = "userAndItemSresultMap"> <!-Benutzerinformationen-> <id column = "user_id" Property "ID" ID "/> userername" username "username" username "/> <sergebnisspalte =". Property = "Adresse"/> <!-Auftragsinformationen Ein Benutzer entspricht mehreren Bestellungen und verwenden Sie die Sammlung Mapping-> <Collection Property = "ordnerslist" ofType = "cn.itcast.mybatis.po.Orders"> <id column = "id" id "id" id "id"/> <resultal user_id cools Property = "createTime"/> <resultal column = "note" property = "note"/> <!-Auftragsdetails Eine Bestellung enthält mehrere Details-> <Sammlung Eigenschaft = "orderDetails" oftype = "cn.itcast.mybatis.po.OrderDetail"> <id "orderDetail_id probium =" id "/id"/> <sergebnisse column = "items_num" property = "itemsnum"/> <resultal column = "orders_id" Property = "ordnerssid"/> <!-Produktinformationen Ein Auftragsdetail entspricht einem Produkt-> <Assoziation prob. column = "items_detail" property = "detail"/> <result column = "items_price" Property = "preis"/> </assoziation> </sammel> </sammel> </resultmap>
BestellungenMapperCustom.java
Testcode:
@TestPublic void testfinduserandItemSultmap () löst Ausnahme aus {SQLSession SQLSession = SQLSessionFactory.OpenSession (); // Proxy -Objektordnungen erstellen. ordersMapperCustom.finduserandItemSresultMap (); System.out.println (Liste); sqlSession.close ();} Viele-zu-Viele-Anfragenzusammenfassung
Die detaillierte Liste der vom Benutzer gekauften Produktinformationen wird überprüft (Benutzername, Benutzeradresse, Produktname, Kaufzeit, Kaufmenge)
Als Reaktion auf die oben genannten Anforderungen verwenden wir das Ergebnistyp, um die Abfragendatensätze in ein erweitertes Pojo zuzuordnen, was sehr einfach ist, die Funktion einer detaillierten Liste zu implementieren.
Eins-zu-Many ist ein besonderer Fall von vielen zu vielen vielen zu vielen: wie folgt:
Bei der Abfrage der von den Benutzern gekauften Produktinformationen ist die Beziehung zwischen dem Benutzer und dem Produkt eine viel- und Viele Beziehung.
Anforderung 1:
Abfragefelder: Benutzerkonto, Benutzername, Benutzergeschlecht, Produktname, Produktpreis (am häufigsten)
Häufige detaillierte Listen in der Enterprise -Entwicklung, detaillierte Produktlisten von Produkten, die von Benutzern gekauft wurden,
Verwenden Sie das Ergebnistyp, um die obige Abfragespalte der Pojo -Ausgabe zuzuordnen.
Anforderung 2:
Abfragefelder: Benutzerkonto, Benutzername, Menge an gekauften Artikeln, Produktdetails (Maus, um Details anzuzeigen)
Verwenden Sie Ergebnismap, um die gekaufte Produktdetail -Liste des Benutzers in das Benutzerobjekt zuzuordnen.
Zusammenfassen:
Die Verwendung von resultMap ist für die Funktionen, die spezielle Anforderungen für die Abfrageergebniszuordnung haben, z. B. die Zuordnung von speziellen Anforderungen in Listen, einschließlich mehrerer Listen.
Zusammenfassung des Ergebnistyps und des Ergebnismaps
Ergebnistyp:
Wirkung:
Zeichnen Sie die Abfrageergebnisse in Pojo gemäß dem SQL -Spaltennamen POJO -Attributname -Konsistenz ab.
Gelegenheit:
Häufige Anzeige detaillierter Datensätze, z. B. wenn Benutzer Produktdetails kaufen und alle zugehörigen Abfrageinformationen auf der Seite anzeigen, können Sie direkt den Ergebnistyp verwenden, um jeden Datensatz zu erbleiben.
Schießen Sie in das Pojo und durchqueren Sie die Liste (Pojo in der Liste) auf der Front-End-Seite.
resultMap:
Verwenden Sie Association und Sammlung, um eins zu eins und ein-zu-Viele erweiterte Mapping zu vervollständigen (es gibt spezielle Zuordnungsanforderungen für die Ergebnisse).
Verein:
Wirkung:
Zeichnen Sie die zugehörigen Abfrageinformationen in ein Pojo -Objekt ab.
Gelegenheit:
Um die Abfragen zugeordneten Informationen zu erleichtern, können Sie mit Association zugehörige Auftragsinformationen in Pojo -Attribute von Benutzerobjekten abgeben, z. B.: Abfragestellungen und zugehörige Benutzerinformationen.
Wenn Sie den Ergebnistyp verwenden, kann die Abfrageergebnisse nicht dem Pojo -Attribut des Pojo -Objekts zugeordnet werden. Wählen Sie, ob das Ergebnistyp oder das Ergebnismap entsprechend den Anforderungen des Durchquerens der Abfrage "Ergebnismenge" verwendet werden soll.
Sammlung:
Wirkung:
Zeichnen Sie die zugehörigen Abfrageinformationen in eine Listensammlung ab.
Gelegenheit:
Um die Abfrageinformationen zu erleichtern, können Sie die Sammlung der Assoziationsinformationen in die Listensammlung abbilden, z. B.: Abfragen des Benutzerberechtigungs -Bereichsmoduls und des Menüs unter dem Modul können Sie die Sammlung verwenden, um die Modulliste zu kartieren, um die Menülistenattribute des Modulobjekts zu kartieren. Der Zweck davon besteht auch darin, die Abfrage des Abfrageergebnisses zu erleichtern.
Wenn Sie das Ergebnistyp verwenden, können Sie die Abfrageergebnisse nicht der Listensammlung zuordnen.
Verzögerung der Belastung
Ergebnismap kann erweiterte Zuordnung implementieren (mithilfe von Assoziation und Sammlung, um Eins-zu-Eins- und Eins-zu-Viele-Mapping zu implementieren). Die Assoziation und die Sammlung haben faule Ladefunktionen.
brauchen:
Wenn die Bestellung abgefragt wird und die Benutzerinformationen zugeordnet sind. Wenn wir zuerst die Bestellinformationen abfragen, um die Anforderungen zu erfüllen, werden wir die Benutzerinformationen abfragen, wenn wir die Benutzerinformationen abfragen müssen. Das Abfragen von Benutzerinformationen auf Bedarf ist verzögert das Laden.
Ladeverzögerung: Erste Abfrage aus einer einzelnen Tabelle und dann aus der zugehörigen Tabelle bei Bedarf, wobei die Datenbankleistung erheblich verbessert wird, da die Abfragung einer einzelnen Tabelle schneller ist als die Abfrage mehrerer Tabellen.
Verwenden Sie Association, um faules Laden zu implementieren
Anforderungen: Abfragebereitungen und assoziierte Abfragebutzungsinformationen
Ordresmappercustom.xml
Es ist notwendig, die Anweisung zu definieren, die den beiden Mapper -Methoden entspricht.
1. Informationen nur Abfrageberechnungsinformationen
Wählen Sie * aus Bestellungen aus
Verwenden Sie Association, um das Laden zu verzögern (ausführen). Die folgende Zufriedenheit (Association -Abfrage -Benutzerinformationen) in der Anweisung der Abfragereihenfolge
2. Verwandte Abfragen Benutzerinformationen
User_id wird verwendet, um Benutzerinformationen abzufragen, indem sie dem user_id in der obigen Bestellinformationsabfrage folgen
Verwenden Sie FindUserById in UsMapper.xml
Das obige führt zuerst FindORDERSUSERLACYLOADING aus, und wenn Sie den Benutzer abfragen müssen, wird FindUserById ausgeführt, und die verzögerte Lade und Ausführung werden durch die Definition von resultMap konfiguriert.
Verzögerung der Belastungsergebnismap
Verwenden Sie die Auswahl im Verband, um die ID der Anweisung zu geben, die durch faules Laden ausgeführt werden soll.
<!-- Lazy loaded resultMap --><resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap"><!-- Mapping configuration of order information--><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><result column = "createTime" property = "createTime"/> <result column = "note" properation = "note"/> <!-Zuordnungskonfiguration von Bestellinformationen-> <id column = "id" Property = "user_id" Eigenschaft = "userID"/> <resulting column = "number" property
Wählen Sie: Geben Sie die ID der Anweisung an, die für faule Laden ausgeführt werden soll (die Anweisung, die Benutzerinformationen basierend auf user_id anschließt)
Um FindUserById in UsMapper.xml zu verwenden, um die Abfrage basierend auf Benutzerinformationen (Benutzer -ID) zu vervollständigen. Wenn FindUserById nicht in diesem Mapper ist, müssen Sie einen Namespace hinzufügen.
Spalte: Die Spalte in den mit der Benutzerinformationsabfrage zugeordneten Auftragsinformationen ist user_id
Die SQL für Association -Abfrage wird als:
Bestellungen auswählen. column = "user_id"> <!-implementieren
OrderesMapperCustom.java
Testideen:
1. Führen Sie die oben genannte Mapper -Methode (findOrderSerLAnlaDing) aus und rufen Sie FindOrtersUserLazyLoading in cn.itcast.mybatis.mapper.OrdersMapperCustom auf nur Abfrageinformationen (einzelne Tabelle) auf.
2. Überqueren Sie im Programm die im vorherige Schritt abfragte Liste <ordnungen>. Wenn wir die GetUser -Methode in Bestellungen anrufen, beginnen wir faul zu laden.
3. Aufrufen Sie das Laden, rufen Sie die FindUserById -Methode in UsMapper.xml an, um Benutzerinformationen zu erhalten.
Faule Lastkonfiguration
MyBatis ermöglicht das lazy Loading standardmäßig nicht und muss in sqlmapconfig.xml konfiguriert werden.
Konfigurieren Sie in MyBatis Core -Konfigurationsdatei:
Setzen Sie die Artikelbeschreibung zulässiger Wert Standardwert
LazyLoadingNabled Global Lazy Loading einstellen. Wenn sie auf "False" gesetzt sind, werden alle zugeordneten initialisiert und geladen. wahr oder falsch
aggressive Ladung Wenn auf 'true' eingestellt werden, können faule Ladeobjekte von allen faulen Eigenschaften geladen werden. Andernfalls wird jede Eigenschaft nach Bedarf geladen. wahr oder falsch wahr
Konfiguration in SQLMAPConfig.xml:
Testcode
Über verzögerte Belastung nachdenken
Wie kann man fauler Laden erreichen, ohne die von MyBatis bereitgestellte Assoziation und Sammlung zu verwenden?
Die Implementierungsmethode lautet wie folgt:
Definieren Sie zwei Mapper -Methoden:
1. Fragen Sie die Bestellliste an
2. Benutzerinformationen basierend auf der Benutzer -ID abfragen
Implementierungsideen:
Überprüfen Sie zunächst die erste Mapper -Methode und erhalten Sie die Auftragsinformationsliste
Rufen Sie im Programm (Service) die zweite Mapper -Methode nach Bedarf an, um Benutzerinformationen abzufragen.
Kurz gesagt: Verwenden Sie die faule Lademethode, um einfache SQL abzufragen (vorzugsweise können Sie auch Abfragen assoziieren) und dann andere Informationen der zugehörigen Abfragen nach Bedarf laden.
Abfragesteuer
MyBatis bietet Abfrage -Caches, um den Datendruck zu reduzieren und die Datenbankleistung zu verbessern.
Mybaits bietet Cache und Cache auf zweiter Ebene.
Level-1-Cache ist ein Cache mit SQLSession-Level-Level. Beim Betrieb der Datenbank müssen Sie das SQLSession -Objekt konstruieren, und es gibt eine Datenstruktur (HashMap) im Objekt zum Speichern von zwischengespeicherten Daten. Die zwischengespeicherten Datenbereiche (Hashmaps) zwischen verschiedenen SQLSessionen beeinflussen sich nicht gegenseitig.
Der sekundäre Cache ist ein Cache auf Mapper-Ebene. Mehrere SQLSessions betreiben die SQL -Anweisungen desselben Mapper. Mehrere SQLSessions können den sekundären Cache teilen. Der sekundäre Cache ist CrossqlSession.
Warum Cache verwenden?
Wenn im Cache Daten vorhanden sind, müssen Sie diese nicht aus der Datenbank abrufen, was die Systemleistung erheblich verbessert.
Stufe 1 Cache
Erststufe-Caching-Arbeitsprinzip
Wenn ich zum ersten Mal eine Abfrage zu Benutzerinformationen mit Benutzer -ID 1 initiierte, suchen Sie zunächst, ob Benutzerinformationen mit Benutzerinformationen mit ID 1 im Cache vorhanden sind. Wenn nicht, fragen Sie Benutzerinformationen aus der Datenbank.
Holen Sie sich Benutzerinformationen und speichern Sie Benutzerinformationen in einem Cache der ersten Ebene.
Wenn SQLSession Commit-Operationen ausführt (führt Insertion, Aktualisierung und Löschung aus) aus, löscht den Cache der ersten Stufe in SQLSession. Der Zweck davon ist, den Cache -Speicher zu den neuesten Informationen zu machen und schmutziges Lesen zu vermeiden.
Beim zweiten Mal habe ich eine Abfrage zu Benutzerinformationen mit Benutzer -ID 1 eingeleitet. Suchen Sie zunächst nach, ob Benutzerinformationen mit Benutzerinformationen mit ID 1 im Cache vorhanden sind. Wenn im Cache einen vorhanden ist, werde ich Benutzerinformationen direkt aus dem Cache erhalten.
Stufe 1 Cache -Tests
MyBatis unterstützt standardmäßig das Ausbruch der ersten Ebene und muss in der Konfigurationsdatei nicht konfiguriert werden.
Befolgen Sie die obigen Hauptschritte der Stufe One Cache, um zu testen.
//ORDERSMAPPERCUSNTOMTEST.JAVA@TESTPUBLIC VOID TESTCACHE1 () löst Ausnahme aus. Initiiert und der Benutzer mit ID 1 ist Abfrage user1 = userMapper.FinduserById (1); System.out.println (user1); // Wenn SQLSession Commit-Operationen ausführt (Ausführung von Einfügen, Aktualisierungen und Löschen), löscht den ersten Level-Cache in SQLSession. Der Zweck davon ist, den Cache -Speicher zu den neuesten Informationen zu machen und schmutziges Lesen zu vermeiden. // Die Information von User1 user1.Setusername aktualisieren ("Test User22"); usermapper.Updateuser (user1); // Ausführen von Commit -Operationen, um den Cache SQLSession.commit (); // die zweite Anfrage zu starten und den Benutzer mit ID 1 Benutzer user2 = userMapper.finduserbyId (1); System.out.println (Benutzer2);Stufe 1 Cache -Anwendung
Die formale Entwicklung besteht darin, Mybatis und Frühling zu integrieren, und Transaktionen werden im Dienst gesteuert.
Eine Servicemethode enthält viele Mapper -Methodenaufrufe.
Service {// Bei Beginn der Ausführung starten Sie die Transaktion und erstellen Sie das SQLSession-Objekt // Rufen Sie die Methode von Mapper zum ersten Mal auf FindUserById (1) // Zellen Sie die Methode von Mapper zum zweiten Mal FindUserById (1).Wenn Sie zwei Serviceanrufe ausführen, um dieselben Benutzerinformationen abzufragen, gehen Sie nicht zum Cache der ersten Ebene, da die Sitzungsmethode endet, die SQLSession geschlossen wird und der Cache der ersten Stufe gelöscht wird.
Stufe 2 Cache
Prinzip
Aktivieren Sie zunächst den Cache der zweiten Ebene von MyBatis.
SQLSession1 Querys Benutzerinformationen mit Benutzer -ID 1. Wenn Sie Benutzerinformationen abfragen, werden die Abfragendaten im sekundären Cache gespeichert.
Wenn SQLSession3 SQL unter derselben Karte ausführt, führt die Einreichung der Befreiung aus und löscht die Daten im sekundären Cache -Bereich unter dem Mapper.
SQLSession2 Querys die Benutzerinformationen mit der Benutzer -ID 1 und findet heraus, ob Daten im Cache enthalten sind. Wenn es vorhanden ist, werden die Daten direkt aus dem Cache abgerufen.
Der Unterschied zwischen dem sekundären Cache und dem primären Cache ist größer. Der Bereich des sekundären Cache ist größer. Mehrere SQLSessions können den sekundären Cache -Bereich eines UsMapper teilen.
UsMapper verfügt über einen sekundären Cache -Bereich (unterteilt mit dem Namespace), und andere Mappper haben auch einen eigenen sekundären Cache -Bereich (unterteilt mit dem Namespace).
Jeder Namespace Mapper verfügt über einen zweiten Cache -Bereich. Wenn der Namespace der beiden Mapper gleich ist, haben die beiden Mapper den gleichen zweiten Cache -Bereich, wenn die Daten von SQL ausgeführt werden.
Schalten Sie Level 2 Cache ein
Der Mybait-Cache der zweiten Stufe ist das Mapper-Bereichsebene. Zusätzlich zum Einstellen des Hauptschalters des Cache der zweiten Ebene in SQLMAPConfig.xml muss der Cache der zweiten Ebene auch in der spezifischen Mapper.xml aktiviert werden.
Hinzufügen zur Kernkonfigurationsdatei SQLMAPConfig.xml
<Einstellung name = "cacheeNabled" value = "true"/>
Beschreibung zulässiger Wert Standardwert
CacheEnabled weltweit Ein-/Aus -Einstellungen für alle Caches unter dieser Konfigurationsdatei. wahr oder falsch
Schalten Sie den sekundären Cache in usermapper.xml ein, und die SQL -Ausführung unter UsMapper.xml wird in seinem Cache -Bereich (HashMap) gespeichert.
Rufen Sie die Pojo -Klasse an, um die Serialisierungsschnittstelle zu implementieren
Um zwischengespeicherte Daten zu extrahieren, werden Deserialisierungsvorgänge durchgeführt, da die sekundären zwischengespeicherten Datenspeichermedien unterschiedlich und im Speicher unterschiedlich sind.
Stufe 2 Cache -Test
@TestPublic void testcache2 () löst Ausnahme aus {sqlSession SQLSession1 = SQLSessionFactory.openSession (); SQLSession1.getMapper (UsMapper.Class); // Die erste Anforderung initiieren und den Benutzer mit ID 1 Benutzer user1 = userMapper1.FinduserById (1); Führen Sie die commit () Operation UsMapper UsMapper3 = SQLSession3.GetMapper (UsMapper.Class); Benutzer Benutzer = UsMapper3.finduserById (1); user.Setusername ("Zhang Mingming"); UsMapper3.updateuser (Benutzer). SQLSession3.Commit ();Usecache -Konfiguration
Das Einstellen von Usecache = false in der Anweisung kann den sekundären Cache der aktuellen Auswahlanweisung deaktivieren. Jede Abfrage wird SQL für die Abfrage ausgeben. Die Standardeinstellung ist wahr, dh der SQL verwendet Sekundärcache.
<select id = "findOrderListResultmap" resultMap = "ordnersUnermap" usecache = "false">
Zusammenfassung: Für jede Abfrage ist die neuesten Daten SQL erforderlich. Stellen Sie es auf usecache = false ein und deaktivieren Sie den sekundären Cache.
Cache aktualisieren
Löschen Sie einfach den Cache
Im gleichen Namespace des Mapper muss der Cache aktualisiert werden, wenn andere Dateneinfügungsdaten vorhanden, aktualisiert oder gelöscht werden. Wenn der Cache nicht aktualisiert wird, wird ein schmutziges Lesen erfolgt.
Legen Sie die Eigenschaft flushcache = "True" in der Anweisungskonfiguration ein. Standardmäßig ist es wahr, was bedeutet, dass der Cache aktualisiert wird. Wenn es in False geändert wird, wird es nicht aktualisiert. Bei der Verwendung von Cache werden schmutzige Lesevorgänge auftreten, wenn Sie die Abfragedaten in der Datenbanktabelle manuell ändern.
<Insert ID = "InsertUser" ParameterType = "cn.itcast.mybatis.po.user" Flushcache = "true">
Zusammenfassung: Im Allgemeinen muss der Cache nach Ausführung des Ausgangsbetriebs aktualisiert werden. Flushcache = True bedeutet, den Cache zu aktualisieren, wodurch das schmutzige Lesen der Datenbank vermieden wird.
MyBatis Integration EHCache
ehcache是一个分布式缓存框架。
分布缓存
我们系统为了提高系统并发,性能、一般对系统进行分布式部署(集群部署方式)
不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。
mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。
整合ehcache方法(掌握)
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
mybatis默认实现cache类是:
加入ehcache包
整合ehcache
配置mapper中cache中的type为ehcache对cache接口的实现类型。
加入ehcache的配置文件(在classpath下配置ehcache.xml)
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><diskStore path="F:/develop/ehcache" /><defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000"eternal="false" overflowToDisk="false" timeToIdleSeconds="120"timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache></ehcache>
属性说明:
diskStore:指定数据在磁盘中的存储位置。
defaultCache:当借助CacheManager.add(“demoCache”)创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
二级应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
二级缓存局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。