Mysql
 sql >> база данни >  >> RDS >> Mysql

Използване на MyBatis enum

Работих по този въпрос от няколко ъгъла и ето моите констатации. Предупреждение:Направих всички тези разследвания, използвайки MyBatis-3.1.1, така че нещата може да са се държали различно в по-ранните версии.

Първо, MyBatis има вграден EnumTypeHandler . По подразбиране всеки път, когато посочите изброяване на Java като resultType или parameterType, това ще се справи с този тип. За заявки, когато се опитва да преобразува запис от база данни в изброяване на Java, EnumTypeHandler приема само един аргумент и се опитва да търси стойността за изброяване на Java, която съответства на тази стойност.

Един пример ще илюстрира по-добре. Да предположим, че вашата заявка по-горе връща 2 и "Ready" когато предам "Ready" като аргумент. В този случай получавам съобщението за грешка No enum constant com.foo.Status.2 . Ако обърна реда на вашия оператор SELECT да бъде

SELECT ls.name, ls.id

тогава съобщението за грешка е No enum constant com.foo.Status.Ready . Предполагам, че можете да заключите какво прави MyBatis. Обърнете внимание, че EnumTypeHandler игнорира втората стойност, върната от заявката.

Промяна на вашата заявка на

SELECT UPPER(ls.name)

го кара да работи:изброяването Status.READY се връща.

След това се опитах да дефинирам моя собствен TypeHandler за изброяването на Status. За съжаление, както при EnumTypeHandler по подразбиране , можех да получа само една от стойностите (идентификатор или име), за да се позова на правилния Enum, а не и двете. Така че, ако идентификационният номер на базата данни не съвпада със стойността, която сте кодирали по-горе, тогава ще имате несъответствие. Ако гарантирате, че идентификаторът на базата данни винаги съвпада с идентификатора, който сте посочили в изброяването, тогава всичко, което ви трябва от базата данни, е името (преобразувано в главни букви).

Тогава си помислих, че ще стана хитър и ще внедря MyBatis ObjectFactory, ще взема както int id, така и String име и се уверя, че те са съпоставени в Java enum, който предавам обратно, но това не работи, тъй като MyBatis не извиква ObjectFactory за Java enum тип (поне аз не можах да го накарам да работи).

Така че моето заключение е, че изброяванията на Java в MyBatis са лесни, стига просто трябва да съпоставите името от базата данни с името на константата на enum - или използвайте вградения EnumTypeHandler, или дефинирайте свой собствен, ако правите UPPER(name) в SQL не е достатъчен, за да съответства на имената на изброяване на Java. В много случаи това е достатъчно, тъй като изброената стойност може да бъде просто ограничение за проверка на колона и има само единичната стойност, но не и идентификатор. Ако трябва също да съпоставите int id, както и име, след това направете идентификаторите да съвпадат ръчно, когато настройвате изброяването на Java и/или записи в базата данни.

И накрая, ако искате да видите работещ пример за това, вижте коан 23 от моите коани MyBatis тук:https://github.com/midpeter444/mybatis-koans . Ако просто искате да видите моето решение, погледнете в директорията completed-koans/koan23. Там също имам пример за вмъкване на запис в базата данни чрез Java enum.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLSTATE[HY000] [1045] Достъпът е отказан за потребител 'username'@'localhost' с помощта на CakePHP

  2. недефиниран метод `eq' за nil:NilClass с rails 3 и ruby ​​enterprise на ubuntu hardy

  3. MySQL, как да вмъкнете нулеви дати

  4. Как да конвертирате времето в часовата зона на iPhone устройството?

  5. MySQL LIKE + php sprintf