通過mybatis提供的各種標簽方法實現動態拼接sql語句。
常用有<if>、<where>、<foreach>
基於不同需求來進行使用
需求:根據性別和名字查詢用戶
按原始方法在mapper.xml中寫sql語句:
<select> select * from user where sex = #{sex} and username = #{username} </select>
但如果在查詢時沒有給username給值,則可能導致默認username = null 而致使查詢 出錯。
所以解決方案,是使用動態sql的if標簽
<select> select * from user where <if test="sex != null and sex != ' ' "> sex = #{sex} </if> <if test="username != null and username != ' ' "> and username = #{username} </if> </select>
如果沒有給username給值,那么語句將變成
select * from user where sex = #{sex}
但這依然存在隱患,如果sex為空,運行是就會語法報錯,多了一個and
這時候就引入了where標簽
<!-- 根據條件查詢用戶 --> <select> select * from user <!-- where標簽可以自動添加where,同時處理sql語句中第一個前and關鍵字 --> <where> <if test="sex != null"> AND sex = #{sex} </if> <if test="username != null and username != ''"> AND username = #{username} </if> </where> </select>
Sql片段:
當sql語句部分重復太多時,可以抽取出來放在sql標簽中,
<sql id="selector"> select * from user </sql> <!-- 根據條件查詢用戶 --> <select> <include refid="selector"/> <!-- where標簽可以自動添加where,同時處理sql語句中第一個前and關鍵字 --> <where> <if test="sex != null"> AND sex = #{sex} </if> <if test="username != null and username != ''"> AND username = #{username} </if> </where> </select>
foreach標簽
向sql傳遞數組或List,mybatis使用foreach解析,如下:
根據多個id查詢用戶信息
查詢sql:
SELECT * FROM user WHERE id IN (1,10,24)
在UserMapper.xml添加sql,如下:
<!-- 根據ids查詢用戶 --> <select id="queryUserByIds" parameterType="queryVo" resultType="user"> SELECT * FROM `user` <where> <!-- foreach標簽,進行遍歷 --> <!-- collection:遍歷的集合,這里是QueryVo的ids屬性 --> <!-- item:遍歷的項目,可以隨便寫,,但是和后面的#{}里面要一致 --> <!-- open:在前面添加的sql片段 --> <!-- close:在結尾處添加的sql片段 --> <!-- separator:指定遍歷的元素之間使用的分隔符 --> <foreach collection="ids" item="item" open="id IN (" close=")" separator=","> #{item} </foreach> </where> </select>