Pada artikel sebelumnya, saya memperkenalkan perbedaan antara parameter # {} dan $ {} dan perbedaan antara # dan $ di mybatis. Jika Anda membutuhkannya, Anda dapat merujuknya.
$ dan # Deskripsi Sederhana:
# setara dengan menambahkan kutipan ganda ke data, dan $ setara dengan secara langsung menampilkan data.
1. Ringkasan
Saat menggunakan SQLMAP untuk kueri SQL di Mybatis, sering kali perlu untuk secara dinamis meneruskan parameter. Dynamic SQL adalah salah satu fitur kuat mybatis dan alasan penting mengapa itu lebih unggul dari kerangka kerja ORM lainnya. Sebelum mengkompilasi pernyataan SQL, mybatis akan secara dinamis mengurai SQL dan menguraikannya menjadi objek BoundSQL, yang juga diproses di sini. Pada tahap parsing SQL dinamis, #{} dan $ {} akan memiliki kinerja yang berbeda, dan #{} akan diuraikan ke dalam penanda parameter untuk pernyataan yang dikompilasi JDBC.
A #{} diuraikan menjadi placeholder parameter? . $ {} hanyalah penggantian string murni, dan penggantian variabel akan dilakukan selama tahap parsing SQL dinamis.
2. Deskripsi bug
Parameter front-end:
Lewati: 0
Ambil: 10
RUTERENAME: A, B, c
Pemrosesan Lapisan Bisnis:
Paket sql;/*** Escape front-end multi-select parameter sebagai konten pernyataan sql*/kelas publik sqlutil {private final static string replacechar_comoma = ","; string statis final private replacechar_semicolon = ";"; public static void main (string [] args) {string s1 = ""; "ABC"; System.out.println ("Dipisahkan Comma:" + FormatTRSTR (S1)); System.out.println ("Dipisahkan Space:" + FormatIntr (S2));} String Statis Private (string querystr) {return queryInstr (SliptQueryStr Private (Querystred) {return queryInstr (SliptQueryStr (SliptQuerstrystr) {querystrystr) {queryStr sliptQuerSTR (SLIPTRIATIC (SLIPTRIATIC) {if (null == querystr || "" .Equals (querystr.trim ())) mengembalikan null; querystr = querystr.replaceall (sqlutil.replacechar_comma, ") .replaceall (replacechar_semicolon," "); return querystr (Squery" soRPLACEL (SUBLACECED (SIFECHAR_SEMICOLON, ""); queryInstr (string [] queryStrs) {if (null == querystrs || 0 == querystrs.length) return null; stringBuffer buf = new StringBuffer (); for (int i = 0; i <querystrs.length; i ++) {if (i! = 0) buf.append (","); buf.append ("'"). append (querystrs [i]). append ("'");} return buf.toString ();}} Pemrosesan Lapisan Mapper:
// Penanganan kesalahan <if test = "RuleName! = Null dan ruleName! = ''"> Dan a.rule_name in (#{ruleName}) </if> // penanganan yang benar <if test = "ruleName! = Null dan ruleName! = ''"> Dan a.rule_name in ($ {$ {rulename}) </if> if> Deskripsi Log:
[DEBUG] [2016-08-02 17:42:42.226] [qtp1457334982-157] java.sql.Connection - ==> Preparing: SELECT a.id, a.is_valid, a.rule_lable, a.rule_name, a.type, b.sp_id, b.sp_name, a.rule_content, c.user_name, a.gmt_modified, A. memesan dari idc_logistics_assign_rules gabung kiri app_user c pada c.work_no = a.modifier dan c.is_deleted = 'n', idc_sp_info b lime a. ? [Debug] [2016-08-02 17: 42: 42.226] [qtp1457334982-157] java.sql.preparedstatement-==> parameter: 'a', 'b' (string), 0 (integer), 10 (integer)
Analisis Hasil: Lapisan mapper telah dikompilasi SQL, dan ada placeholder untuk #? , tetapi akan diganti secara langsung untuk $.
PS: Saat menggunakan pesanan dengan parameter dinamis saat menyortir mybatis, Anda perlu memperhatikan penggunaan $ bukan #
Penggantian string
Secara default, menggunakan sintaks format #{} menyebabkan mybatis membuat properti pernyataan preproses dan menetapkan nilai yang aman dengannya sebagai latar belakang (seperti?). Ini aman dan cepat, dan kadang -kadang Anda hanya ingin memasukkan string yang tidak berubah langsung ke pernyataan SQL. Misalnya, seperti pesanan oleh, Anda dapat menggunakannya seperti ini:
Salinan kode adalah sebagai berikut:
Pesan dengan $ {ColumnName}
Di sini mybatis tidak akan memodifikasi atau melarikan diri dari string.
Penting: Tidak aman untuk menerima output konten dari pengguna dan memberikannya ke string yang tidak berubah dalam pernyataan tersebut. Ini dapat menyebabkan potensi serangan injeksi SQL, jadi Anda tidak boleh mengizinkan pengguna untuk memasuki bidang ini, atau biasanya melarikan diri dan memeriksanya sendiri.