Semua orang pada dasarnya tahu cara menggunakan mybatis untuk menjalankan SQL sewenang -wenang. Metode penggunaan sangat sederhana, misalnya, dalam xxmapper.xml:
<pilih id = "executeql" resultType = "peta"> $ {_ parameter} </ pilih>Anda dapat menyebutnya sebagai berikut:
sqlsession.selectList ("executeQl", "select * dari sysuser di mana diaktifkan = 1");Atau Anda dapat menentukan metode berikut di antarmuka xxmapper.java:
Daftar <peta> executeQL (String SQL);
Kemudian gunakan antarmuka untuk memanggil metode:
xxmapper.executesql ("Pilih * dari Sysuser di mana diaktifkan = 1");Semua konten di atas mungkin, dan berikut ini sedikit lebih rumit berdasarkan ini.
Jika Anda ingin memberikan nilai menggunakan metode parameter di SQL di atas, yaitu, tulislah sebagai enabled = #{diaktifkan}, jika Anda belum menemukan kebutuhan seperti itu, Anda mungkin tidak mengerti mengapa Anda harus menulisnya seperti ini. Misalnya, untuk menerapkan kueri dinamis, Anda dapat mengonfigurasi SQL di latar depan dan memberikan beberapa kondisi kueri untuk mewujudkan fungsi kueri (untuk keselamatan, konfigurasi ini harus dikembangkan atau diimplementasikan, dan tidak mungkin bagi pengguna untuk mengoperasikan database secara langsung).
Untuk fitur ini, cukup mudah untuk diimplementasikan dengan mybatis. Mengkonfigurasi SQL harus dieksekusi. SQL dapat dieksekusi dalam metode yang disebutkan di atas. Bagaimana cara memberikan parameter? Parameternya adalah bagian #{{diaktifkan} dalam enabled = #{diaktifkan}. Jika ada lebih banyak kondisi, SQL yang dikonfigurasi adalah sebagai berikut:
Pilih * dari Sysuser di mana diaktifkan = #{diaktifkan} dan nama pengguna seperti concat ('%', #{username}, '%')Dalam hal ini, bagaimana saya bisa menggunakan mybatis untuk mengimplementasikannya?
Pertama, XML dimodifikasi sebagai berikut:
<pilih id = "executEql" resultType = "peta"> $ {sql} </dectt>Metode dalam antarmuka dimodifikasi menjadi:
Daftar <pap> executeQL (peta peta);
Kemudian panggil metode:
Peta peta = new HashMap (); // SQL di sini sesuai dengan $ {sql} peta.put ("sql", "pilih * dari sysuser"+ "di mana diaktifkan =#{enabled}"+ "dan nama pengguna seperti concat ('%',#{username}, '%'); 1); //#{username} map.put ("username", "admin"); // masukkan daftar panggilan <pap> list = xxmapper.executesql (peta); // metode sqlsession memanggil sqlsession.selectlist ("executesql", peta);Dengan SQL ini, Anda dapat memberikan nama pengguna dan pengguna sebagai kondisi kepada pengguna. Dua kondisi ini jelas diperlukan. Jika opsional, bagaimana saya harus menulisnya?
Mungkin seseorang telah memikirkan apakah mungkin untuk menggunakan SQL dinamis di mybatis, gunakan tag <if>, dll.?
Sebelum menjawab pertanyaan ini, mari kita lihat kode di DynamicSQLSource yang menangani SQL dinamis:
@Override public BoundSql getBoundSql(Object parameterObject) {DynamicContext context = new DynamicContext(configuration, parameterObject);rootSqlNode.apply(context);SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);Class < ?>parameterType = parameterObject == null ? Object.class: parameterobject.getClass (); sqlsource sqlsource = sqlsourceparser.parse (context.getsql (), parameterType, context.getBindings ()); boundsql boundsql = sqlsource.getBoundSQL (parameterobject); untuk (map.entry <string, objek> entri: context.getBindings (). entryset ()) {boundsql.setAdditionalparameter (entry.getKey (), entry.getValue ());} return boundsql;}Ketika MyBatis menangani SQL dinamis, semua tag SQL dinamis akan diproses sebagai objek SQLNode (Rootsqlnode di sini), dan yang berisi $ {} juga akan diproses sebagai objek TextSQLNode. Dalam dua baris pertama dari metode di atas, adalah tempat Mybatis menangani SQL dinamis.
Oleh karena itu, jika konten kami di $ {sql} berisi tag bersarang seperti $ {} dan <if if>, <where>, dan tag lainnya, ketika mybatis parse xml ke objek sqlnode, elemen xml <pilih> hanya berisi $ {sql}, dan hanya $ {sql} akan menjadi $ {sql}, dan hanya $ {sql} akan menjadi $ {sql}, dan hanya $ {sql} akan akan menjadi $ {sql}, dan hanya $ {sql} akan akan menjadi $ {sql}, dan hanya $ {sql} akan akan menjadi $ {sql}, dan hanya $ {sql} akan akan menjadi $ {sql}, dan hanya $ {sql} akan akan menjadi $ {sql}, dan hanya $ {sql} akan akan menjadi $ {sql}, dan hanya $ {sql} hanya akan. Saat runtime, string parameter ini mungkin berisi tag seperti $ {} dan <if>, <where>, dll. Tapi ini terjadi setelah penguraian mybatis. Oleh karena itu, ketika konten ini muncul sebagai bagian dari string, mereka tidak akan diproses secara khusus. Mereka hanya bagian dari SQL, dan mereka hanya output sebagaimana adanya (karena database tidak mengenalinya, itu akan melaporkan kesalahan) dan tidak dapat diproses. Oleh karena itu, ia tidak dapat menulis SQL dinamis melalui metode yang datang dengan mybatis.
petunjuk
Dalam kode di atas:
sqlsourceparser.parse (context.getSql (), parameterType, context.getBindings ());
Sepotong kode ini menangani parameter dinamis (#{}) setelah pemrosesan SQL dinamis, sehingga jenis parameter ini dapat digunakan dalam SQL.
Karena Anda tidak dapat menggunakan metode SQL dinamis MyBatis, bagaimana menerapkan SQL dinamis?
Ini ide sederhana. Gunakan bahasa markup template di SQL untuk mengimplementasikan SQL dinamis (seperti Freemarker). Sebelum SQL diserahkan kepada MyBatis untuk dieksekusi, gunakan templat untuk memproses SQL untuk menghasilkan SQL akhir yang dieksekusi (perlu menghindari pemrosesan parameter #{}), dan menyerahkan SQL ini ke MyBatis untuk dieksekusi.
Ambil contoh template freemarker, dan masih SQL di atas didasarkan pada:
Pilih * dari Sysuser di mana 1 = 1 <#jam diaktifkan ??> enabled =#{diaktifkan} </#if> <#if username ?? && username! = ''> dan nama pengguna seperti concat ('%',#{username}, '%') </#if>Perhatikan bahwa <#if> di sini adalah elemen freemarker. Tanpa mempertimbangkan injeksi SQL, SQL di atas juga dapat ditulis sebagai:
Pilih * dari Sysuser di mana 1 = 1 <#jam diaktifkan ??> enabled =#{diaktifkan} </#if> <#if username ?? && username! = ''> dan nama pengguna seperti '%$ {username}%' </#if>Perbedaannya adalah '%$ {username}%', karena Freemarker juga akan memproses $ {username} dan juga akan menggantikan parameter di sini dengan nilai aktual.
Dalam kode yang disebut sebelumnya, modifikasi adalah sebagai berikut:
//#{enabled}map.put("enabled", 1);//#{userName}map.put("userName", "admin");//The sql here corresponds to ${sql}String in XML sql = "One of the two complex SQLs above";//Use Freemarker to process sqlsql = processSqlByFreemarker(sql, peta); // Masukkan SQL yang diproses di peta peta.put ("sql", "pilih * dari sysuser"+ "di mana enabled = #{diaktifkan}"+ "dan nama pengguna seperti concat ('%', #{username}, '%')"); // Execute Metode Daftar <%map> xxmper.Catatan: Metode ProcessSQLByFreeMarker adalah memproses string SQL berdasarkan data di peta, dan metode implementasi dapat dicari sendiri.
Pada titik ini, fungsi SQL dinamis yang tidak terlalu rumit diimplementasikan.
Saya ingin tahu apakah ada lebih banyak orang serakah. Apakah Anda berpikir bahwa nilai yang dikembalikan di atas adalah semua Daftar <pap> Type. Bisakah Anda mengembalikan kelas entitas yang saya tentukan?
Misalnya di peta:
peta.put ("class", "tk.mybatis.model.sysuser");Bisakah saya membuat nilai pengembalian menjadi tipe sysuser dengan cara ini? Karena artikel ini sudah terlalu lama, saya akan memberikan solusi di sini, tidak mendalam.
Anda dapat menggunakan pencegat untuk mengimplementasikannya. Setelah mendapatkan mappedstatement, salin salinannya, dan kemudian memodifikasi atribut tipe dari HasilMap di HasilMaps untuk menentukan jenis kelas untuk Anda. Sangat mudah untuk mengatakan, tetapi dalam operasi yang sebenarnya, Anda dapat memiliki sekitar 1/10 plugin paging pageHelper.
Karena artikel ini ditulis atas permintaan istri saya, jika istri saya memiliki kebutuhan terakhir ini, saya akan membantu istri saya menerapkan plug-in ini dan kemudian membagikannya.
CATATAN: Jika ini adalah pembaruan dinamis, masukkan, hapus pernyataan, Anda dapat mengubah <colly> di atas untuk memperbarui (tidak perlu menggunakan <apelete> dan <serter>), dan menggunakan int untuk nilai pengembalian, yang jauh lebih mudah daripada memilih.
Di atas adalah penjelasan terperinci tentang pernyataan SQL dinamis eksekusi Mybatis yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!