動態sql


通過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>              

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM