Saya telah menggunakan kerangka ORM mybatis, dan saya telah menggunakan beberapa fungsi umum di mybatis. Saat ini, dalam pengembangan proyek, ada bisnis yang mengharuskan pembatasan pengguna dari query bidang dalam tabel tertentu dan apakah bidang tertentu ditampilkan, seperti bidang tertentu dalam tabel tertentu tidak diizinkan untuk ditanyai oleh pengguna. Dalam hal ini, perlu membangun SQL untuk secara dinamis meneruskan nama tabel dan nama lapangan. Sekarang saya akan merangkum solusinya, dan saya harap ini akan membantu bagi mitra saya yang mengalami masalah yang sama.
Dynamic SQL adalah salah satu fitur kuat mybatis. Sebelum membuat sebelumnya pernyataan SQL, mybatis akan secara dinamis mengurai SQL dan menguraikannya menjadi objek BoundSQL, yang juga diproses di sini. Pertama -tama mari kita terbiasa dengan penggunaan #{} dan $ {} di mybatis:
Dalam proses parsing SQL dinamis, efek #{} dan $ {} berbeda:
#{} diuraikan sebagai penanda parameter untuk pernyataan JDBC yang dikompilasi.
Seperti yang ditunjukkan dalam pernyataan SQL berikut
pilih * dari pengguna where name = #{name};Akan diuraikan sebagai:
Pilih * dari pengguna where name = ?;
Bisakah Anda melihat #{} diuraikan ke dalam placeholder parameter? .
$ {} hanyalah penggantian string murni. Penggantian variabel akan dilakukan selama tahap parsing SQL dinamis, seperti pernyataan SQL berikut:
pilih * dari pengguna where name = $ {name};Ketika kita melewati parameter "sprite", SQL akan mengurai sebagai:
Pilih * dari pengguna where name = "sprite";
Anda dapat melihat bahwa pernyataan SQL sebelum prekompilasi tidak lagi berisi nama variabel.
Singkatnya, tahap penggantian variabel $ {} ada dalam tahap parsing SQL dinamis, sedangkan penggantian variabel #{} ada di DBMS.
Perbedaan antara #{} dan $ {} dapat diringkas hanya sebagai berikut:
#{} Memperlakukan parameter yang diteruskan sebagai string dan menambahkan kutipan ganda ke parameter yang diteruskan
$ {} akan secara langsung menampilkan parameter yang diteruskan di SQL, dan tidak ada kutipan yang akan ditambahkan
#{} dapat mencegah injeksi SQL di Chengdu, tetapi $ {} tidak dapat mencegah injeksi SQL
$ {} telah digantikan oleh variabel sebelum kompilasi, yang menimbulkan risiko injeksi SQL. Sebagai berikut SQL
Pilih * dari $ {tableName} where name = $ {name}Jika tableName parameter yang dilewatkan adalah pengguna; hapus pengguna; -, lalu setelah SQL Dynamic Parsing, SQL sebelum kompilasi akan menjadi:
Pilih * dari pengguna; hapus pengguna; - Di mana nama = ?;
-Pernyataan selanjutnya tidak akan berfungsi sebagai komentar, dan teman-teman saya dan saya terpana! Lai Lai Apakah Anda melihat bahwa pernyataan kueri asli sebenarnya secara diam -diam berisi SQL yang menghapus data tabel, yaitu untuk menghapus, menghapus, menghapus! Lai Lai Saya mengatakan hal -hal penting tiga kali, dan Anda dapat membayangkan betapa hebatnya risiko ini.
$ {} umumnya digunakan untuk mentransfer nama tabel, nama bidang, dll. Dari database.
Cobalah untuk tidak menggunakan $ {} di mana Anda dapat menggunakan #{}
Pergi ke topik, melalui analisis di atas, saya yakin Anda mungkin memiliki beberapa ide tentang cara memanggil nama tabel dan nama lapangan secara dinamis. Contohnya adalah sebagai berikut:
<pilih id = "getUser" resultType = "java.util.map" parameTerType = "java.lang.string" pernyataantype = "pernyataan"> pilih $ {kolom} dari $ {tableName} di mana company_remark = $ {company} </pilih>Untuk mengimplementasikan nama tabel panggilan dinamis dan nama lapangan, prekompilasi tidak dapat digunakan. Anda perlu menambahkan pernyataantype = "pernyataan" ".
Pernyataan: Pernyataan apa pun (yang tidak disusun), disiapkan (prakompilasi) atau dapat dipanggil, yang menyuruh Mybatis untuk menggunakan pernyataan, disiapkan atau callablestatement masing-masing. Default: disiapkan. Jelas, prekompilasi tidak dapat digunakan di sini, itu harus diubah menjadi non-kompilasi.
Kedua, nilai variabel dalam SQL adalah $ {xxx}, bukan #{xxx}.
Karena $ {} adalah untuk secara langsung menampilkan parameter yang diteruskan untuk menghasilkan SQL, misalnya, parameter yang diteruskan dalam $ {xxx} adalah data string, tanda kutip harus ditambahkan sebelum parameter dilewatkan, seperti: seperti:
String name = "sprite"; name = "''" + name + "'";
Meringkaskan
Di atas adalah solusi untuk nama tabel panggilan dinamis Mybatis dan nama bidang 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!
Artikel ini direproduksi dari: http://www.yuanrengu.com/index.php/mybatis1021.html