2014-04-04 9 views
5

W pliku mapującym Mybatis xml, próbowałem napisać zapytanie o aktualizację dla tabeli użytkownika, jak pokazano poniżej. Każdy parametr wejściowy może mieć wartość null i aktualizuję go tylko wtedy, gdy nie ma wartości null. Nie wiesz, który warunek "jeśli" może się przedostać i który z nich może być ostatnim, dlatego w każdym zestawieniu należy dodać przecinek.MyBatis dodatkowe przecinki w aktualizacji kwerendy

Problem polega na tym, że dodatkowe "," powoduje wyjątek zapytania. Wygląda na to, że Mybatis nie ignoruje dodatkowego przecinka.

Moim rozwiązaniem jest umieszczenie "id = # {id}" na końcu, który naprawił problem, ale jest zbędny.

Jakie jest prawdziwe rozwiązanie?

Kod:

<update id="update" parameterType="User"> 
    UPDATE user SET 

    <if test="username != null"> 
     username = #{username}, 
    </if> 
    <if test="password != null"> 
     password = #{password}, 
    </if> 
    <if test="email != null"> 
     email = #{email}, 
    </if> 
    id= #{id} // this is redundant 

    WHERE id = #{id} 
</update> 

PS: Środowisko używam jest: Java Wiosna + MyBatis + MySQL.

+0

nie jestem zaznajomiony z 'mybatis' więc wybaczyć pytanie głupie, ale dlaczego trzeba przecinek po' # {email} 'w pierwszym miejsce? –

+0

@ shree.pat18, w przypadku wiadomości e-mail == null, ale hasło! = Null, ostatnia instrukcja przed WHERE hasłem = # {hasło}, która ma dodatkowy przecinek, więc muszę dodać obejście "id = # {id} ", powodując przecinek po # {email}. –

Odpowiedz

13

Dzięki plikom mapper.xml nauczyłem się tłumić przecinki. MyBatis ma tag <set>, który usuwa ostatni przecinek. Jest również napisane w MyBatis - Dynamic Sql:

Tutaj element zestaw będzie dynamicznie poprzedzić słowa kluczowego SET i również wyeliminować wszelkie zbędne przecinki, które mogłyby Trail wartość zadania po warunkach są stosowane.

Możesz napisać go jako:

<update id="update" parameterType="User"> 
    UPDATE user 
    <set> 
     <if test="username != null"> 
      username = #{username}, 
     </if> 
     <if test="password != null"> 
      password = #{password}, 
     </if> 
     <if test="email != null"> 
      email = #{email}, 
     </if> 
    </set> 
    WHERE id = #{id} 
</update> 
+0

Awesome, to działa! Dzięki @ Yigitalp Ertem. Zaakceptowano odpowiedź i +1. BTW, w twoim kodzie, SET jest zduplikowany i powinien zostać usunięty. :) –

+0

Zapomniałem o tym podczas wklejania, dziękuję za to, zredagowałem odpowiedź. :) – yalpertem