Saya telah menggunakan mybatis baru -baru ini. Saya telah menggunakan iBatis sebelumnya. Secara keseluruhan, ini serupa, tetapi saya masih mengalami banyak masalah. Saya akan merekamnya lagi.
Biarkan saya pertama kali memperkenalkan perbedaan antara #{} dan $ {} di mybatis, sebagai berikut:
1. # Perlakukan semua data yang masuk sebagai string, dan tambahkan kutipan ganda ke data yang masuk secara otomatis. Misalnya: Pesan dengan #user_id #, jika nilai yang dilewati adalah 111, maka nilai saat mem -parsing ke SQL dipesan oleh "111". Jika nilai yang dilewati adalah ID, parsed ke SQL adalah pesanan dengan "ID".
2. $ Menampilkan data yang diteruskan secara langsung dan menghasilkannya di SQL. Misalnya: Pesan dengan $ user_id $, jika nilai yang dilewati adalah 111, maka nilai saat diuraikan ke SQL adalah pesanan oleh user_id. Jika nilai yang dilewati adalah ID, parsed ke SQL adalah pesanan oleh ID.
3. Metode # dapat sangat mencegah injeksi SQL.
4. Metode $ tidak dapat mencegah injeksi SQL.
5. Metode $ umumnya digunakan untuk lulus dalam objek database, seperti meneruskan nama tabel.
6. Umumnya, jika Anda dapat menggunakan #, jangan gunakan $.
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:
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.
Deskripsi mybatis itu sendiri:
String SubstitutionBy Default, menggunakan sintaks #{} akan menyebabkan mybatis menghasilkan properti yang disiapkan dan mengatur nilai -nilai dengan aman terhadap parameter yang disiapkan (misalnya?). Meskipun ini lebih aman, lebih cepat dan hampir selalu lebih disukai, kadang -kadang Anda hanya ingin secara langsung menyuntikkan string yang tidak dimodifikasi ke dalam pernyataan SQL. Misalnya, untuk dipesan, Anda dapat menggunakan sesuatu seperti ini: memesan dengan $ {columnName} di sini mybatis tidak akan memodifikasi atau melarikan diri dari string. Catatan tidak aman untuk menerima input dari pengguna dan memasoknya ke pernyataan yang tidak dimodifikasi dengan cara ini. Hal ini menyebabkan serangan injeksi SQL potensial dan oleh karena itu Anda harus melarang input pengguna di bidang ini, atau selalu melakukan pelarian dan cek Anda sendiri. Dari atas, kita dapat melihat:
1. Gunakan sintaks format #{} untuk menggunakan pernyataan persiapan di mybatis untuk mengatur nilai dengan aman, dan menjalankan SQL mirip dengan yang berikut:
Disiapkan ps = conn.preparestatement (sql); ps.setint (1, id);
Manfaatnya adalah: lebih aman, lebih cepat, dan biasanya praktik yang disukai.
2. Tapi kadang -kadang Anda hanya ingin memasukkan string yang tidak berubah langsung ke pernyataan SQL. Misalnya, seperti pesanan oleh, Anda dapat menggunakannya seperti ini:
Pesan dengan $ {ColumnName} Pada saat ini, mybatis tidak akan memodifikasi atau melarikan diri dari string.
Metode ini mirip dengan:
Pernyataan st = conn.createStatement (); hasil rs = st.executeQuery (sql);
Kerugian dari metode ini adalah:
Tidak aman menerima output konten dari pengguna dan memberikan string yang tidak berubah dalam pernyataan dengan cara ini, menghasilkan potensi serangan injeksi SQL, sehingga pengguna tidak diizinkan untuk memasukkan bidang ini atau melarikan diri dan memverifikasi sendiri.