Faktanya, salah satu fitur kuat mybatis biasanya adalah kemampuan SQL yang dinamis. Jika Anda memiliki pengalaman menggunakan JDBC atau kerangka kerja serupa lainnya, Anda memahami bahwa itu sangat kusut untuk secara dinamis menggabungkan string SQL bersama -sama, pastikan Anda tidak melupakan spasi atau menghilangkan koma di akhir daftar. SQL dinamis di mybatis dapat menangani rasa sakit ini secara menyeluruh. Untuk SQL dinamis, cara paling sederhana adalah memberi kita berbagai penilaian perilaku dinamis ketika bersodok keras. Di Mybatis, bahasa SQL dinamis yang kuat digunakan untuk memperbaiki situasi ini, yang dapat digunakan dalam pemetaan pernyataan SQL apa pun. Elemen SQL dinamis mirip dengan menggunakan JSTL atau prosesor teks berbasis XML serupa lainnya. Mybatis menggunakan ekspresi berbasis OGNL yang kuat untuk menghilangkan elemen lain.
Beberapa elemen simpul yang biasa kami gunakan termasuk jika, pilih (kapan, sebaliknya), trim (di mana, jika), dan foreach. Saya merasa agak seperti penggunaan XSLT (saya akan menyebutkannya nanti di artikel ~).
(1) Penggunaan IF
Dalam konfigurasi pagination viisitmapper, jika PageIndex> -1 dan halaman> -1, pagination SQL yang sesuai akan ditambahkan, jika tidak itu tidak akan ditambahkan (default semuanya diambil), sebagai berikut:
<Pilih id = "getListBypagenate" parameTerType = "pagenateargs" resultType = "pengunjung"> pilih * dari (<include refid = "getListql" /> <include refid = "orderbysql" /> t <!- #{} berarti output yang diparameterkan, $ {{} tidak ada yang berarti overation, $ {{{} tidak ada transfer, do {{{{{} do. test = "pagestArt> -1 dan pageSize> -1"> Batas #{pagestArt}, #{pagesize} </if> </schect> <sql id = "getListSql"> Pilih * dari pengunjung di mana status> </sql> <sql id = "orderbysql"> pesanan dengan $ {sql {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{SQL "> pesanan $ {{{{{sql">Karena parameter kami PageIndex dan Pagesze keduanya adalah nilai int, kami dapat membuat penilaian langsung seperti ini. Jika ini adalah instance objek, kita dapat menggunakan penilaian nol untuk mengontrol beberapa logika dinamis. Perkembangan spesifik tergantung pada kebutuhan bisnis. Saya pikir penting untuk dicatat di sini bahwa tidak mudah untuk menulis &&, ini tidak akan dikenali dalam konfigurasi ~.
(2) Penggunaan pilihan (kapan, sebaliknya)
Pilih ketika terutama digunakan dalam skenario aplikasi yang hanya memenuhi salah satu kondisi dalam beberapa kondisi. Misalnya, berikut adalah kondisi kueri, ID, nama, dan createTime masing -masing. Misalkan ketika kita menanyakan tabel pengunjung, jika VisitorID memiliki nilai, gunakan kueri ID, dan jika VisitOnname memiliki nilai, gunakan kueri VisitName. Sebagai berikut, tambahkan Daftar <Visitor> GetListChoosewhendemo (BasicQueryArgs args) metode ke kelas antarmuka david.mybatis.demo.ivisitoroperation. Tambahkan Konfigurasi Node Pilih yang sesuai di Visitormapper:
Paket david.mybatis.demo; impor java.util.list; impor david.mybatis.model.basicqueryargs; david.mybatis.model.pageneargs; impor david.mybatis.model.visitor; impor David.mybatis.model Pengunjung*/ Int Public Ind (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); / * * Daftar kueri pagination (termasuk rownum) */ Daftar publik <VisitorWithRn> getListByPagenateWithRn (Pagenateargs args); /** Kueri dasar*/ pengunjung publik BasicQuery (int id); / * * Permintaan kondisi dinamis (pilih, kapan) instance */ Daftar publik <Visitor> getListChoosewhendemo (BasicQueryArgs args); / * * Kondisi Dinamis Permintaan (di mana, if) instance */ Daftar publik <Visitor> getListWheredemo (BasicQueryArgs args); / * * Dynamic Query (foreach) Instance */ Daftar Publik <Wisitor> getListForeachDemo (Daftar <Integer> id); }
<? 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. <resultMap type = "pengunjung" id = "visitorrs"> <id kolom = "id" properti = "id" /> <colom hasil = "nama" properti = "name" /> <column hasil = "email" properti = "email" /> <hasil kolom = "status" status " /> <hasil kolom = createTime" properti = "createTime" dari pengunjung </sql> <!-Pilih kapan salah satu kondisi terpenuhi-> <pilih id = "getListChoosewhendemo" resultMap = "visitorrs" parameterType = "basicQueryArgs"> <termasuk refid = "getListSqlconditions"/> <where> <if test = "querystatus> 0" {query {query {query> Test = "queryId! = 0"> dan id = #{queryId} </whow> <when test = "queryname! = Null"> dan nama seperti #{queryname} </poose> <kingher> dan createTime> = #{querytime} </sebaliknya> </pilih> </where> </silsikan> </mapper>(3) Penggunaan di mana jika (trim)
Keuntungan dari mana kata kunci adalah bahwa jika ada kondisi filter yang sesuai, ia tahu untuk memasukkan di mana kata kunci pada waktu yang sesuai. Dan itu juga tahu kapan harus menghapus yang sesuai dan dan atau konektor, terutama berurusan dengan skenario berikut
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if></select>Itu tidak akan menjadi akibat dari kegagalan semua kondisi
<pilih id = "findactiveblog" resultType = "blog"> Pilih * dari blog di mana </pilih>
Atau karena kondisi pertama tidak terpenuhi, kondisi selanjutnya hanya dipenuhi.
<pilih id = "findactiveblog" resultType = "blog"> Pilih * dari blog di mana dan judul seperti 'kejadian' </ pilih>
Oleh karena itu, untuk ini kita dapat membuat pilihan saat kondisi kondisi, dan menambahkan metode publik yang sesuai dengan daftar publik <Visitor> getListWheredemo (BasicQueryArgs args) ke kelas antarmuka ivisitoroperation, dan tambahkan konfigurasi yang sesuai dalam file konfigurasi VisitRormper 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. <sql id="getListSqlConditions"> select * from Visitor </sql> <!-- Add operations if the conditions are met--> <select id="getListWhereDemo" resultMap="visitorRs" parameterType="BasicQueryArgs"> <include refid="getListSqlConditions" /> <where> <if test="queryStatus>0"> status>0 </if> <if test = "queryId> 0"> dan id =#{queryId} </if> <if test = "queryname! = null"> dan name like =#{queryName} </if> <if test = "querytime! = null" dan createTime> =#{querytime} </ifover} </ifoveres! | Atau "> <if test =" querystatus> 0 "> status> 0 </if> <if test =" queryId> 0 "> dan id =#{queryId} </if> <if test =" queryname! = Null "> name like =#{queryname} </if> <if test =" query! </Rim> -> </pilih> </mapper>(4) Penggunaan Foreach
Dalam SQL dinamis yang umum digunakan, kami memiliki skenario bisnis di mana ID dalam serangkaian besar ID. Dalam hal ini, kita dapat menggunakan foreach tanpa harus bekerja keras untuk menyambungkan string ID. Langkah yang sama adalah menambahkan metode yang sesuai ke Daftar Publik Kelas Antarmuka Ivisitoroperation <Visitor> getListForeACHDemo (Daftar <Integer> ID), dan kemudian konfigurasikan informasi elemen node yang sesuai dalam file mapper yang sesuai, 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. <sql id = "getListSqlConditions"> Pilih * dari pengunjung </sql> <!-Kondisi loop foreach-> <pilih id = "getListForeachDemo" resultMap = "Visitorrs"> <termasuk refid = "getListSQLConditions"/> di mana status> 0 dan id di <foreach collection = "(" daftar "=" Indeks "" tutup = ")"> $ {item} </freeach> </select> </mapper>Akhirnya, Anda hanya perlu menetapkan metode pengujian yang sesuai di Demorun, dan SQL dinamis di Mybatis akan selesai. Metode demorun yang digunakan untuk tes di bawah ini
/** Kueri Dinamis Foreach Instance*/ public static void getListForeachDemo (Daftar <Integer> id) {SQLSession session = mybatisutils.getsqlSession (); IvisitorOperation vOperation = session.getMapper (ivisitoroperation.class); Daftar <Visitor> ls = voperation.getListForeachDemo (IDS); untuk (pengunjung pengunjung: ls) {system.out.println (pengunjung); }} /** Kueri dinamis di mana jika instance* / public static void getListWherecondition (int id, string name, date createTime) {name = name == ""? null: name; Sesi sqlsession = mybatisutils.getsqlsession (); BasicQueryArgs args = new BasicQueryArgs (ID, Name, CreateTime); IvisitorOperation vOperation = session.getMapper (ivisitoroperation.class); Daftar <Visitor> ls = voperation.getListWheredemo (args); if (ls.size () == 0) system.out.println ("Periksa tidak cocok!"); else {for (pengunjung pengunjung: ls) {system.out.println (pengunjung); }}} /** Kueri dinamis Pilih kapan instance* / public static void getListChoosewHendemo (int id, string name, date createtime) {name == "" "? null: name; Sesi sqlsession = mybatisutils.getsqlsession (); BasicQueryArgs args = new BasicQueryArgs (ID, Name, CreateTime); IvisitorOperation vOperation = session.getMapper (ivisitoroperation.class); Daftar <Visitor> ls = voperation.getListChoosewhendemo (args); if (ls.size () == 0) system.out.println ("Periksa tidak cocok!"); else {for (pengunjung pengunjung: ls) {system.out.println (pengunjung); }}}
PS: Tentang Ognl
Ognl adalah singkatan dari bahasa navigasi grafik objek. Dari perspektif bahasa: Ini adalah bahasa ekspresi yang kuat yang digunakan untuk mendapatkan dan mengatur sifat -sifat objek Java. Ini bertujuan untuk memberikan sintaks abstraksi yang lebih tinggi untuk menavigasi grafik objek Java. Ognl memiliki aplikasi di banyak tempat, seperti:
Bahasa yang mengikat sebagai elemen GUI (TextField, ComboBox, dll.) Untuk memodelkan objek.
Tabel Basis Data untuk Bahasa Sumber Data Tablemodel Swing.
Bahasa yang mengikat untuk komponen web dan objek model latar belakang (Webognl, Tapestry, Webwork, WebObjects).
Sebagai alternatif yang lebih ekspresif untuk Jakarata Commons Beanutils atau bahasa ekspresi JSTL.
Selain itu, ada banyak hal yang dapat dilakukan di Java, yang juga dapat dilakukan dengan menggunakan OGNL, seperti pemetaan dan seleksi daftar. Untuk pengembang, menggunakan OGNL, Anda dapat menggunakan sintaks ringkas untuk menyelesaikan navigasi objek Java. Secara umum, navigasi informasi objek diselesaikan melalui "jalur". "Jalur" ini dapat menjadi atribut ke kacang java, objek yang diindeks dalam koleksi, dll., Daripada secara langsung menggunakan metode GET atau Set.