Technologieaustausch

[MyBatis] MyBatis-Theorie 40 Fragen (2)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

MyBatis-Theorie 40 Fragen》Enthält die folgenden 2 Artikel:


MyBatis-Theorie 40 Fragen (2)

21. Wie erhalte ich den generierten Primärschlüssel?

Neues Tag hinzufügen:keyProperty=“ID” Das ist es.

<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >
	insert into user(user_name, user_password, create_time)
	values(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})
</insert>
  • 1
  • 2
  • 3
  • 4

22.WannEntitätsklasseWas soll ich tun, wenn sich die Attributnamen in von den Feldnamen in der Tabelle unterscheiden?

(1) Durch Abfragen SQL Definieren Sie den Alias ​​des Feldnamens in der Anweisung, um den Alias ​​des Feldnamens mit dem Attributnamen der Entitätsklasse konsistent zu machen.

<select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order">
	select order_id id, order_no orderno, order_price price form orders
	where order_id=#{id};
</select>
  • 1
  • 2
  • 3
  • 4

(2) Bestanden <resultMap> Um die Eins-zu-eins-Entsprechung zwischen Feldnamen und Entitätsklassenattributnamen abzubilden.

<select id="getOrder" parameterType="int" resultMap="orderResultMap">
	select * from orders where order_id=#{id}
</select>

<resultMap type="com.jourwon.pojo.Order" id="orderResultMap">
	<!-- 用id属性来映射主键字段 -->
	<id property="id" column="order_id">
	<!-- 用result属性来映射非主键字段,property为实体类属性名,column为数据库表中的属性 -->
	<result property="orderno" column="order_no" />
	<result property="price" column="order_price" />
</reslutMap>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

23.Wie kann man Mapper schreiben?

(1) Vererbung der Schnittstellenimplementierungsklasse SqlSessionDaoSupport: Um diese Methode verwenden zu können, müssen Sie schreiben mapper Schnittstelle,mapper Schnittstellenimplementierungsklasse,mapper.xml dokumentieren.

  • existieren sqlMapConfig.xml Mittlere Konfigurationmapper.xml s Position.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • Definition mapper Schnittstelle.
  • Implementieren Sie die Klassenintegration SqlSessionDaoSupportmapper Kann in Methoden verwendet werdenthis.getSqlSession() Führen Sie das Hinzufügen, Löschen, Ändern und Überprüfen von Daten durch.
  • spring Aufbau.
<bean id=" " class="mapper 接口的实现">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
  • 1
  • 2
  • 3

(2) Verwendung org.mybatis.spring.mapper.MapperFactoryBean

  • existieren sqlMapConfig.xml Mittlere Konfigurationmapper.xml Position wennmapper.xml Undmapper Die Schnittstellen haben den gleichen Namen und liegen im gleichen Verzeichnis, sodass hier keine Konfiguration erforderlich ist.
  • Definition mapper Schnittstelle.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • mapper.xml Mittenamespace fürmapper Die Adresse der Schnittstelle.
  • mapper Der Methodenname in der Schnittstelle undmapper.xml definiert instatement vonid konsequent sein.
  • Spring definiert in.
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
	<property name="mapperInterface" value="mapper 接口地址" />
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
  • 1
  • 2
  • 3
  • 4

(3) Verwendung mapper Scanner.

  • mapper.xml Schreiben von Dokumenten.
    • mapper.xml Mittenamespace fürmapper Die Adresse der Schnittstelle;
    • mapper Der Methodenname in der Schnittstelle undmapper.xml definiert instatement vonid konsequent sein;
    • Wenn mapper.xml Undmapper Wenn der Name der Schnittstelle konsistent bleibt, ist dies nicht erforderlichsqlMapConfig.xml Konfigurieren Sie in .
  • Definition mapper Schnittstelle.Beachtenmapper.xml Dateiname undmapper Die Schnittstellennamen müssen konsistent sein und im selben Verzeichnis abgelegt werden.
  • Aufbau mapper Scanner.
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="mapper 接口包地址"></property>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
  • 1
  • 2
  • 3
  • 4
  • Nach der Verwendung des Scanners von spring Aus Container holenmapper Implementierungsobjekt.

24.Was ist MeinBatis Schnittstellenbindung? Welche Implementierungsmethoden gibt es?

Bei der Schnittstellenbindung wird eine Schnittstelle willkürlich in MyBatis definiert und dann die Methoden in der Schnittstelle mit SQL kombiniert StellungnahmeDurch die Bindung können wir die Schnittstellenmethode direkt aufrufen, also im Vergleich zum Original SqlSession Die bereitgestellten Methoden ermöglichen uns flexiblere Auswahlmöglichkeiten und Einstellungen.

