Menerapkan kueri gabungan multi-meja
Atau buat kelas situs web baru di bawah paket David.mybatis.model untuk bertahan dan tulis ulang metode ToString () yang sesuai untuk memfasilitasi penggunaan program pengujian.
Paket david.mybatis.model; import java.text.simpledateFormat; import java.util.date; situs web kelas publik {private int id; nama string pribadi; VisitorID int pribadi; status int pribadi; createTime tanggal pribadi; Pengunjung Pribadi; situs web publik () {// TODO Konstruktor yang dihasilkan secara otomatis Stub createTime = new Date (); pengunjung = pengunjung baru (); } situs web publik (nama string, int visitorID) {this.name = name; this.visitorId = visitorID; pengunjung = pengunjung baru (); status = 1; createTime = new Date (); } public int getId () {return id; } public void setid (int id) {this.id = id; } pengunjung publik getVisitor () {pengunjung kembali; } public void setVisitor (pengunjung pengunjung) {this.visitor = pengunjung; } public string getName () {return name; } public void setName (name string) {this.name = name; } public int getStatus () {status return; } public void setstatus (status int) {this.status = status; } tanggal publik getCreateTime () {return createTime; } public void setCreateTime (date createTime) {this.createTime = createTime; } public int getVisitorId () {int id = 0; if (pengunjung == null) id = visitorID; lain id = visitor.getId (); Return ID; } public void setVisitorId (int visitorID) {this.visitorId = visitorId; } @Override Public String ToString () {StringBuilder SB = New StringBuilder (String.Format ("situs web => {id: %d, nama: %s, createTeTime: %s}/r/n", id, nama, new SimpledateFormat ("yyyyy)) (mm: mm: ss") ("yyyyy) (yyyyy) (mm: mm: ss" (ss ") (" yyyyy) (yyyyy) (mm: mm: ss "(ss" (ss ") (" yyyyy)) (mm: mm: ss "(ss" (ss ") (" yyyyy)) (mm: mm: ss "(ss" (ss ". if (pengunjung! = null) sb.append (string.format ("visitor => %s", pengunjung.toString ())); return sb.tostring (); }}Buat antarmuka operasi yang sesuai di bawah David.Mybatis.demo:
paket david.mybatis.demo; import java.util.list; impor david.mybatis.model.website; antarmuka publik IwebsiteOperation {public int add (situs web situs web); Public Int Delete (int ID); Pembaruan Int Publik (Situs Web Situs Web); kueri situs web publik (int id); Daftar Publik <Sebitel> getList (); }Buat file pemetaan WebSIteMapper.xml baru di folder Mapper, dan rujuk ke yang sebelumnya untuk ditambahkan, hapus, ubah, dan periksa konfigurasi operasi tabel tunggal, sehingga Anda dapat membangun beberapa data uji. sebagai berikut
<? Xml Version = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper namespace="david.mybatis.demo.IWebsiteOperation"> <sql id="getListSql"> select id, name, VisitorId, status, createTime from Website where status>0 </sql> <insert id="add" parameterType="Website" useGeneratedKeys="true" keyProperty="Id"> insert into Website (Name, VisitorId, Status, CreateTime) values ( #{Name}, #{visitorId}, #{status}, #{createTime}) </sert> <delete id = "delete" parameterType = "int"> hapus dari situs web di mana status> 0 dan id = #{id} </delete> <update id = "update" update "ParameType =" {{{{/delete = <update id = "update" ParameterTye = "iD"> {{{{{{parametTye {{{{{{pareTerpene = " </update> <pilih id = "query" parameTerType = "int" resultMap = "websiters"> pilih situs web.id siteId, situs web.name sitename, visitor.id visitorid, visitor.name visitOnname, situs web dan situs webs.status, visitorid. Website.id=#{id} </select> <resultMap type="Website" id="websiteRs"> <id column="siteId" property="id" /> <result column="siteName" property="name" /> <result column="siteStatus" property="status" /> <result column="siteCreateTime" property="createTime" /> <association property="visitor" javaType="Visitor" resultMap = "VisitorRs" /> </RancesMap> <resultMap type = "visitor" id = "Visitorrs"> <id kolom = "visitorid" properti = "id" /> <column hasil = "VisitOnname" properti = "name" /> < /resultMap> <pilih ID = "getList" </papper>Apa yang terutama kita bicarakan hari ini adalah pencarian. Sekarang kami ingin meminta situs web dan mengambil informasi pengunjung yang sesuai bersama. Bagaimana cara melakukannya? Anda dapat merujuk ke kueri dalam konfigurasi dan menuliskan SQL untuk kueri tabel tautan.
Hal utama yang perlu diperhatikan di sini adalah bahwa dua properti ID dan nama dalam entitas situs web dan entitas kunjungan adalah sama. Oleh karena itu, untuk menghindari kesalahan pemetaan, daftar hasil kueri yang sesuai dengan alias yang berbeda, sehingga dapat dihindari saat mengikat.
Apa yang akan saya dapatkan jika saya mengonfigurasinya seperti berikut?
<Pilih id = "query" parameTerType = "int" resultMap = "websiters"> pilih situs web.id, situs web.name sitename, visitor.id, pengunjung. Website.id=#{id}</select><resultMap type="Website" id="websiteRs"> <id column="id" property="id" /> <result column="siteName" property="name" /> <result column="siteStatus" property="status" /> <result column="siteCreateTime" property="createTime" /> <association property="visitor" javaType="Visitor" resultMap = "VisitorRs" /> < /resultMap> <resultMap type = "pengunjung" id = "VisitorRs"> <id kolom = "id" properti = "id" /> <column column = "VisitOnname" properti = "name" /> < /resultMap> Apakah Anda memperhatikan bahwa ID pengunjung juga telah menjadi 2. Faktanya, ia memetakan ID situs web secara default, karena hasil dari kueri pernyataan SQL telah menjadi 2. Beberapa orang mungkin bertanya mengapa itu bukan 4, karena cocok dengan yang pertama secara default. Jika Anda mengganti lokasi situs web.id dan kunjungi.id, Anda akan menemukan bahwa hasilnya telah berubah secara ajaib lagi.
Jadi Anda perlu memberikan alias untuk menghindari situasi ini, jadi Anda akan menemukan bahwa sebenarnya hanya ada satu kebenaran, yang merupakan sebagai berikut:
Anda dapat melihat bahwa metode hasil pemrosesan multi-meja adalah sama dengan tabel tunggal. Ini tidak lebih dari mendaftarkan nama atribut Javabean. Anda dapat melihat bahwa ada gambaran hasil lain di meja depan di simpul <RancesMap> dari situs web. Ini mewakili entitas yang perlu dipetakan oleh entitas kunjungan. Anda dapat menggunakan metode berikut untuk membuat asosiasi.
<asosiasi properti = "pengunjung" javatype = "pengunjung" resultMap = "visitorrs" />
Pengunjung adalah nama lapangan kunjungan di entitas situs web. Nama harus konsisten. Kalau tidak, pengecualian tidak ada pengambil untuk properti yang bernama 'xxx' di 'kelas David.mybatis.model.website' akan dilemparkan. Ini telah dijelaskan dalam bab -bab sebelumnya. Tentu saja, jika Anda berpikir tidak apa -apa untuk tidak menyarangkan hasil, sarang juga karena fakta bahwa konfigurasi ini dapat digunakan di tempat lain, maka itu akan diekstraksi, yang juga merupakan ide abstrak. Gunakan ID dan hasilnya di <RancesMap> untuk menemukan perbedaan yang sesuai dari situs web resmi: http://mybatis.github.io/mybatis-3/sqlmap-xml.html#result_maps
Dengan cara ini, kueri sendi multi-meja sederhana akan keluar. Jika ada biaya bisnis kueri yang lebih kompleks, beberapa modifikasi akan dilakukan berdasarkan ini.
Logika efek pagination
Yang ingin kita bicarakan adalah masalah pagination yang sering kita temui dalam masalah bisnis. Saat mengembangkan proyek web, kami sering menggunakan tampilan daftar. Secara umum, kami menggunakan beberapa kontrol daftar yang umum digunakan, seperti datatables (saya pribadi merasa sangat baik), dan kontrol tabel yang dienkapsulasi di bawah UI yang mudah.
Ide: Untuk mencapai efek paging dalam kontrol ini, kami biasanya melewati 2 parameter. Yang pertama adalah mewakili indeks halaman saat ini (biasanya mulai dari 0), yang kedua adalah untuk mewakili berapa banyak catatan bisnis yang ditampilkan pada halaman saat ini, dan kemudian meneruskan parameter yang sesuai ke daftar <T> Metode GetList (PagenateArgS args). Saat akhirnya menerapkan paging dalam database, kita dapat menggunakan kata kunci batas (untuk mysql) untuk paging. Jika itu adalah Oracle atau SQL Server, mereka semua memiliki fungsi Rownum sendiri untuk digunakan.
Untuk membahas ide -ide di atas, pertama -tama, kita perlu membuat kelas parameter halaman baru bernama Pagenateargs di bawah demo.mybatis.model seperti biasa, dan kelas enum bernama SortDirectionEnum, yang berisi indeks halaman saat ini, halaman saat ini menampilkan halaman catatan bisnis, dan atribut PagesTart yang mengindikasikan item yang akan dimulai dari. (pagestArt = pageIndex*pageSize) Karena penggunaan kata kunci batas adalah untuk mewakili [batas batas nomor (tidak termasuk), ambil beberapa item], bidang penyortiran orderFieldStr, orderDirectionTtr arah penyortiran, sehingga kreasi spesifik adalah sebagai berikut:
paket david.mybatis.model;
/ * * Pagination Parameter Entity Class */Public Class Pagenateargs {private int pageIndex; halaman int private; private int pagestart; Private String OrderFieldStr; Private String OrderDirectionstr; pAGENATEARGS PUBLIK () {// TODO Stub Konstruktor yang Dihasilkan Otomatis} pagenateArgs publik (int pageIndex, int pageSize, string orderFieldStr, String orderDirectionTr) {this.pageIndex = pageIndex; this.pagesize = halaman; this.orderFieldStr = orderFieldStr; this.orderDirectionstr = orderDirectionTr; pagestArt = pageIndex * pageSize; } public int getPageIndex () {return pageIndex; } public int getPagestArt () {return pagestart; } public int getPageSize () {return pageSize; } public String orderFieldStr () {return orderFieldStr; } public string getOrderDirectionTr () {return orderDirectionstr; }} paket david.mybatis.model;/ * * urutkan enum */public enum sortDirectionEnum {/ * * ascending */asc,/ * * Descending */desc}Setelah menyelesaikan langkah -langkah di atas, kami terus menambahkan metode Daftar Publik <Visitor> getListByPagenate (Pagenateargs args) ke kelas antarmuka ivisitoroperation. Dalam bab -bab sebelumnya, kami sebenarnya sudah memiliki metode GetList. Pagination ini sebenarnya hanya sedikit perubahan berdasarkan ini. Setelah kelas antarmuka ivisitoroperation diubah, itu adalah sebagai berikut:
Paket david.mybatis.demo; impor java.util.list; impor david.mybatis.model.pagenateargs; /** Tambahkan Pengunjung*/ Int Publik Tambah (Pengunjung Pengunjung); /** Hapus pengunjung*/ int hapus publik (int id); /** Pembaruan Pengunjung*/ Pembaruan int publik (Pengunjung Pengunjung); /** Kueri Pengunjung*/ Kueri Pengunjung Publik (Int ID); / * * Daftar kueri */ Daftar Publik <Wisitor> getList (); / * * Daftar Kueri Pagination */ Daftar Publik <Wisitor> getListByPagenate (Pagenateargs args); }
Selanjutnya kita harus mulai mengubah file konfigurasi Visitormapper.xml kami, tambahkan ID Node dan Jenis Parameter yang baru untuk mengonfigurasinya sesuai dengan bab -bab sebelumnya. ID baru yang ditambahkan di sini adalah GetListByPagenate. Setelah konfigurasi, berikut ini
<? Xml Version = "1.0" encoding = "UTF-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper naMapper =" mapper. <!-- useGeneratedKeys="true" means whether to use a self-growth sequence, keyProperty="Id" specifies which column is the self-growth column, parameterType="Visitor" specifies the corresponding type passed in the definition in the IVisitorOperation interface class--> <insert id="add" parameterType="Visitor" useGeneratedKeys="true" keyProperty="Id"> insert into Visitor (nama, email, status, createTime) values ( #{name}, #{email}, #{status}, #{createTime}) </sert> <delete id = "delete" parameTerType = "int"> hapus dari pengunjung di mana status> 0 dan id = #{id} </delete> update = " #{name}, email =#{email}, status =#{status} di mana id =#{id} dan status> 0; </update> <pilih id = "query" parameTerType = "int" resultType = "pengunjung"> Pilih id, nama, email, status, createTime dari pengunjung di mana id =#{id} dan status> 0 pesanan dengan id </pilih> <pilih id = "basicQuery" parameTerpe = "int" resultType = "ID visitor"> Dari> dari ParameterType = "int" hasil "visor" id = "getList" resultMap = "visitorrs"> <include refid = "getListql"/> </select> <sql id = "getListql"> pilih * dari pengunjung di mana status> 0 </sql> <!- berikut ini adalah bagian baru untuk pagination. Orderbysql diekstraksi misalnya penggunaan kembali kemudian-> <resultmap type = "pengunjung" id = "vistaRrs"> <id kolom = "id" properti = "id" /> <hasil kolom = "name" properti = "name" /> <hasil kolom = "email" properti = email " /> <hasil kolom =" status "properti =" status " /> <email" poucht = "email" /<creatime = "status" properti "properti =" status " /> <Email" Properti = "Email" id = "getListBypagenate" parameTerType = "pagenateargs" resultType = "pengunjung"> pilih * dari (<include refid = "getListql" /> <include refid = "orderbysql" /> t <!- #{} berarti output yang diparameterisasi, $ {} berarti output rutpor /{{{{} {} yang diparameterisasi, $ {{{{} tidak ada yang berarti tidak ada output. dan PageSize> -1 "> Limit #{PagestArt}, #{PageSize} </if if> </tect> <sql id =" orderbysql "> order dengan $ {orderFieldStr} $ {orderDirectionstr} </sql> </smapper>Anda akan menemukan konfigurasi serupa pada gambar di bawah ini. Atribut lapangan di sini semuanya konsisten dengan nama atribut di kelas parameter Pagenateargs.
<if test = "pagestArt> -1 dan pageSize> -1"> Limit #{pagestArt}, #{pagesize} </if>Buat metode pengujian di kelas Demorun:
/** Parameter pagination*/public static void queryVisitorListWithPagenate (int pageIndex, int pageSize, String Orderfield, String orderDire) {pagenateargs args = pagenateArgs baru (pageIndex, pageze, orderfield, orderdire); Sesi sqlsession = mybatisutils.getsqlsession (); IvisitorOperation vOperation = session.getMapper (ivisitoroperation.class); Daftar <Visitor> pengunjung = voperation.getListBypagenate (args); untuk (pengunjung pengunjung: pengunjung) {System.out.println (pengunjung); } Mybatisutils.closession (sesi); Mybatisutils.showmessages (crud_enum.list, pengunjung.size ());}Demorun.queryvisitorlistWithPagenate (0, 100, "id", sortDirectionUnum.desc.tostring ());
Setelah berjalan, hasil tes diurutkan dalam urutan terbalik dalam ID. Ada 14 catatan di tabel pengunjung.
Misalkan kita mengambil 5 buah di halaman 2, dan jalankan 6-10 lembar data berikut, jadi lulus saja parameternya.
Demorun.queryvisitorlistWithPagenate (1, 5, "id", sortDirectionenum.desc.tostring ());
Hasilnya adalah sebagai berikut:
Ini adalah logika paging yang telah saya terapkan sendiri ~^0^. Yang perlu Anda perhatikan di sini adalah bahwa saya belum membuat penilaian di bidang pesananfieldstr di sini. Secara teoritis, perlu untuk menghadapinya untuk mencegah nama kolom yang salah dilewatkan. Namun, harus ada enkapsulasi siap pakai di internet sekarang, sehingga Anda juga dapat pergi ke Google. Berikut ini hanya cara untuk menunjukkan cara menggunakan paging mybatis.
Setelah menyelesaikan ini, karena ini adalah MySQL, ia tidak memiliki ID urutan Rownum sendiri dalam hasil kueri. Oleh karena itu, mungkin tidak jelas saat memeriksa data uji. Jika Anda tidak perlu terburu -buru, kami dapat melakukannya sendiri untuk menebus makanan dan pakaian dan mengubah metode di atas. Di sini saya akan membuat pengunjung yang sepenuhnya identik dengan entitas dalam paket model dan membawa ID Rownum tambahan yang dikembalikan oleh kegigihan parameter Rownum, sebagai berikut:
paket david.mybatis.model; import java.text.simpledateFormat; import java.util.date; pengunjung kelas publik dengan {private int id; nama string pribadi; email string pribadi; status int pribadi; createTime tanggal pribadi; Private Int Rownum; pengunjung publikrn () {// TODO Konstruktor yang dihasilkan secara otomatis Stub createTime = new Date (); } public visitorwithRn (nama string, email string) {this.name = name; this.email = email; this.setstatus (1); this.createTime = new Date (); } public int getId () {return id; } public void setName (name string) {this.name = name; } public string getName () {return name; } public void seteMail (string email) {this.email = email; } public String geteMail () {return email; } tanggal publik getCreateTime () {return createTime; } public int getStatus () {status return; } public void setstatus (status int) {this.status = status; } public int getRownum () {return rownum; } public void setRownum (int rownum) {this.rownum = rownum; } @Override Public String ToString () {// TODO Metode yang dihasilkan otomatis Stub return string.Format ("{rownum: %d, id: %d, name: %s, createTime: %s}", rownum, id, name, new SimplateFormat ("yyyyyy-mm-dd hh: mm: ss ss" ss ". }}Dalam ivisitorOperation, buat metode baru yang disebut Daftar Publik <VisitorWithRn> getListByPagenateWithRn (Pagenateargs args). Demikian pula, kita perlu mengonfigurasi simpul dan skrip <CILTER> yang sesuai di VisitorMperper. Satu -satunya perbedaan di sini adalah bahwa kita perlu memodifikasi skrip SQL, sebagai berikut:
<? Xml Version = "1.0" encoding = "UTF-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper naMapper =" mapper. <!-- useGeneratedKeys="true" means whether to use a self-growth sequence, keyProperty="Id" specifies which column is the self-growth column, parameterType="Visitor" specifies the corresponding type passed in the definition in the IVisitorOperation interface class--> <insert id="add" parameterType="Visitor" useGeneratedKeys="true" keyProperty="Id"> insert into Visitor (nama, email, status, createTime) values ( #{name}, #{email}, #{status}, #{createTime}) </sert> <delete id = "delete" parameTerType = "int"> hapus dari pengunjung di mana status> 0 dan id = #{id} </delete> update = " #{name}, email =#{email}, status =#{status} di mana id =#{id} dan status> 0; </update> <pilih id = "query" parameTerType = "int" resultType = "pengunjung"> Pilih id, nama, email, status, createTime dari pengunjung di mana id =#{id} dan status> 0 pesanan dengan id </pilih> <pilih id = "basicQuery" parameTerpe = "int" resultType = "ID visitor"> Dari> dari ParameterType = "int" hasil "visor" id = "getList" resultMap = "VisitorRs"> <include refid = "getListql" /> < /select> <sql id = "getlistql"> pilih * dari pengunjung di mana status> 0 < /sql> <resultmap type = "visitor" id = "visitors"> <id kolom = "id" "" id "" "ID" <"ID" "ID" "ID" "ID" "ID" "ID" "ID" "ID" " Properti = "Email" /> <colom hasil = "status" properti = "status" /> <colom hasil = "createTime" properti = "createTime" /> < /resultMap> <pilih id = "getListBypagenate" parameTerType = "pagenateArgs" resultType = "visitor"> Select * from (<include "gets =" get "get" "certer"> ">" certer "pagenateArgs =" visitor "> <! ' $ {orderFieldStr} $ {orderDirectionTr} </sql> <!-Cara menulis skrip SQL dengan rownum-> <resultMap type = "visitorwithrn" id = "visitorwithrnrs" <Id column = "id" property = "id" /<hasil kolom = "name" "name" <ID = "id" properti = "status" /> <colom hasil = "createTime" properti = "createTime" /> <colom hasil = "rownum" properti = "rownum" /> < /resultMap> SELECT id = "getListByPagenateWithRn" outputasi, outputasi, outputasi {outrnrs {oVer {{oVer {{oVerRnrs " t.rownum, t.id, t.name, t.email, t.status, t.createTime from (<include refid = "getListSqlContainSrn"/> <include refid = "orderbysql"/> t <if test = "pagestArt> -1 dan fageSize> -1 -1> {pagestArt> -1 dan fagezeSize> -1"> {pagestArt> -1 dan fageSize> -1 "> {pagesTart> -1 dan fageSize> -1"> {pagesTart> -1 dan fageSize> -1> <sql id = "getListSqlContainSrn"> pilih @rownum: = @rownum+1 rownum, hasilnya, hasil. Hal berikutnya yang tersisa adalah menambahkan metode pengujian di bawah Demorun sekarang, jadi saya tidak akan menempelkan peta di sini. Setelah selesai, Anda dapat melihat bahwa data 6-10 sekarang akan menjadi sebagai berikut