PENDAHULUAN: Apa itu mybatis?
(Sebelumnya iBatis) Mybatis adalah kerangka kerja lapisan kegigihan yang dapat menyesuaikan SQL, prosedur tersimpan, dan pemetaan lanjutan. Mybatis menghilangkan pengaturan manual dari hampir semua kode dan parameter JDBC dan pengambilan hasil hasil. Mybatis dapat menggunakan XML sederhana atau anotasi untuk konfigurasi dan pemetaan asli, antarmuka pemetaan dan pojos Java (objek java tua biasa) ke dalam catatan dalam database.
1. Parameter lapisan mapper adalah peta, dan lapisan layanan bertanggung jawab untuk kelebihan beban.
Karena masalah mekanisme, peta tidak dapat kelebihan beban. Parameter umumnya diatur ke peta, tetapi ini akan membuat parameter kabur. Jika Anda ingin memperjelas kode, Anda dapat mencapai tujuan kelebihan beban melalui lapisan layanan. Lapisan layanan yang disediakan untuk bagian luar kelebihan beban, tetapi metode layanan yang kelebihan beban ini sebenarnya untuk menyesuaikan mapper yang sama, tetapi parameter yang sesuai tidak konsisten.
Mungkin beberapa orang mungkin bertanya -tanya, mengapa tidak mengaturnya untuk memetakan di lapisan layanan? Saya pribadi tidak merekomendasikan ini. Meskipun saya telah mengadopsi metode ini dalam proyek saya sebelumnya untuk kenyamanan, itu jelas akan menyebabkan masalah untuk pekerjaan pemeliharaan di masa depan. Karena melakukan ini akan membuat seluruh MVC Anda mengandalkan model peta. Model ini sebenarnya sangat bagus dan nyaman untuk membangun kerangka kerja, tetapi ada masalah: hanya melihat tanda tangan metode, Anda tidak tahu jumlah, jenis, dan arti dari setiap parameter yang diwakili oleh peta.
Bayangkan saja, jika Anda hanya mengubah lapisan layanan atau lapisan DAO, Anda harus jelas tentang parameter yang dilewati oleh peta di seluruh proses. Kecuali Anda berkomentar atau memiliki dokumentasi yang baik, Anda harus memahami kode masing -masing lapisan dengan jelas sebelum Anda tahu parameter mana yang dilewati. Untuk MVC sederhana, tidak apa -apa, tetapi jika levelnya kompleks, kode akan menjadi sangat kompleks, dan jika saya menambahkan parameter, saya perlu menambahkan komentar untuk setiap lapisan. Dibandingkan dengan komentar, lebih layak untuk menggunakan tanda tangan metode untuk memastikan kemampuan kontrol kode ini, karena komentar mungkin sudah ketinggalan zaman, tetapi tanda tangan metode umumnya tidak mungkin basi.
2. Cobalah menggunakan jika pilihan dan pernyataan lain sesedikit mungkin untuk mengurangi kesulitan pemeliharaan.
Saat mengkonfigurasi SQL di MyBatis, cobalah menggunakan lebih sedikit label seperti jika memilih. Jika SQL dapat digunakan untuk menentukan penilaian, cobalah menggunakan SQL (kasus kapan, decode, dll.) Untuk pemeliharaan selanjutnya. Kalau tidak, setelah SQL membengkak, itu sangat mual. Jika Anda perlu men -debug SQL di Mybatis, Anda perlu menghapus sejumlah besar pernyataan penilaian, yang sangat merepotkan. Di sisi lain, sejumlah besar penilaian IF akan menyebabkan SQL yang dihasilkan mengandung sejumlah besar ruang, yang akan meningkatkan waktu transmisi jaringan, yang juga tidak diinginkan.
Selain itu, sejumlah besar pernyataan jika memilih, mau tidak mau, SQL yang dihasilkan akan tidak konsisten setiap kali, yang akan menyebabkan sejumlah besar penguraian oracle yang keras, yang juga tidak disarankan.
Mari kita lihat SQL seperti ini:
<code style = "Padding: 0.5em; margin: 0px; tampilan: blok; warna: rgb (101.123.131); overflow-x: auto; latar belakang: rgb (253.246.227)"> <span style = "padding: 0px; margin: 0px"> <span style = "padding: padding: 0px; margin: 0px"> <span style = "padding: padding: 0px; margin: 0px"> <span style = "PADDING: PADDING: 0PX; Warna: 133.153,0) "> Pilih </span> * <span =" padding: 0px; style = "padding: 0px; margin: 0px; warna: rgb (42.161.152)"> 1 </span> = <span style = "padding: 0px; margin: 0px; warna: rgb (42,161,152)"> 1 </span> <<span = "PAJING: 0P: 0P; 0p; 0p; Warna: 133.153,0) "> 1 </span> <<span style =" padding: 0px; style="padding:0px; margin:0px; color:rgb(42,161,152)">"startdate != null and startdate != '' and enddate != null and endate != ''"</span> <span style="padding:0px; margin:0px; color:rgb(133,153,0)">AND</span> PUBLISHTIME >= #{startDate} <span style = "padding: 0px; margin: 0px; Warna: RGB (133.153,0) "> dan </span> publishtime <= #{endDate} </ <span style =" padding: 0px; margin: 0px; Warna: RGB (133.153,0) "> Jika </span> <kinger tidak> <span style =" padding: 0px; margin: 0px; Warna: RGB (133.153,0) "> dan </span> publishtime> = <span style =" padding: 0px; margin: 0px; Warna: RGB (133.153,0) "> sysdate </span> - <span style =" padding: 0px; margin: 0px; Warna: RGB (42.161.152) "> 7 </span> <span style =" padding: 0px; margin: 0px; Warna: RGB (133.153,0) "> dan </span> publishtime <= <span style =" padding: 0px; margin: 0px; Warna: RGB (133.153,0) "> Sysdate </span> </setines> </<span style =" padding: 0px; margin: 0px; Warna: RGB (133.153,0) "> Sysdate </span> </setines> </<span style =" padding: 0px; margin: 0px; Warna: RGB (133.153,0) "> Pilih </span>> </span>Seperti itu jika penilaian sebenarnya sama sekali tidak perlu. Kami cukup menggunakan decode untuk menyelesaikan masalah nilai default:
<code style = "Padding: 0.5em; margin: 0px; tampilan: blok; warna: rgb (101.123.131); overflow-x: auto; latar belakang: rgb (253.246.227)"> <span style = "padding: 0px; margin: 0px"> <span style = "padding: padding: 0px; margin: 0px"> <span style = "padding: padding: 0px; margin: 0px"> <span style = "PADDING: PADDING: 0PX; Warna: 133.153,0) "> Pilih </span> * <span =" Padding: 0px; <span style = "padding: 0px; margin: 0px; warna: rgb (133,153,0)"> decode </span> (#{startDate}, <span style = "padding: 0px; margin: 0px"> null </span>, <span style = "padding: 0px; margin; Warna: RGB (133.153,0) "> sysdate </span>-<span style =" padding: 0px; Warna: RGB (133.153,0) "> dan </span> publishtime <= <span style =" padding: 0px; margin: 0px "> null </span>, <span style =" padding: 0px; margin: 0px; margin: 0px; Warna: RGB (133.153,0) "> sysdate </span>,#{endDate}) </span> </code>Tentu saja, beberapa orang mungkin berpikir bahwa memperkenalkan kasus kapan dan decode akan membutuhkan fungsi oracle parsing, yang akan memperlambat waktu eksekusi SQL. Siswa yang tertarik dapat kembali dan melakukan tes untuk melihat apakah akan ada dampak besar. Sejauh menyangkut pengalaman pribadi, saya tidak menemukan perlambatan di SQL karena fungsi parsing. Secara umum, operasi seperti bergabung, memesan oleh, berbeda, partasi oleh, dll., Yang umumnya terkait erat dengan desain struktur tabel. Dibandingkan dengan tingkat dampak efisiensi dari ini, dampak fungsi penguraian pada kecepatan eksekusi SQL harus diabaikan.
Poin lain adalah bahwa untuk beberapa penugasan nilai default, seperti SQL di atas, default ke tanggal saat ini, dll., Anda benar -benar dapat sepenuhnya menyebutkan lapisan layanan atau lapisan pengontrol untuk diproses. Penilaian ini harus lebih sedikit digunakan di Mybatis. Karena, dalam hal ini, sulit untuk memproses cache. Jika StartDate kosong dan menggunakan Sysdate Dinamis pada SQL, tidak mungkin untuk menentukan apa kunci Tanggal StartDate cache seharusnya. Oleh karena itu, yang terbaik adalah menangani parameter sebelum diteruskan ke mybatis, sehingga lapisan mybatis juga dapat mengurangi beberapa jika memilih pernyataan, dan juga nyaman untuk pemrosesan cache.
Tentu saja, tidak mutlak untuk tidak digunakan jika memilih. Terkadang, untuk mengoptimalkan SQL, jika harus diselesaikan, seperti pernyataan sejenisnya. Tentu saja, seperti umumnya tidak dianjurkan. Namun, jika ada skenario untuk digunakan, hapus seperti setiap kali Anda tidak perlu menggunakannya, seperti menanyakan judul artikel untuk meningkatkan efisiensi kueri. Cara terbaik adalah dengan menggunakan mesin pencari seperti Lucence untuk menyelesaikan masalah pengindeksan teks lengkap ini.
Secara umum, jika dan memilih untuk menilai cabang tidak mungkin untuk dihapus sepenuhnya, tetapi disarankan untuk menggunakan metode SQL asli untuk menyelesaikan beberapa masalah dinamis, daripada mengandalkan sepenuhnya pada mybatis untuk menyelesaikan penilaian cabang dinamis, karena cabang penilaian terlalu kompleks dan sulit untuk dipertahankan.
3. Ganti komentar SQL dengan komentar XML.
Cobalah untuk tidak mempertahankan komentar Mybatis Central SQL. Komentar akan menyebabkan beberapa masalah. Jika Anda perlu menggunakan komentar, Anda dapat menggunakan <!--> di XML untuk menganotasi untuk memastikan bahwa tidak akan ada anotasi SQL di SQL yang dihasilkan, sehingga mengurangi kemungkinan masalah. Keuntungan lain dari melakukan ini adalah bahwa ia dapat dengan jelas membedakan anotasi dari SQL di IDE.
Sekarang mari kita bicara tentang masalah yang disebabkan oleh komentar. Dalam sebuah proyek yang sedang saya kerjakan, komponen pagination didasarkan pada mybatis. Ini akan menempatkan lapisan lain dari Pilihan Pilihan (*) Rownum_ dari (......) di luar skrip SQL yang Anda tulis untuk menghitung jumlah total catatan. Pada saat yang sama, ada pilihan lain yang terpilih * dari (...) di mana Rownum> 10 dan ronnum <10 * 2 menghasilkan informasi paging. Jika ada komentar pada baris terakhir dalam skrip Anda, bagian yang ditambahkan akan menjadi bagian dari komentar dan kesalahan akan dilaporkan. Selain itu, beberapa kondisi juga dapat menyebabkan beberapa kondisi diabaikan, seperti yang berikut:
<code style = "padding: 0.5em; margin: 0px; display: blok; warna: rgb (101.123.131); overflow-x: auto; latar belakang: rgb (253.246.227)"> <span style = "padding: 0px; margin: 0px; warna: rentang span (133); style = "padding: 0px; margin: 0px; warna: rgb (133.153,0)"> dari </span> tes <span style = "padding: 0px; margin: 0px; warna: rgb (133,153,0)"> di mana </span> col1> <span style = "Packding: 0px: 0px: 0px: 0px: 0px: 0px: 0px: 0px: 0px: 0px: 0px: 0px: 0px: 0px; Warna: 42.161.152) "> 1 </span> - Berikut ini adalah komentar << span =" padding: 0px; A! = '" '"</span> <span style =" padding: 0px; Margin: 0px "> Jika </span>> </span> </code>
Bahkan jika ada parameter yang sesuai dalam parameter yang diteruskan, sebenarnya tidak akan ada efek, karena konten berikut sebenarnya sepenuhnya dikomentari. Kesalahan semacam ini sulit dideteksi tanpa pengujian yang ketat. Secara umum, komentar XML sepenuhnya dapat menggantikan komentar SQL, jadi perilaku ini harus dilarang.
4. Gunakan #{} jika memungkinkan, bukan $ {}.
Cobalah untuk tidak menggunakan $ {} di mybatis. Sangat nyaman untuk melakukan ini. Namun, ada masalah bahwa sejumlah besar penggunaan akan menyebabkan penguraian oracle yang keras, memperlambat kinerja basis data. Semakin lama kinerja basis data, semakin buruk kinerja basis data. Untuk pemrosesan umum beberapa string INS, Anda dapat merujuk ke solusi berikut: http://www.myexception.cn/sql/849573.html, yang pada dasarnya dapat menyelesaikan sebagian besar $ {}.
Mengenai $ {}, penyalahgunaan lain seperti. Saya memiliki kasus lain di sini: misalnya, beberapa menu pohon, node akan dirancang sebagai '01', '0101', dan node dua-bit digunakan untuk membedakan hierarki. Pada saat ini, jika Anda perlu menanyakan semua node di bawah simpul 01, SQL paling sederhana adalah: Pilih * dari pohon di mana id like '01%'. Jenis SQL ini benar -benar dapat dimengerti, karena juga dapat menggunakan indeks, sehingga tidak memerlukan pemrosesan khusus, gunakan saja secara langsung. Tetapi jika itu adalah judul artikel, Anda perlu memberikan perhatian ekstra: Pilih * dari t_news_text di mana judul seperti '%Osc%', ini bukan cara untuk menggunakan pengindeksan. Seperti disebutkan di atas, yang terbaik adalah menggunakan pencarian teks lengkap. Tetapi jika Anda tidak dapat melakukannya tanpa suka, Anda perlu memperhatikan metode penggunaan: id like #{id} || '%' Alih -alih id suka '$ {id}%' untuk mengurangi kemungkinan penguraian keras.
Beberapa orang berpikir bahwa menggunakan || akan meningkatkan waktu untuk pemrosesan Oracle. Saya pikir jangan menganggap Oracle terlalu bodoh. Meskipun kadang -kadang benar -benar bodoh, Anda dapat meringkas sampah dan bukan sampah ketika Anda punya waktu, tetapi setelah sedikit tes, Anda akan tahu bahwa metode koneksi ini harus sangat ramping untuk penguraian dan pelaksanaan seluruh SQL.
Tentu saja, ada beberapa kasus khusus yang tidak dapat ditangani, seperti injeksi dinamis nama kolom, nama tabel, dll. Untuk situasi ini, sulit dan tidak ada cara yang lebih nyaman ditemukan. Karena situasi ini cenderung terjadi, menggunakan $ {} tidak akan memiliki dampak besar. Tentu saja, jika Anda memiliki morbiditas kode, Anda dapat menggunakan mekanisme eksekusi SQL dinamis Oracle segera, sehingga Anda dapat sepenuhnya menghindari kemungkinan $ {}. Ini akan memperkenalkan model yang lebih kompleks, dan saat ini, Anda perlu membuat pilihan.
Menanggapi masalah yang disebabkan oleh SQL dinamis di atas, cara yang paling radikal adalah dengan menggunakan prosedur tersimpan dan menyelesaikannya dengan cara asli database untuk memfasilitasi pengembangan dan debugging. Tentu saja, ini juga akan membawa masalah: akan ada persyaratan yang lebih tinggi untuk pengembang, manajemen prosedur tersimpan, dll. Proyek saya belum mengadopsi metode ini, jadi saya tidak akan berkembang lebih banyak di sini.
5. Penggunaan Mybatis yang sederhana.
Fungsi Mybatis relatif lemah, dan tidak memiliki banyak perpustakaan tambahan yang diperlukan, pemrosesan string, dll., Dan juga sulit untuk diperluas, sehingga umumnya dimungkinkan untuk memproses beberapa pengembalian. Oleh karena itu, yang terbaik adalah menggunakannya sebagai file konfigurasi SQL sederhana dan kerangka kerja ORM sederhana. Jangan mencoba melakukan terlalu banyak SQL dinamis di mybatis, jika tidak itu akan menyebabkan pemeliharaan selanjutnya menjadi sangat menjijikkan.
Di atas adalah ringkasan pembelajaran mybatis yang diperkenalkan editor kepada Anda. 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!