2014-04-04 13 views
5

Nel file di mappatura Mybatis xml, ho provato a scrivere la query di aggiornamento per la tabella Utente come mostrato di seguito. Ciascuno dei parametri di input può essere nullo e viene aggiornato solo quando non è nullo. Non sai quale condizione 'se' potrebbe cadere e quale potrebbe essere l'ultima, quindi la virgola deve essere aggiunta in ogni dichiarazione.MyBatis extra comma nella query di aggiornamento

Il problema è che l'extra "," causa l'eccezione di query. Sembra che Mybatis non ignori la virgola extra.

La mia soluzione è di mettere "id = # {id}" alla fine che ha risolto il problema ma è ridondante.

Qual è la vera soluzione?

Il codice:

<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: L'ambiente che sto usando è: Java Spring + MyBatis + MySQL.

+0

io non sono a conoscenza 'mybatis' così perdonare l'domanda stupida, ma perché avete bisogno di una virgola dopo' # {email} 'nel primo posto? –

+0

@ shree.pat18, nel caso di email == null ma password! = Null, l'ultima istruzione prima di WHERE è password = # {password}, ​​che ha una virgola extra, quindi devo aggiungere la soluzione "id = # {id} ", risultante dalla virgola successiva a # {email}. –

risposta

13

Grazie ai file mapper.xml di MyBatis Generator, ho imparato a sopprimere le virgole. MyBatis ha un tag <set> che cancella l'ultima virgola. E 'anche scritto in MyBatis - Dynamic Sql:

Qui, l'elemento SET anteporre dinamicamente la parola chiave SET, e eliminare anche le virgole estranei che potrebbero TRAIL il valore vengono applicate incarichi dopo che le condizioni.

Si può scrivere come:

<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

Fantastico, funziona! Grazie a @Yigitalp Ertem. Ho accettato la risposta e +1. BTW, nel tuo codice, SET è duplicato e dovrebbe essere rimosso. :) –

+0

Dimenticato mentre si incolla, grazie per quello, ho modificato la risposta. :) – yalpertem