Implementieren Sie eine gemeinsame Abfrage mit mehr Tisch
Oder erstellen Sie eine neue Website -Klasse unter dem Paket von David.mybatis.model, um Daten zu bestehen und die entsprechende Methode für toString () umzuschreiben, um die Verwendung von Testprogrammen zu erleichtern.
Paket David.mybatis.model; Import Java.Text.SimpledateFormat; Import Java.util.Date; öffentliche Klasse -Website {private int id; privater Zeichenfolge Name; privat int besucht; privater Int -Status; privates Date Createtime; Privatbesucher; öffentliche Website () {// Todo automatisch generierter Konstruktor Stub CreateTime = new Date (); Besucher = neuer Besucher (); } öffentliche Website (String -Name, int Visitorid) {this.name = name; this.visitorid = VisitorID; Besucher = neuer Besucher (); Status = 1; CreateTime = new Date (); } public int getid () {return id; } public void setId (int id) {this.id = id; } public Visitor getvisitor () {Return Visitor; } public void setvisitor (Besucher Besucher) {this.visor = Besucher; } public String getName () {return name; } public void setName (String -Name) {this.name = name; } public int getStatus () {Rückgabestatus; } public void setStatus (int Status) {this.status = Status; } public date getCreateTime () {return CreateTime; } public void setCreateTime (Datum CreateTime) {this.createTime = CreateTime; } public int getvisitorId () {int id = 0; if (Besucher == null) id = VisitorID; sonst id = Visitor.getId (); Rückgabe -ID; } public void setvisitorId (int VisitorId) {this.visitorId = VisitorId; } @Override public String toString () {StringBuilder sb = new StringBuilder (String.Format ("Website => {id: %d, name: %s, createtime: %s}/r/n", id, name, new SimpleDateFormat ("yyyyyy-mm-dd hh: mm: ss: ss"). if (Besucher! return sb.tostring (); }}Erstellen Sie die entsprechenden Operationsschnittstellen unter David.mybatis.demo:
Paket David. public int delete (int id); Public Int Update (Website -Website); öffentliche Website Abfrage (int ID); Public List <Stosite> getList (); }
Erstellen Sie eine neue WebSiteMapper.xml -Zuordnungsdatei im Ordner Mapper und finden Sie in der vorherigen zum Hinzufügen, Löschen, Ändern und Überprüfen der einzelnen Tabellenbetriebskonfiguration, damit Sie einige Testdaten erstellen können. wie folgt
<? namespace = "David.mybatis.demo.iwebsiteoperation"> <sql id = "getListsql"> ID, Name, Besucher, Status, Createtime von Website, bei dem Status> 0 </sql> <einfügen id = "add" Parametertype = "Website" Website "Visualedkey" -Schitor). (#{name}, #{visitorId}, #{status}, #{createTime}) </insert> <delete id="delete" parameterType="int"> delete from website where status>0 and id = #{id} </delete> <update id="update" parameterType="Website"> update website set name=#{name} where status>0 and id =#{id} </update> <select id = "query" parameterType = "int" resultMap = "Websiters"> wachwebsite.id SiteId, Website.Name SiteName, Visitor.id Visitorid, Visitor.NAME.NAME VERFAHRENNAM, VERFAHREN.Status Sitestatus, Website. und Website.id =#{id} < /select> <resultMap type = "Website" id = "Websiters"> <id column = "SiteId" Property = "id" /> <resultal column = "sitename" property = "name" /> <resultal columne resultMap = "Visitorrs" /> < /resultMap> <resultMap type = "Visitor" id = "Visitorrs"> <id column = "VisitorID" Property = "id" /> <resultornameWas wir heute hauptsächlich sprechen, ist die Suche. Jetzt möchten wir die Website abfragen und die entsprechenden Besucherinformationen gemeinsam herausnehmen. Wie macht ich das? Sie können sich auf die Abfrage in der Konfiguration beziehen und die SQL für die Link -Tabellenabfrage aufschreiben.
Die Hauptsache, die hier zu beachten ist, ist, dass die beiden Eigenschaften von ID und Namen in der Website und der Besuchsentität gleich sind. Um die Zuordnungsfehler zu vermeiden, listen Sie daher die entsprechenden Abfrageergebnisse mit unterschiedlichem Alias auf, damit sie bei der Bindung vermieden werden können.
Was würde ich bekommen, wenn ich es wie folgt konfigurieren würde?
<select id = "query" parameterType = "int" resultMap = "Websiters"> select website.id, Website.Name sitzename, Visitor.id, Visitor.Name Visitorname, Website.Status sitestatus, Website.CreateTime SiteCreatetime von der Website Inner. Website.id =#{id} < /select> <resultMap type = "Website" id = "Websiters"> <id column = "id" Property = "id" /> <resultal columne resultMap = "Visitorrs" /> < /resultmap> <resultMap type = "Visitor" id = "Visitorrs"> <id column = "id" property = "id" /> <resultorname Haben Sie bemerkt, dass die ID des Besuchers auch zu 2. geworden ist. Tatsächlich ordnet sie die Website -ID standardmäßig ab, da das Ergebnis der SQL -Anweisung -Abfrage beide zu 2. Menschen geworden ist. Einige Personen fragen sich möglicherweise, warum es nicht 4 ist, da sie der ersten standardmäßig entspricht. Wenn Sie die Standorte von Website.ID und besuchen.ID wechseln, werden Sie feststellen, dass sich das Ergebnis wieder magisch geändert hat.
Sie müssen also einen Alias geben, um diese Situation zu vermeiden. Sie werden also feststellen, dass es tatsächlich nur eine Wahrheit gibt, die Folgendes ist:
Sie können sehen, dass die Methode der Multi-Table-Verarbeitung des Ergebnismaps der von einzelnen Tabellen entspricht. Es ist nichts weiter, als den Namen des Javabäerattributs aufzulisten. Sie können sehen, dass es in der Rezeption im <Eltr ERECTIONMAP> -Knoten der Website einen weiteren Ergebnismap gibt. Es repräsentiert die Entität, die von der Besuchsentität zugeordnet werden muss. Sie können die folgende Methode verwenden, um Assoziationen herzustellen.
<Association Property = "Visitor" Javatype = "Visitor" resultMap = "Visitorrs" />
Der Besucher ist der Feldname des Besuchs in der Website -Entität. Der Name muss konsistent sein. Andernfalls gibt es keine Ausnahme von Getter für Eigenschaften mit dem Namen "xxx" in "Klasse David.mybatis.Model.Website". Dies wurde in den vorherigen Kapiteln beschrieben. Wenn Sie der Meinung sind, dass es in Ordnung ist, Nist -Ergebnismap nicht zu nisten, ist die Verschachtelung auch darauf zurückzuführen, dass diese Konfiguration an anderer Stelle verwendet werden kann, dann wird sie extrahiert, was auch eine abstrakte Idee ist. Verwenden Sie die ID und ergeben
Auf diese Weise erscheint eine einfache Multi-Tisch-gemeinsame Anfrage. Wenn es komplexere Abfragebühren gibt, werden auf dieser Grundlage einige Änderungen vorgenommen.
Paginationseffektlogik
Was wir sprechen wollen, ist das Paginationsproblem, auf das wir in einem Geschäftsproblem häufig stoßen. Bei der Entwicklung von Webprojekten verwenden wir häufig die Anzeige der Liste. Im Allgemeinen verwenden wir einige häufig verwendete Listensteuerelemente wie Datatables (ich persönlich fühle mich sehr gut) und die eingekapselten Tabellenkontrollen unter Easy UI.
Idee: Um den Effekt von Paging in diesen Kontrollen zu erreichen, übergeben wir normalerweise 2 Parameter. Die erste besteht darin, den Index der aktuellen Seite (normalerweise ab 0 ab 0) darzustellen, die zweite darum, wie viele Geschäftsunterlagen auf der aktuellen Seite angezeigt werden, und dann die entsprechenden Parameter an die Methode "List <T> Getlist (Pagenateargs Args) übergeben. Wenn wir schließlich Paging in der Datenbank implementieren, können wir das Limit -Keyword (für MySQL) zum Paging verwenden. Wenn es sich um einen Oracle- oder SQL -Server handelt, haben sie alle eine eigene Rownum -Funktion zu verwenden.
Um die oben genannten Ideen zu beheben, müssen wir zunächst eine neue Seite Parameter Entity -Klasse mit dem Namen Pagenateargs unter Demo.Mybatis.model erstellen. (Pagestart = pageIndex*pageSize) Da die Verwendung des Schlüsselworts der Grenze darin besteht, [Grenzstartnummer (nicht enthalten), einige Elemente zu nehmen], OrderFieldStr -Sortierfeld, OrderDirectionStr -Sortierrichtung, sodass die spezifische Erstellung wie folgt lautet:
Paket David.mybatis.model;
/ * * Paginationsparameter Entitätsklasse */öffentliche Klasse pagenateargs {private int pageIndex; private int pagesize; privat int pageestart; private String orderfieldstr; private String orderDirectionStr; public pagenateArgs () {// Todo automatisch generierter Konstruktor Stub} öffentliche pagenateargs (int pageIndex, int pageSize, String OrderFieldStr, String orderDirectionStr) {this.pageIndex = pageIndex; this.PageSize = pageSize; this.orderfieldStr = orderfieldstr; this.orderDirectionStr = orderDirectionStr; pagestart = pageIndex * pageSize; } public int getPageIndex () {return pageIndex; } public int getPagestart () {return pageestart; } public int getPageSize () {return pageSize; } public String orderfieldStr () {Rückgabe orderfieldstr; } public String getOrderDirectionStr () {return orderDirectionStr; }} Paket David.mybatis.model;/ * * sortieren Sie Enum */public enum sortDirectedenum {/ * * Ascending */asc,/ * * absteigend */desc}Nachdem wir die oben genannten Schritte ausgeschlossen haben, fügen wir der Ivisitoroperation Interface -Klasse weiterhin eine Methode Public List <Besucher> getListbypagenat (pagenateargs args) hinzu. In den vorherigen Kapiteln haben wir tatsächlich bereits die GetList -Methode. Diese Pagination ist basierend darauf nur eine kleine Veränderung. Nachdem die Ivisitoroperation -Schnittstellenklasse geändert wurde, folgt sie wie folgt:
Paket David.mybatis.demo; Import Java.util.List; Import David.mybatis.Model.Pagenateargs; Import David.mybatis.Model.visor; Import David.Mybatis.Model.visorwithrn; /** Besucher hinzufügen*/ public int add (Besucher Besucher); /** Besucher löschen*/ public int delete (int id); /** Besucher aktualisieren*/ public int update (Besucher Besucher); /** Abfrage Besucher*/ öffentlicher Besucherabfrage (int id); / * * Abfrageliste */ publiclist <Besucher> getList (); / * * Pagination Query List */ Public List <Besucher> getListbypagenat (pagenateargs args); }
Als nächstes müssen wir anfangen, unsere Konfigurationsdatei für VisitorMapper.xml zu ändern. Fügen Sie eine neue <Select> -Knoten -ID und einen Parametertyp hinzu, um sie gemäß den vorherigen Kapiteln zu konfigurieren. Die hier hinzugefügte neue ID ist GetListBypagenate. Nach der Konfiguration folgende
<? namespace = "David.mybatis.demo.ivisitoroperation"> <!-useGeneratedKeys = "true" bedeutet, ob eine Selbstwachstumssequenz verwendet werden soll, KeyProperty = "id" Gibt an, welche Spalte die Selbsterwachstumspalte, ParameterType = "Visitor", die entsprechende Art der Definition in der Definition des IVisitoroperations-Interesses-addiert "addiert" addiert. parameterType="Visitor" useGeneratedKeys="true" keyProperty="Id"> insert into Visitor (Name, Email, Status, CreateTime) values (#{name}, #{email}, #{status}, #{createTime}) </insert> <delete id="delete" parameterType="int"> delete from Visitor where status>0 and id = #{id} </delete> <update id = "update" parameterType = "Visitor"> Aktualisieren von Visitor Set name = {name}, E -Mail =#{E -Mail}, status =#{status} wobei ID =#{ID} und Status> 0; </update> <select id = "query" parameterType = "int" resultType = "Visitor"> ID, Name, E -Mail, Status, createtime aus Besucher wob </select> <select id = "getList" resultMap = "Visitorrs"> <include refID = "getListsql"/> </select> <sql id = "getListsql"> select * vom Besucher, wobei der Status> 0 </sql> <! Der orderbysql wird beispielsweise später wiederverwenden-> <resultMap type id = "getListbypagenate" parameterType = "pagenateargs" resultType = "Visitor"> select * from (<include refID = "getListsql" /> <include refID = "orderbysql" />) t <!- #{} bedeutet parameterizierte Ausgabe, {{}}-Direkte Ausgabe. PageSize> -1 "> Limit #{pagestart}, #{pageSize} </if> </select> <sql id =" orderbysql "> order {orderfieldstr} $ {orderDirectionStr} </sql> </mapper>In der folgenden Abbildung finden Sie ähnliche Konfigurationen. Die Feldattribute hier stimmen alle mit den Attributnamen in der Parameterklasse von Pagenateargs überein.
<if test = "pageStart> -1 und pageSize> -1"> limit #{pagestart}, #{pageSize} </if>Erstellen Sie eine Testmethode in der Demorun -Klasse:
/** Paginationsparameter*/public static void queryvisitorListwithpagenate (int pageIndex, int pageSize, String orderfield, String orderDire) {pagenateArgs args = new pagenateargs (pageindex, pagessize, orderfield, orderDire); SQLSession Session = mybatisutils.getSqlSession (); IvisitorOperation voperation = session.getMapper (ivisitorOperation.class); Liste <Besucher> Besucher = voperation.getListBypagenate (args); für (Besucher Besucher: Besucher) {System.out.println (Besucher); } Mybatisutils.Closession (Sitzung); Mybatisutils.showmessages (crud_enum.list, Visitors.size ());}Demorun.QueryvisorListwithpagenate (0, 100, "id", sortDirectedenum.desc.toString ());
Nach dem Laufen werden die Testergebnisse in IDS in umgekehrter Reihenfolge sortiert. Es gibt 14 Aufzeichnungen im Besuchertisch.
Nehmen wir an, wir nehmen 5 Stück auf Seite 2 und führen die folgenden 6-10 Datenstücke aus. Geben Sie also einfach die Parameter über.
Demorun.QueryvisorListwithpagenate (1, 5, "ID", sortDirectenenum.desc.toString ());
Die Ergebnisse sind wie folgt:
Dies ist eine Paging -Logik, die ich von mir selbst implementiert habe. Was Sie hier beachten müssen, ist, dass ich hier kein Urteil über das Orderfieldstr -Feld vorgenommen habe. Theoretisch ist es notwendig, damit umzugehen, um zu verhindern, dass die falschen Spaltennamen übergeben werden. Im Internet sollte es jedoch eine vorgefertigte Einkapselung geben, sodass Sie auch nach Google gehen können. Hier ist nur ein Weg, um zu demonstrieren, wie man MyBatis Paging verwendet.
Nachdem dies abgeschlossen ist, hat es im Abfrageergebnis, da es MySQL ist, keine eigene ID für eine eigene Auflastung. Daher ist es möglicherweise nicht offensichtlich, wenn Sie die Testdaten überprüfen. Wenn Sie sich nicht beeilen müssen, können wir es selbst tun, um Essen und Kleidung auszugleichen und die obige Methode zu verwandeln. Hier erstelle ich eine vollständig identische Besucher im Modellpaket und bringt eine zusätzliche ID mit der Aufgabe mit der Persistenz des Rownum -Parameters wie folgt mit:
Paket David.mybatis.model; Import Java.Text.SimpledateFormat; Import Java.util.Date; öffentliche Klasse Besucherwithrn {private int id; privater Zeichenfolge Name; private Zeichenfolge E -Mail; privater Int -Status; privates Date Createtime; private intowum; public VisitorWithrn () {// Todo automatisch generierter Konstruktor Stub CreateTime = new Date (); } public VisitorWithrn (Zeichenfolge Name, Zeichenfolge E -Mail) {this.name = name; this.email = E -Mail; this.setStatus (1); this.createTime = new Date (); } public int getid () {return id; } public void setName (String -Name) {this.name = name; } public String getName () {return name; } public void setemail (String -E -Mail) {this.email = E -Mail; } public String getemail () {E -Mail zurückgeben; } public date getCreateTime () {return CreateTime; } public int getStatus () {Rückgabestatus; } public void setStatus (int Status) {this.status = Status; } public int getRrownum () {return rownum; } public void setRownum (int rownum) {this.rownum = rownum; } @Override public String toString () {// Todo automatisch generierter Methode Stub return String.format ("{Rownum: %d, id: %d, name: %s, createtime: %s}, rownum, id, name, neu simpledateFireat (" yyyy-mm-dd hhh: mm: ss "). }}Erstellen Sie in Ivisitoroperation eine neue Methode namens Public List <VisitorWithrn> getListbypagenateWithrn (pagenateargs args). In ähnlicher Weise müssen wir den entsprechenden <Select> Knoten und Skript in VisitOrPer konfigurieren. Der einzige Unterschied besteht darin, dass wir das SQL -Skript wie folgt ändern müssen:
<? namespace = "David.mybatis.demo.ivisitoroperation"> <!-useGeneratedKeys = "true" bedeutet, ob eine Selbstwachstumssequenz verwendet werden soll, KeyProperty = "id" Gibt an, welche Spalte die Selbsterwachstumspalte, ParameterType = "Visitor", die entsprechende Art der Definition in der Definition des IVisitoroperations-Interesses-addiert "addiert" addiert. parameterType="Visitor" useGeneratedKeys="true" keyProperty="Id"> insert into Visitor (Name, Email, Status, CreateTime) values (#{name}, #{email}, #{status}, #{createTime}) </insert> <delete id="delete" parameterType="int"> delete from Visitor where status>0 and id = #{id} </delete> <update id = "update" parameterType = "Visitor"> Aktualisieren von Visitor Set name = {name}, E -Mail =#{E -Mail}, status =#{status} wobei ID =#{ID} und Status> 0; </update> <select id = "query" parameterType = "int" resultType = "Visitor"> ID, Name, E -Mail, Status, createtime aus Besucher wob < /select> <select id = "getList" resultMap = "Visitorrs"> <include refid = "getListsql" /> < /select> <sql id = "getListsql"> SELECT * vom Besucher, wobei der Status> 0 < /sql> <resultmap type = "visiter" id = "id" id column = "id" id "id" id "id" id "id" id "id" id "id" id "id" id "id" Column = "E -Mail" Property = "E -Mail" /> <resultal column = "status" Property = "Status" /> <resultal column = "createTime" Property = "createTime" /> < /resultMap> <select id = "getListBypagenate" parameterType = "pagenateArgs" resultTYPe = "Visitor"> Select *> Inclust * refid="orderBySql"/> ) t <!-- #{} means parameterized output, ${} means direct output does not perform any escape operations, transfer it yourself --> <if test="pageStart>-1 and pageSize>-1"> limit #{pageStart}, #{pageSize} </if> </select> <!--Refine it for the two examples to share --> <sql id="orderBySql"> order by ${orderFieldStr} ${orderDirectionStr} </sql> <!-- How to write SQL scripts with rownum--> <resultMap type="VisitorWithRn" id="visitorWithRnRs"> <id column="Id" property="id" /> <result column="Name" property="name" /> <result column="Email" property="email" /> <result column="Status" property="status" /> <result column="CreateTime" property="createTime" /> <result column="Rownum" property="rownum" /> </resultMap> <select id="getListByPagenateWithRn" resultMap="visitorWithRnRs"> <!-- #{} means parameterized output, ${} means direct output does keine Fluchtoperationen durchführen, übertragen Sie es selbst-> SELECT T.ROWNUM, T.ID, T.NAME, T.EMAIL, T.STATUS, T.CreateTime aus (<include refid = "getListsqlcontainsrn" /> <include refid = "orderbysql" />) t <if test = "pagestart> -1 und pagagessize> -1", und pagestart} -1 und pagagestart} -1 und pagages, und pagestart} -1 und pagagestart} -1 und pagagestart} -1 und pagagestart} -1 und pagagestart} -1 und pagagestart} -1- und pagages-1 und pagagestart} -1 und pagagestart. #{pageSize} </if> </select> <sql id = "getListsqlcontainsrn"> select @ROWNUM: = @rownum+1 rownum, result.id, result.name, result.email, result.status, result.createtime aus (select @rownum: = 0, ventat> mag./magitor. Das nächste, was noch übrig ist, ist, die Testmethode gerade jetzt unter Demorun hinzuzufügen, sodass ich die Karte hier nicht kleben werde. Nach Abschluss können Sie sehen, dass die 6-10 Datensteile gerade jetzt wie folgt werden