Mybatis adalah kerangka kerja lapisan abadi yang sangat populer di industri ini. Ringan dan mudah digunakan. Ini benar -benar memimpin di bidang TI keuangan. Ini lebih populer daripada Hibernate, dengan banyak keunggulan dan juga layak dipelajari. Tapi Mybatis tidak sempurna, dan desain serta pengkodeannya sendiri masih memiliki banyak kekurangan, bahkan cacat. Artikel ini secara singkat membahas cacat ini:
1.Mybatis menggunakan DTD sebagai file verifikasi untuk file konfigurasi XML, tetapi jelas bahwa DTD hampir merupakan teknologi yang dihapus. Ini memiliki fungsi yang sangat terbatas, skalabilitas yang sangat buruk, skalabilitas yang sangat buruk, skalabilitas yang sangat buruk, dan keterbacaan yang buruk. Musim semi dapat berubah dengan indah dari DTD ke XSD, tetapi Mybatis tidak pernah memiliki keberanian ini.
2. Jika kompatibilitas versi tidak dilakukan dengan baik, ambil 3.3.0 -> 3.4.0 sebagai contoh. Menurut spesifikasi umum industri, nomor versi tingkat kedua dapat ditingkatkan, dan fungsi dapat ditambahkan, tetapi kompatibilitas mundur harus dipastikan. Namun, pendekatan Mybatis tidak persis seperti ini. Lihatlah metode utama dari Pernyataan Tulisan untuk mempersiapkan:
// 3.3.0Statement Siapkan (koneksi koneksi) melempar SQlexception; // 3.4.0Statement Persiapan (koneksi koneksi, integer transactionTimeout) melempar SQLException;
Tidak ada metode yang ditambahkan di sini, tetapi parameter ditambahkan langsung ke metode asli! Ada banyak contoh serupa, jadi saya tidak akan mencantumkannya satu per satu.
3. Plug-in MyBatis menggunakan antarmuka interseptor umum, disertai dengan anotasi seperti @Intercepts dan @Signature untuk mengimplementasikan beberapa metode intersepsi beberapa komponen. Tampaknya sangat fleksibel. Menurut pendapat saya, strukturnya sebenarnya tidak cukup jelas. Selama pengembangan aktual, apakah Anda akan menempatkan peningkatan intersepsi dari Pernyataan Pengkhotbah dan Hasilishandler dalam satu kelas? Bukankah itu benar (ya? Apakah Anda prinsip tanggung jawab tunggal dan prinsip pembukaan dan penutupan semua?), Jadi mengapa perlu memaksa antarmuka yang sama?
Selain itu, gunakan anotasi @Signature untuk menentukan metode komponen yang perlu dicegat. Jika anotasi salah, kompilasi tidak akan melaporkan kesalahan. Anda hanya bisa menunggu sampai dijalankan untuk menemukannya. Mari kita lihat contoh di atas:
Misalkan saya menerapkan plugin untuk versi 3.3.0:
@Intercepts ({@Signature (type = Sympnandler.class, Method = "mempersiapkan", args = {connection.class})}) Pernyataan kelas publik. ini);}@overridepublic void setProperties (properti properti) {}}Kemudian, ditingkatkan menjadi 3.4.0. Akibatnya, kompilasi itu normal, tetapi ketika dijalankan, pengecualian dilemparkan.
4. Cache Mybatis tidak berguna, dan terlepas dari apakah ada konfigurasi, perlu menggunakan cache atau memperbarui cache, perlu menghitung cacheKey. Jika tidak ada cache atau perbarui cache, perhitungan ini limbah.
5. Untuk eksekusi batch mybatis, lihat contoh JDBC berikut:
public void testjdbcbatch (Connection Conn) melempar Exception {try {conn.setAutocommit (false); batchupdate (conn); cleartestdata (conn); conn.Commit (); conn.setAutocommit (true);} colore (pengecualian e) {Conn.rollback (); throw e; Sqlexception {disiapkan ps = null; coba {ps = conn.preparestatement ("hapus table_name1 di mana field_name1 =?"); Ps.setstring (1, "test"); int d = ps.executeUpdate (); System.out.println ("delete counts:" + de); E) {}}} private void batchUpdate (koneksi Conn) melempar sqlexception {disiapkan ps = null; coba {string sql = "masukkan ke table_name2 (field_name1, field_name2, field_name2 nilai (?, i++){String random = RandomStringUtils.randomAlphabetic(8);ps.setString(1, "TEST");//FIELD_NAME1ps.setString(2, "Data" + random);//FIELD_NAME2ps.setString(3, "Parameter" + random);//FIELD_NAME3ps.addBatch();}int[] rs = ps.executeBatch ();} akhirnya {coba {ps.close ();} catch (exception e) {}}}Kode tidak memiliki rasa ketidaksesuaian, dapat dieksekusi secara normal, dan juga dapat mundur seperti yang diharapkan. Dengan kata lain, koneksi yang sama dalam transaksi yang sama dapat menjalankan SQL dan batch biasa secara bersamaan, tetapi Anda mencobanya dalam SQLSession dari transaksi yang sama, dan apa yang Anda umpan balik kepada Anda adalah bahwa Anda tidak dapat mengubah metode eksekusi dalam transaksi yang sama!
6. Kompatibilitas Produk Basis Data: Mybatis menyerahkan kendali SQL kepada pengembang, sehingga secara moral menempati ketinggian yang memerintah - apa yang Anda tulis tidak kompatibel, itu adalah level Anda sendiri! Tapi apakah ini pose yang tepat untuk bingkai yang sangat bagus? Mengapa implementasi kompatibel tambahan tidak dapat disediakan? Misalnya, jika fungsi decode, yang dianggap sebagai dewa di Oracle, dapatkah itu disediakan dengan tag <codeS> di SQLMapper dan secara diam -diam dimodifikasi menjadi kasus ketika nanti? Dengan kata lain, tidak masalah jika pejabat tidak menyediakannya, tetapi Anda harus memberikan metode ekspansi, jadi saya kembali ke: skalabilitasnya sangat buruk, skalabilitasnya sangat buruk, dan skalabilitasnya sangat buruk. Saya mengatakan hal -hal penting tiga kali, tetapi saya telah mengatakannya enam kali.
Di atas adalah cacat mybatis yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda!