English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ein eine-zu-eine-Abfrage bedeutet, dass wir andere Tabellendaten abrufen müssen, wenn wir Daten einer Tabelle abrufen.
Bedarf
Zunächst ein kleines Bedarf für die eine-zu-eine-Abfrage: Angenommen, wir müssen bei der Abfrage von Auftragsinformationen die Benutzerinformationen des Benutzers abrufen, der diesen Auftrag erstellt hat. Das Modell ist wie folgt (
ResultType
Schreiben von SQL-Anweisungen
Zunächst müssen wir unsere Anforderungen analysieren.1. Wir müssen bestimmen, welche beiden Tabellen der Bedarf beinhaltet, welche der Haupttabelle und welche der Verknüpfungstabelle sind. Wie man das bestimmt, hängt von den Anforderungen ab - unsere Anforderungen sind, dass wir bei der Abfrage von Aufträgen gleichzeitig die Benutzerinformationen des Benutzers, der diesen Auftrag erstellt hat, abrufen. Das ist sehr offensichtlich. Unsere Haupttabelle ist die Auftrags-Tabelle (orders). Und die Verknüpfungstabelle ist die Benutzer-Tabelle (user).
Zu diesem Zeitpunkt können wir die folgenden SQL-Anweisungen schreiben:
auswählen * von orders
Zu diesem Zeitpunkt sollten wir uns diese Frage stellen: Sollten wir bei der Verknüpfungssuche eine innere oder eine äußere Verknüpfung verwenden? Für diejenigen, die sich nicht sicher sind, was innere und äußere Verknüpfungen sind, erkläre ich sie hier zunächst kurz, werde später einen Blog darüber schreiben: Eine innere Verknüpfung zeigt nur die erfüllten Bedingungen. Eine äußere Verknüpfung wird in linke und rechte äußere Verknüpfungen unterteilt: Eine linke Verknüpfung zeigt die gesamte linke Seite plus die gleiche Seite der rechten Seite; Eine rechte Verknüpfung zeigt die gesamte rechte Seite und die gleiche Seite der linken und rechten Seite.
Unser Bedarf ist es, durch den Auftrag Benutzer zu verknüpfen, und da es in der Tabelle orders einen Fremdschlüssel (userId) gibt. Beim Suchen nach Daten der verknüpften Tabelle user über den Fremdschlüssel ist userId der Primärschlüssel der Tabelle user. In diesem Fall können nur Informationen eines Benutzers abgerufen werden, und dieses Protokoll wird die Hauptabfrageergebnisse nicht ändern. Daher wählen wir die innere Verknüpfung. In diesem Fall sieht unsere SQL-Anweisung so aus:
auswählen * von orders, user, wo orders.user_id = user.id
Nach dem Abfragen erscheinen die Ergebnisse wie folgt:
Dann kam das Problem, wir fanden heraus, dass zu diesem Zeitpunkt zwei id出现了,这会导致我们的数据在输出时封装到对象时出现问题。此外,die User_id-Spalte und unsere Benutzerid-Daten sind identisch. Wir müssen unsere SQL umgestalten. Wie sollen wir das tun?
Daß unser Haupttabelle-Daten alle abgefragt werden müssen, während wir für die Benutzer-Tabelle nur die Informationen username, sex, adress benötigen (hier ist es eine Annahme, es ist nicht notwendig, sich um die benötigten Informationen zu kümmern). Daher müssen wir unsere SQL-Anweisung manuell spezifizieren, um die Abfragefelder zu bestimmen:
SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id
Diese sind alle Abfragen, die wir auf unserem SQL-Verbindungstool durchführen. Wenn wir die benötigte Datenbank anzeigen können, ist unser SQL-Satz bestätigt. Dann sollten wir den nächsten Schritt beginnen:
Erstellen Sie pojo
Wir müssen das gefundene Ergebnis durch das MyBatis-Framework in das entsprechende Objekt einbetten. Hier stellt sich die Frage, wer das gefundene Datenpaket empfängt? Wenn wir das Ergebnis der obigen SQL-Abfrage auf das pojo abbilden möchten, müssen alle Spaltennamen im pojo enthalten sein. Aber weder die ursprüngliche Klasse Orders noch die Klasse User können alle Felder abbilden. In diesem Fall haben wir eine sehr einfache Lösung: Schreiben Sie eine spezielle Klasse basierend auf den zurückgegebenen Feldern, die alle Abfrageergebnisse enthält, und lassen Sie diese Klasse das Rückgabepaket empfangen.
Hier ist ein kleiner Trick, wir müssen nicht alle Felder in unserem neuen pojo angeben. Wir können den neuen pojo so gestalten, dass er von einer Klasse erbt, die viele Spalten des Ergebnissatzes enthält, und dann können wir die anderen erforderlichen Daten in dieser Unterklasse hinzufügen.
Nachdem das pojo erstellt wurde, müssen wir gemäß den Normen unsere Abbildungsdatei erstellen und die Methoden im entsprechenden Interface schreiben:
mapper.xml
Interface in mapper.java:
ResultMap
Auf SQL-Satzebene sind die Methoden realisiert, die resultMap und resultType verwenden, hier wird darauf verzichtet.
Den Ansatz zur Abbildung mit resultMap
Wir wissen, dass wir bei der Verwendung von pojo Daten in die Objekteigenschaften eines pojo einbetten können, die Attribute können einfache Typen oder auch andere pojo sein. In diesem Fall können wir so vorgehen:
Verwenden Sie resultMap, um die Bestellinformationen im Ergebnis der Abfrage auf das Objekt Orders abzubilden. Fügen Sie das Attribut User zur Klasse Orders hinzu und verbinden Sie die Benutzerinformationen, die durch die assoziative Abfrage gefunden werden, mit dem Attribut user des orders-Objekts.
Fügen Sie das Attribut user zur Klasse Orders hinzu
mapper.xml
Bei der Verwendung der Methode resultMap zur Abbildung des Ergebnissatzes müssen wir zwei Operationen durchführen, eine ist die Definition von resultMap, bei der die Spalten der gefundenen Ergebnisseätze auf die Attribute der entsprechenden Objekte abgebildet werden. Das ist etwas umständlich, aber nicht schwer. Der zweite Schritt ist die Definition unseres Statements.
resultMap
resultMap实现的基本思路我们刚才已经说了。而且也在orders的pojo类中增加了相应的属性了。接下来,就是写一个resultMap,将整个查询的结果映射到Orders中在这里面,首先是order订单的映射。就是直接用id 和result标签将两者相互对应即可。然后就是,关联的用户信息的映射,这时候需要用到一个association的标签,将在orders类中的user字段与User类进行映射,然后在其内部还是用id和result标签,将查询的数据和User的属性相映射。
具体代码如下:
<!-- 订单查询关联用户的resultMap 将整个查询的结果映射到cn.mybatis.po.Orders中 --> <resultMap type="cn.mybatis.po.Orders" id="OrdersUserResultMap"> <!-- 配置映射的订单信息 --> <!-- id:指定查询列中的唯一标识,订单信息中的唯一标识,如果有多个列组成唯一标识,配置多个id column:订单信息的唯一标识列 property:订单信息的唯一标识列所映射到Orders中哪个属性 --> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property=note/> <!-- 配置映射的关联的用户信息 --> <!-- association:用于映射关联查询单个对象的信息 property:要将关联查询的用户信息映射到Orders中哪个属性 --> <association property="user" javaType="cn.mybatis.po.User"> <!-- id:关联查询用户的唯一标识 column:指定唯一标识用户信息的列 javaType:映射到user的哪个属性 --> <id column="user_id" property="id"/> <result column="username" property="username"}/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> </resultMap>
statement
statement ist relativ einfach, es geht darum, die Art und Weise der Abbildung der Rückgabemenge in resultMap zu ändern und den Rückgabetyp auf das kürzlich abgeschlossene resultMap zu setzen.
mapper.java
Unterschiede zwischen beiden
Nachdem die Methoden zur Implementierung der eins-zu-eins-Abfrage erörtert wurden, analysieren wir nun ihre Unterschiede und Vor- und Nachteile.
Zunächst müssen beide Pojo geändert werden: Eine ist die Erweiterung einer Pojo-Klasse und die andere ist die Änderung der Pojo-Felder. Persönlich fühle ich, dass resultType besser als resultMap ist, gemäß dem Prinzip der Offenheit und Schließbarkeit des Designmodells.
Zweitens ist es einfacher, resultType zu verwenden, um dies zu erreichen. In diesem Sinne ist resultType auch besser als resultMap.
Allerdings kann resultMap eine verzögerte Ladezeit implementieren, während resultType dies nicht kann. In diesem Bereich ist resultType nicht so gut wie resultMap.
Also: Es wird empfohlen, resultType zu verwenden, wenn keine speziellen Anforderungen an die Abfrageergebnisse gestellt werden.
Das oben genannte ist die mybatis-eins-zu-eins-Abfragefunktion, die der Redakteur den Lesern vorgestellt hat. Ich hoffe, es hilft Ihnen weiter. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht, ich werde Ihnen umgehend antworten. Ich danke auch sehr für die Unterstützung der Website yells教程 von Ihnen!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie verdächtige Urheberrechtsinhalte finden, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine Beschwerde einreichen, und fügen Sie relevante Beweise bei. Sobald nachgewiesen, wird diese Website den涉嫌侵权的内 容立即删除。)