MyBatis中的動態sql

1. 動態sql

動態sql是mybatis中的一個核心,什麼是動態sql?動態sql即對sql語句進行靈活操做,經過表達式進行判斷,對sql進行靈活拼接、組裝。就拿上一篇博文中對用戶的綜合查詢一例來講:sql

select * from user where user.sex = #{user.sex} and user.username like '%${user.username}%'

假如這個user是null咋整?或者user.sex或者user.username爲null呢?因此更嚴謹的作法應該是在執行這個語句以前要先進行判斷纔對,確保都不爲空,那麼我再去查詢。這就涉及到了mybatis中的動態sql了。
在mybatis中,動態sql可使用標籤來表示,這很相似於jstl表達式,咱們能夠將上面的sql語句改爲動態sql,以下:
mybatis

<select id="findUserList" parameterType="mybatis.po.UserQueryVo" resultType="mybatis.po.User"> select * from user <!-- where能夠自動去掉條件中的第一個and --> <where> <if test="user!=null"> <if test="user.sex!=null and user.sex!=''"> and user.sex = #{user.sex} </if> <if test="user.username!=null and user.username!=''"> and user.username like '%${user.username}%' </if> </if> </where> </select>

上面的代碼很好理解,主要就是加了一些判斷,條件不爲空,才進行查詢條件的拼接,讓mybatis動態的去執行。那麼在測試代碼中,咱們能夠故意的將user.sex不賦初值,就能夠看到查詢的結果是不同的。測試

2. sql片斷

那麼如今還有個問題,若是好幾個statement都須要這樣作,並且動態sql部分都同樣,這就會致使一些代碼的重複,因此若是遇到這種狀況,咱們就應該抽取,動態sql也能夠抽取,咱們能夠將動態的這部分sql抽取成sql片斷,而後在具體的statement中引用進來便可。以下:spa

相關文章
相關標籤/搜索