Es gibt zwei Möglichkeiten, die Schnittstellenbindung zu implementieren:

  • Bindung durch Anmerkungen ist das Hinzufügen @Select@Update Warten Sie, bis Anmerkungen gebunden sind, die SQL-Anweisungen enthalten.
  • passieren xml Schreiben Sie SQL zum Binden hinein. In diesem Fall müssen Sie angebenxml in der Mapping-Dateinamespace Muss der vollständige Pfadname der Schnittstelle sein.Wenn die SQL-Anweisung relativ einfach ist, verwenden Sie die Annotationsbindung. Wenn die SQL-Anweisung relativ komplex ist, verwenden Siexml Bindung, allgemeine Verwendungxml Es gibt noch mehr Bindungen.

25. Was sind die Voraussetzungen für einen Anruf über die Mapper-Schnittstelle von MyBatis?

  • Name der Mapper-Schnittstellenmethode und mapper.xml von jedem SQL, das in definiert istid Dasselbe.
  • Die Eingabeparametertypen der Mapper-Schnittstellenmethoden und mapper.xml von jedem SQL, das in definiert istparameterType vom gleichen Typ.
  • Die Ausgabeparametertypen der Mapper-Schnittstellenmethoden und mapper.xml von jedem SQL, das in definiert istresultType vom gleichen Typ.
  • Mapper.xml in der Dateinamespace Das ist der Klassenpfad der Mapper-Schnittstelle.

26. Wie funktioniert diese Dao-Schnittstelle? Kann die Methode überladen werden, wenn die Methode in der Dao-Schnittstelle unterschiedliche Parameter hat?

  • Das Funktionsprinzip der Dao-Schnittstelle ist der dynamische JDK-Proxy. MyBatis verwendet den dynamischen JDK-Proxy, um beim Ausführen einen Proxy für die Dao-Schnittstelle zu generieren. proxy Objekt, Proxy-Objektproxy Stattdessen werden Schnittstellenmethoden abgefangen und ausgeführtMappedStatement stellt die SQL dar und gibt dann die SQL-Ausführungsergebnisse zurück.
  • Methoden in der Dao-Schnittstelle können nicht überladen werden, weil Vollqualifizierter Name + Methodenname Speichern und Strategien finden.

27. Kann die ID in der XML-Zuordnungsdatei von MyBatis in verschiedenen XML-Zuordnungsdateien wiederholt werden?

  • Verschiedene XML-Zuordnungsdateien, sofern konfiguriert namespace,Also id Kann wiederholt werden, wenn nicht konfiguriertnamespace,Also id kann schließlich nicht wiederholt werden;namespace Nicht erforderlich, nur Best Practice.
  • Der Grund ist namespace + id ist als M ap &lt; String , M apped S Anweisung &gt; Map<String, MappedStatement>MAP<StRInG,MApptDStATtMtNT> Der zu verwendende Schlüssel, falls keiner vorhanden istnamespace, nur der Rest id,Also,id Eine Duplizierung kann dazu führen, dass sich Daten gegenseitig überschreiben.Habe esnamespace,Natur id Du kannst es wiederholen,namespace anders,namespace + id Natürlich ist es anders.

28. Beschreiben Sie kurz die Zuordnungsbeziehung zwischen der XML-Zuordnungsdatei von MyBatis und der internen Datenstruktur von MyBatis.

MyBatis kapselt alle XML-Konfigurationsinformationen in schwergewichtige All-In-One-Objekte Configuration intern. In der XML-Zuordnungsdatei<parameterMap> Das Tag wird analysiert alsParameterMap Als Objekt wird jedes seiner untergeordneten Elemente analysiertParameterMapping Objekt.<resultMap> Das Tag wird analysiert alsResultMap Als Objekt wird jedes seiner untergeordneten Elemente analysiertResultMapping Objekt.Jeden<select><insert><update><delete> Tags werden analysiert alsMappedStatement Objekt, das SQL im Tag wird als analysiertBoundSql Objekt.

29.Wie kapselt MyBatis die SQL-Ausführungsergebnisse in Zielobjekte und gibt sie zurück? Welche Mapping-Formulare gibt es?

  • Die erste ist die Verwendung <resultMap> Tags definieren nacheinander die Zuordnungsbeziehung zwischen Spaltennamen und Objektattributnamen.
  • Die zweite besteht darin, die SQL-Spaltenaliasfunktion zu verwenden und den Spaltenalias als Objektattributnamen zu schreiben, z T_NAME AS NAMEDer Name des Objektattributs lautet im Allgemeinen name, Kleinbuchstaben, aber MyBatis ignoriert die Groß-/Kleinschreibung von Spaltennamen und findet die entsprechenden Objektattributnamen. Sie können sogar schreiben T_NAME AS NaMe, MyBatis kann weiterhin normal funktionieren.

Nachdem die Zuordnungsbeziehung zwischen Spaltennamen und Attributnamen hergestellt wurde, erstellt MyBatis Objekte durch Reflektion und weist den Eigenschaften des Objekts mithilfe der Reflektion nacheinander Werte zu und gibt sie zurück Für diejenigen Eigenschaften, die die Zuordnungsbeziehung nicht finden können , die Aufgabe kann nicht abgeschlossen werden.

30. Welche anderen Tags gibt es in der XML-Zuordnungsdatei zusätzlich zu den üblichen Tags „select |. insert |“.

Es gibt viele andere Tags, <resultMap><parameterMap><sql><include><selectKey>, plus dynamisches SQL 9 9 9 Stichworte:trimwheresetforeachifchoosewhenotherwisebind Warten.In<sql> Für SQL-Fragment-Tags übergeben Sie<include> Tags führen SQL-Fragmente ein,<selectKey> Generieren Sie Richtlinienbezeichnungen für Primärschlüssel, die die automatische Inkrementierung nicht unterstützen.

31. Kann in der MyBatis-Zuordnungsdatei das B-Tag nach dem A-Tag definiert werden, wenn das A-Tag über include auf den Inhalt des B-Tags verweist, oder muss es vor dem A-Tag definiert werden?

Obwohl MyBatis die XML-Zuordnungsdatei der Reihe nach analysiert, kann das referenzierte B-Tag immer noch an einer beliebigen Stelle definiert werden und MyBatis kann es korrekt identifizieren.

Das Prinzip besteht darin, dass MyBatis das A-Tag analysiert und feststellt, dass das A-Tag auf das B-Tag verweist, das B-Tag jedoch noch nicht analysiert wurde und noch nicht existiert. Zu diesem Zeitpunkt markiert MyBatis das A-Tag als ungelöst und fährt dann fort Um die verbleibenden Tags, einschließlich B-Tags, zu analysieren, analysiert MyBatis die als ungelöst markierten Tags erneut. Beim Parsen des A-Tags ist das B-Tag bereits vorhanden und das A-Tag kann normal analysiert werden.

32. Kann MyBatis Eins-zu-Viele- und Eins-zu-Eins-Kontaktabfragen durchführen? Welche Implementierungsmethoden gibt es?

Kann, nicht nur kann Eins-zu-viele, eins-zu-eins,Gut genug Viele-zu-viele, viele-zu-eins . Dies wird wie folgt erreicht:

  • Senden Sie eine separate SQL, um das zugehörige Objekt abzufragen, weisen Sie es dem Hauptobjekt zu und geben Sie dann das Hauptobjekt zurück.
  • Bei Verwendung verschachtelter Abfragen, ähnlich wie bei JOIN-Abfragen, ist ein Teil der Attributwert von Objekt A und der andere Teil der Attributwert des zugehörigen Objekts B. Der Vorteil besteht darin, dass das Hauptobjekt und das Hauptobjekt gesendet werden, solange ein Attributwert gesendet wird zugehöriges Objekt gefunden werden kann.
  • Unterabfrage

33.Kann MyBatis die Aufzählungsklasse Enum zuordnen?

MyBatis kann Aufzählungsklassen zuordnen. MyBatis kann nicht nur Aufzählungsklassen zuordnen, sondern auch jedes Objekt einer Spalte der Tabelle zuordnen.Die Zuordnungsmethode ist kundenspezifischTypeHandler,erreichen TypeHandler vonsetParameter() UndgetResult() Schnittstellenmethoden.

TypeHandler Es hat zwei Funktionen, eine besteht darin, das zu vervollständigenjavaType ZujdbcType Der Umbau, der zweite ist abgeschlossenjdbcType ZujavaType Die Konvertierung wird widergespiegelt alssetParameter() UndgetResult() Die beiden Methoden repräsentieren das Festlegen der SQL-Fragezeichen-Platzhalterparameter bzw. das Abrufen der Spaltenabfrageergebnisse.

