MyBatis ist ein Open -Source -Projekt von Apache. Im Jahr 2010 wurde dieses Projekt von der Apache Software Foundation in Google Code verschoben und in MyBatis umbenannt. Das Folgende ist die Einführung von MyBatis Advanced Mapping, Dynamic SQL und den primären Schlüsselinhalt des automatischen Inkrements. Weitere Informationen finden Sie in diesem Artikel.
1. Dynamic SQL
Ich glaube, dass jeder immer auf ein Problem stoßen wird, wenn er MyBatis zum Betrieb der Datenbank verwendet. Wenn wir jetzt eine List -Autorliste über den Autor haben, müssen wir die Bloginformationen des entsprechenden Autors in der Datenbank basierend auf den vorhandenen Autoreninformationen in der Authorlist abfragen. Der einfachste Weg, um die Autorliste zu durchqueren und die entsprechenden Informationen zu erhalten, um die Datenbank abzufragen.
für (int i = 0; i <authorList.size (); i ++) {… // Datenbankcode abfragen // aus dem Blog, wobei Author =#{Autor, jdbctype = varchar}}Denken Sie darüber nach, wenn die Länge der Authorlist n ist, müssen wir die Datenbank n -mal abfragen. Wenn wir diese Methode verwenden, geht es bei dem Overhead des Programms nicht nur um Abfragen, sondern auch um die Verknüpfungsinstanz aus dem Datenbankverbindungspool, das Erstellen einer Datenbankverbindung und die Rückgabe der Datenbankinstanz an den Datenbankverbindungspool. Angenommen, diese drei Aktionen dauern insgesamt 0,001 Sekunden. Wenn Sie dann Traversal -Methoden verwenden, um abfragen, dauert es 0,001n Sekunden mehr. Wenn Sie das 1.000 -fache abfragen müssen, ist es 1 Sekunde mehr. Dies ist für Programmierer unerträglich, da dies nur eine kreisförmige Abfrage ist und nicht als andere Geschäftsordnung zählt.
Gibt es einen besseren Weg? Die Antwort lautet Ja, eine davon ist dynamisch SQL:
Laden Sie zuerst den Code hoch:
<select id = "dynamicforeachTest" resultType = "com.blog.blog" parameterType = "java.util.list"> aus dem Blog aus dem Blog wobei Autor in <foreach collection = "liste" index = "index" item = "item" open = "(" separator = "," close = ")") ">">#{item} </foreach> </forect> </foreach> </forect> </forect> </foreach> </foreach> </foreach> </forectTEM repräsentiert den Alias, wenn jedes Element im Satz iteriert wird.
Index gibt einen Namen an, der die Position darstellt, zu der jede Iteration während des Iterationsprozesses erreicht wird.
offen bedeutet, wo die Aussage beginnt,
Der Separator gibt an, welches Symbol als Trennzeichen zwischen jeder Iteration verwendet wird.
Schließen gibt an, was mit dem endet, damit der Rückgabewert mithilfe von List <Bolg> akzeptiert werden kann.
Die Foreach -Anweisung in Dynamic SQL verwendet jedoch die realste in Einfügeanweisungen und wird normalerweise in Klauseln verwendet.
2. Erweitertes Mapping
Bei der Verwendung von MyBatis wird das Ergebnistyp = com.blog.Author Entity -Klasse im Allgemeinen verwendet, um Abfrageergebnisse zu akzeptieren.
Oder verwenden Sie resultType = java.util.map, um den Datenbankspaltennamen als Schlüssel und den Datensatz als Wert zurückzugeben.
Diesmal ist jedoch Ergebnismap erforderlich, wodurch die freie Kombination von Rückgabetwerten komplexere Abfragen ermöglicht.
Oder laden Sie den Code einfach zuerst hoch:
SQL:
<select id = "getBlogs" resultMap = "Blogs" parameterType = "map"> SELECT A.Authorid, A.uthorname, B.Blogid, b.BlognameFrom Autor A Links Join Blog B auf a. authorid = b. Authorid wo a. AuthorID = #{Authorid, jdbcType = Integer} </select>MyBatis -Konfiguration:
<resultMap id="blogs" type="com.bloh.Blog"><id property="authorID" column="authorID"><result property="authorName" column="authorName"><collection property="postsList" ofType="com.bolg.Post"><id property="blogID" column="blogID"/><result property="blogName" column="blogName"/><result Property = "Blogname"/> </resultMap>
Blog -Entitätsklasse
Öffentliche Klasse Bolg {private Integer Authorid; private String Authorname; private Liste <Post> Postlist; // Setter Getter}Post Entity -Klasse
Public class post {private Integer blogid; privater String -Blogname; // Setter Getter}Auf diese Weise können Sie eine komplexe Abfrage mit einer Entität akzeptieren.
Das Folgende ist die Funktion jedes Attributs:
Ich werde nicht auf Details zu anderen Eigenschaften und Konfigurationen gewöhnlicher MyBatis -Abfragen eingehen.
resultMap wird anstelle von resultType verwendet, wobei das durch das abfrageergebnis zurückgegebene format angibt
Die ID im Ergebnismap hat zwei Hauptfunktionen:
Ähnliche Indizes zur Verbesserung der Abfrageleistung
Unterscheiden Sie verschiedene Ergebnisse
Daher ist es am besten, ID nicht wegzulassen. Wenn es keinen Primärschlüssel gibt, verwenden Sie ein Feld, das stattdessen Aufzeichnungen unterscheiden kann.
Das Ergebnis ist der in der Entitätsklasse definierte variable Name und die Spalte ist der Spaltenname der Datenbank
Die Sammlung ist eine Sammlung von Listen, Karten usw.
Postlist ist der in der Blogentitätsklasse definierte Listenvariablenname
Oftype ist die Entitätsklasse des Objekts in der Objektliste.
3. Erhalten Sie die selbstversteifende ID:
Wenn es die folgende Situation gibt, möchten Sie nach dem Einfügen des Datenbankdatensatz
Dann bietet MyBatis auch entsprechende Unterstützung für diese Situation (Stapelinsertion wird nicht unterstützt):
MySQL ist die ursprüngliche, solide selbststörende ID; Unter der Annahme des Feldnamens des selbststeigenden Primärschlüssels ist ID ID
<einfügen id = "einfügen" useGeneratedKeys = "true" keyProperty = "id" parameterType = "user"> in <include refID = "table_name" /> (Name, Alter) Werte ( #{Name}, #{AGE}) < /einfügen>Es gibt zwei weitere Attribute als die normale Insertion UseGeneratedKeys = "True", was bedeutet, dass sie die Selbstverstärkungs-ID zurückgibt, wenn es aktiviert ist.
KeyProperty = "ID" bezeichnet den Namen des Rückgabe -Primärschlüssels.
Anschließend können Sie die folgenden Aussagen verwenden, um sie in der Geschäftsordnung zu erhalten:
Angenommen, die Entitätsklasse ist Benutzer
User Benutzernw = UsMapper.insert (Benutzer);
usererNew.getid // ist die automatisch inkrementierte ID nach dem Einfügen
Tatsächlich kann der Haupttaste für automatische Inkremente von MySQL durch select last_insert_id () erhalten werden.
Es gibt also eine andere Möglichkeit, es zu schreiben:
<einfügen id = "parameterType =" user "> <selectKey resultType =" int "order =" nach "keyProperty =" id "> select last_insert_id () als id </selectKey> In den Namen, AGEVALUES ( #{Name}, #{AGE}) </>> Einfügen> </>>Es ist genau das Gegenteil von Mysqls Methode, Primärschlüssel zu erhalten. MySQL ist die Tabelle, die nach der Ausführung den Selbstwachstumswert zuteilt, während Oracle den Selbstwachstumswert erhält, bevor SQL einfügen. Vor der Ausführung von SQL muss ein Primärschlüsselwert für den zu eingefügten Datensatz angegeben werden. Daher müssen Sie die Selbstwachstumsequenz bei "Before" erhalten und sie dann per SELECTKEY in die Parameterkarte injizieren. Nehmen Sie das Selbstwachstum oder die ID an
<insert id=" insert " useGeneratedKeys="true" keyProperty="id" parameterType="xxxx" ><selectKey resultType="int" order="BEFORE" keyProperty="id">SELECT SEQ_TABLE.NEXTVAL FROM dual</selectKey>INSERT INTO id,name,ageVALUES(#{id} #{name}, #{age} )</insert>Die ID hier ist die von SelectKey erhaltene automatische Inkrement-ID.
Die Empfangsmethode ist die gleiche wie MySQL. Wenn Sie den Hauptschlüssel für automatische Inkremente erhalten, verwenden Sie am besten die Empfang der Entität.
Das obige ist die MyBatis Advanced Mapping, Dynamic SQL und die Erlangung von selbstvertretenden Primärschlüssel, die Ihnen vorgestellt wurden. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!