MyBatis之動態sql語句
一、if
if是mybatis動態SQL中的判斷元素,這個有點類似於Java的if語句,不同的是這裡的if一般常和test配合使用。if標籤一般用於非空驗證,如下例,若id為空,if標籤裡的程式碼,將不會執行,反之,則會執行中
<select id="getUser" resultMap="u" parameterType="String"> select * from user <if test="address!=null and address !=''"> WHERE address LIKE concat('%',#{address},'%') </if> </select>
二、set
set是我們在更新表的時候使用的元素,通過set元素,我們可以逐欄位的修改一條資料
在set元素中,如果遇到了逗號,系統會自動將之去除
<update id="update"> UPDATE user <set> <if test="username!=null"> user_name=#{username}, </if> <if test="password!=null"> password=#{password} </if> </set> WHERE id=#{id} </update>
三、if+where
在新增查詢條件的時候,經常在查詢條件之前都先添加了where 1=1,後面直接在這之後再追加and什麼什麼的。
這個“where”標籤會知道如果它包含的標籤中有返回值的話,它就插入一個‘where’。此外,如果標籤返回的內容是以AND 或OR 開頭的,則它會剔除掉
<!-- 演示動態sql-where標籤的使用情景 --> <select id="getUserByWhere" parameterType="user"resultType="com.mark.pojo.User"> SELECT * FROM USER <!-- where會自動加上where同處理多餘的and --> <where> <!-- if標籤的使用 --> <if test="id != null"> and id = #{id} </if> <if test="username != null and username != ''"> and username LIKE '%${username}%' </if> </where> </select>
四、if+set
上面的對於查詢 SQL 語句包含 where 關鍵字,如果在進行更新操作的時候,含有 set 關鍵詞,我們怎麼處理呢?
這樣寫,如果第一個條件 username 為空,那麼 sql 語句為:update user u set u.sex=? where id=?
如果第一個條件不為空,那麼 sql 語句為:update user u set u.username = ? ,u.sex = ? where id=?
<!-- 根據 id 更新 user 表的資料 -->
<update id="updateUserById" parameterType="com.ys.po.User">
update user u
<set>
<if test="username != null and username != ''">
u.username = #{username},
</if>
<if test="sex != null and sex != ''">
u.sex = #{sex}
</if>
</set>
where id=#{id}
</update>
五、choose(when,otherwise)
有時候,我們不想用到所有的查詢條件,只想選擇其中的一個,查詢條件有一個滿足即可,使用 choose 標籤可以解決此類問題。choose有點類似於Java中的switch,常常配合when和otherwise一起來使用。
在查詢條件中,如果使用者傳來了id,那麼我就查詢該id的資料,如果使用者傳來了username,那麼我就新增username的查詢條件,最後如果使用者任何一個查詢條件都沒有新增進來,那麼預設查詢條件就是查詢sex的所有資料。
如果 id 不為空,那麼查詢語句為:select * from user where id=?
如果 id 為空,那麼看username 是否為空,如果不為空,那麼語句為 select * from user where username=?;
如果 username 為空,那麼查詢語句為 select * from user where sex=?
<select id="selectUserByChoose" resultType="com.ys.po.User" parameterType="com.mark.po.User">
select * from user
<where>
<choose>
<when test="id !='' and id != null">
id=#{id}
</when>
<when test="username !='' and username != null">
and username=#{username}
</when>
<otherwise>
and sex=#{sex}
</otherwise>
</choose>
</where>
</select>
六、trim
trim有點元素替換的意思,還是上面的案例,我們可以將and替換為where
這個最終執行的sql是SELECT * FROM user where id=1
prefix:字首,prefixoverride:去掉第一個and或者是or
suffix:字尾,suffixoverride:去掉最後一個逗號(也可以是其他的標記,就像是上面字首中的and一樣)
<select id="getUser4" resultMap="u">
SELECT * FROM user
<trim prefix="where" prefixOverrides="and">
AND id=1
</trim>
</select>
七、foreach
foreach元素用來遍歷集合,比如我想查詢多個城市的人,我的sql語句可能是這樣SELECT * FROM user WHERE address IN('西安','北京'),我在查詢的時候可能只是傳入了一個list集合,該集合中有西安和北京兩個查詢條件,那我如何將這個集合組裝成一個sql語句呢?
collection表示傳入的引數中集合的名稱,index表示是當前元素在集合中的下標,open和close則表示如何將集合中的資料包裝起來,separator表示分隔符,item則表示迴圈時的當前元素。這樣一段配置最終組合成的sql就是SELECT * FROM user
WHERE address IN('西安','北京')
<select id="getUserInCities" resultMap="u">
SELECT * FROM user
WHERE address IN
<foreach collection="cities" index="city" open="(" separator="," close=")" item="city">
#{city}
</foreach>
</select>
八、bind
使用bind元素我們可以預先定義一些變數,然後在查詢語句中使用
<select id="getUserByName" resultMap="u">
<bind name="un" value="username+'%'"></bind>
SELECT* FROM user2 WHERE user_name LIKE #{un}
</select>
九、SQL 片段
定義共用重複sql片段
<!-- sql片段 定義,id:片段唯一標識 -->
<sql id="user_column">
`id`,
`username`,
`birthday`,
`sex`,
`address`,
`uuid2`
</sql>
使用sql片段
SELECT
<!-- sql片段的使用:include:引入sql片段,refid引入片段id -->
<include refid="user_column" />
FROM USER