34.Was macht MyBatis Dynamic SQL? Welche Arten von dynamischem SQL gibt es? Können Sie kurz das Ausführungsprinzip von dynamischem SQL beschreiben?

Mit dem dynamischen SQL von MyBatis können wir dynamisches SQL in Form von Tags in die XML-Zuordnungsdatei schreiben, um die Funktionen der logischen Beurteilung und des dynamischen Spleißens von SQL zu vervollständigen 9 9 9 Dynamische SQL-Tags:trimwheresetforeachifchoosewhenotherwisebind

Sein Ausführungsprinzip ist die Verwendung OGNL Berechnen Sie den Wert des Ausdrucks aus dem SQL-Parameterobjekt und verbinden Sie SQL dynamisch entsprechend dem Wert des Ausdrucks, um die Funktion von dynamischem SQL zu vervollständigen.

35.Wie führt MyBatis Paging durch? Was ist das Prinzip des Paging-Plug-Ins?

MyBatis verwendet RowBounds Das Objekt ist paginiert, es ist fürResultSet Das vom Ergebnissatz durchgeführte Speicher-Paging ist kein physisches Paging. Sie können Parameter direkt mit physischem Paging in SQL schreiben, um die physische Paging-Funktion abzuschließen, oder Sie können ein Paging-Plug-In verwenden, um das physische Paging abzuschließen.

Das Grundprinzip des Paging-Plug-Ins besteht darin, die von MyBatis bereitgestellte Plug-In-Schnittstelle zu verwenden, um ein benutzerdefiniertes Plug-In zu implementieren, die auszuführende SQL in der Abfangmethode des Plug-Ins abzufangen und die SQL dann entsprechend neu zu schreiben Zu dialect Dialekt, fügen Sie entsprechende physische Paging-Anweisungen und physische Paging-Parameter hinzu.

Beispiel:

select * from student
  • 1

Nachdem Sie die SQL abgefangen haben, schreiben Sie sie wie folgt um:

select t.* from (select * from student) t limit 0, 10
  • 1

36. Beschreiben Sie kurz das Funktionsprinzip des MyBatis-Plug-Ins und wie man ein Plug-In schreibt.

MyBatis kann nur für schreiben ParameterHandlerResultSetHandlerStatementHandlerExecutor Das 4 4 4 MyBatis ist eine Art Schnittstellen-Plugin und verwendet den dynamischen Proxy von JDK, um Proxy-Objekte für die Schnittstellen zu generieren, die abgefangen werden müssen, um die Funktion zum Abfangen der Schnittstellenmethode zu implementieren. 4 4 4 Methode eines Schnittstellenobjekts, es wird insbesondere die Abfangmethode eingegebenInvocationHandler voninvoke() Methoden fangen natürlich nur die Methoden ab, die Sie zum Abfangen angeben.

Implementieren Sie MyBatis Interceptor Schnittstelle und Overrideintercept() Methode, schreiben Sie dann Anmerkungen für das Plug-In und geben Sie an, welche Methoden welcher Schnittstelle Sie abfangen möchten. Vergessen Sie nicht, das Plug-In zu konfigurieren, das Sie in der Konfigurationsdatei geschrieben haben.

37. Der Cache der ersten und zweiten Ebene von MyBatis

  • Cache der Ebene 1: basierend auf PerpetualCache Lokaler HashMap-Cache, sein Speicherbereich ist Sitzung, wenn Sitzungflush oderclose Danach werden alle Caches in der Sitzung gelöscht und der Cache der ersten Ebene wird standardmäßig aktiviert.
  • Der Cache der zweiten Ebene verfügt über denselben Mechanismus wie der Cache der ersten Ebene und wird ebenfalls standardmäßig verwendet. PerpetualCache, HashMap-Speicher, der Unterschied besteht darin, dass sein Speicherbereich beträgt MapperNamespace), und die Speicherquelle kann angepasst werden, z Ehcache .Der Second-Level-Cache ist standardmäßig nicht aktiviert. Um den Second-Level-Cache zu aktivieren, muss die Second-Level-Cache-Attributklasse implementiert werden.Serializable Serialisierungsschnittstelle (kann zum Speichern des Status eines Objekts verwendet werden), konfigurierbar in seiner Zuordnungsdatei<cache/>
  • Für den Cache-Datenaktualisierungsmechanismus, wenn ein bestimmter Bereich (Cache-Sitzung der ersten Ebene / Cache-Namespace der zweiten Ebene) vorliegt C / U / D Nach dem Vorgang werden standardmäßig alle Dateien in diesem Bereich angezeigtselect Der Cache wird seinclear