Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Penggunaan enum MyBatis

Saya telah mengerjakan pertanyaan ini dari beberapa sudut dan inilah temuan saya. Peringatan:Saya melakukan semua investigasi ini menggunakan MyBatis-3.1.1, jadi hal-hal mungkin berperilaku berbeda di versi sebelumnya.

Pertama, MyBatis memiliki EnumTypeHandler bawaan . Secara default, setiap kali Anda menentukan enum Java sebagai resultType atau parameterType, inilah yang akan menangani tipe tersebut. Untuk kueri, saat mencoba mengonversi catatan database menjadi enum Java, EnumTypeHandler hanya mengambil satu argumen dan mencoba mencari nilai enum Java yang sesuai dengan nilai tersebut.

Sebuah contoh akan lebih baik menggambarkan. Misalkan kueri Anda di atas mengembalikan 2 dan "Ready" ketika saya memasukkan "Siap" sebagai argumen. Dalam hal ini, saya mendapatkan pesan kesalahan No enum constant com.foo.Status.2 . Jika saya membalik urutan pernyataan SELECT Anda menjadi

SELECT ls.name, ls.id

maka pesan kesalahannya adalah No enum constant com.foo.Status.Ready . Saya berasumsi Anda dapat menyimpulkan apa yang dilakukan MyBatis. Perhatikan bahwa EnumTypeHandler mengabaikan nilai kedua yang dikembalikan dari kueri.

Mengubah kueri Anda menjadi

SELECT UPPER(ls.name)

menyebabkannya berfungsi:enum Status.READY dikembalikan.

Jadi selanjutnya saya mencoba mendefinisikan TypeHandler saya sendiri untuk Status enum. Sayangnya, seperti EnumTypeHandler default , saya hanya bisa mendapatkan salah satu nilai (id atau nama) untuk mereferensikan Enum yang benar, bukan keduanya. Jadi jika id database tidak sesuai dengan nilai yang Anda hardcode di atas, maka Anda akan memiliki ketidakcocokan. Jika Anda memastikan bahwa database id selalu cocok dengan id yang Anda tentukan di enum, maka yang Anda butuhkan dari database adalah nama (dikonversi menjadi huruf besar).

Kemudian saya pikir saya akan menjadi pintar dan mengimplementasikan ObjectFactory MyBatis, ambil int id dan nama String dan pastikan itu cocok di enum Java yang saya berikan kembali, tetapi itu tidak berhasil karena MyBatis tidak memanggil ObjectFactory untuk Jenis enum Java (setidaknya saya tidak bisa membuatnya bekerja).

Jadi kesimpulan saya adalah bahwa enum Java di MyBatis mudah selama Anda hanya perlu mencocokkan nama dari database ke nama konstanta enum - gunakan EnumTypeHandler bawaan atau tentukan sendiri jika melakukan UPPER(nama) di SQL tidak cukup untuk mencocokkan nama enum Java. Dalam banyak kasus, ini sudah cukup, karena nilai yang disebutkan mungkin hanya berupa batasan pemeriksaan pada kolom dan hanya memiliki nilai tunggal, bukan id juga. Jika Anda juga perlu mencocokkan id int serta nama, maka buat ID tersebut cocok secara manual saat menyiapkan entri Java enum dan/atau basis data.

Terakhir, jika Anda ingin melihat contoh kerja dari ini, lihat koan 23 dari koan MyBatis saya di sini:https://github.com/midpeter444/mybatis-koans . Jika Anda hanya ingin melihat solusi saya, lihat di direktori complete-koans/koan23. Saya juga punya contoh memasukkan catatan ke dalam database melalui enum Java.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Akses ditolak untuk pengguna 'root'@'localhost' dengan PHPMyAdmin

  2. Bagaimana cara mendapatkan ID Variasi Woocommerce?

  3. Bisakah saya mendeteksi dan menangani Peringatan MySQL dengan PHP?

  4. ubah mesin default mysql menjadi innodb

  5. Perbarui tabel MySQL dengan peringkat rekor dalam grup