3、動態SQL

動態SQL

MyBatis的動態SQL是基於OGNL表達式的,它能夠幫助咱們方便的在SQL語句中實現某些邏輯。sql

動態SQL的元素
元素 做用 備註
if 判斷語句 單條件分支判斷
choose、when、otherwise 至關於Java中的switch case when語句 多條件分支判斷
trim、where、set 輔助元素 用於處理一些SQL拼裝問題
foreach 循環語句 在in語句等列舉條件經常使用

if

if元素至關於Java中的if語句,它經常與test屬性聯合使用。如今咱們要根據name去查找學生,可是name是可選的,以下所示:數組

<select id="selectByName" resultType="com.zl.domain.StudentDomain">
    SELECT * FROM student
    WHERE 1=1
    <if test="name != null and name != ''">
        AND name LIKE concat('%', #{name}, '%')
    </if>
</select>

choose、when、otherwise

有些時候咱們還須要多種條件的選擇,在Java中咱們能夠使用switch、case、default語句,而在映射器的動態語句中能夠使用choose、when、otherwise元素。dom

<!-- 有name的時候使用name搜索,沒有的時候使用id搜索 -->
<select id="select" resultType="com.zl.domain.StudentDomain">
    SELECT * FROM student
    WHERE 1=1
    <choose>
        <when test="name != null and name != ''">
            AND name LIKE concat('%', #{name}, '%')
        </when>
        <when test="id != null">
            AND id = #{id}
        </when>
    </choose>
</select>

where

上面的select語句咱們加了一個1=1的絕對true的語句,目的是爲了防止語句錯誤,變成SELECT * FROM student WHERE這樣where後沒有內容的錯誤語句。這樣會有點奇怪,此時能夠使用 元素。 ide

<select id="select" resultType="com.zl.domain.StudentDomain">
    SELECT * FROM student
    <where>
        <if test="name != null and name != ''">
            name LIKE concat('%', #{name}, '%')
        </if>
    </where>
</select>

trim

有時候咱們要去掉一些特殊的SQL語法,好比常見的and、or,此時能夠使用trim元素。trim元素意味着咱們須要去掉一些特殊的字符串,prefix表明的是語句的前綴,而prefixOverrides表明的是你須要去掉的那種字符串,suffix表示語句的後綴,suffixOverrides表明去掉的後綴字符串。code

<select id="select" resultType="com.zl.domain.StudentDomain">
    SELECT * FROM student
    <trim prefix="WHERE" prefixOverrides="AND">
        <if test="name != null and name != ''">
            AND name LIKE concat('%', #{name}, '%')
        </if>
        <if test="id != null">
            AND id = #{id}
        </if>
    </trim>
</select>

foreach

foreach元素是一個循環語句,它的做用是遍歷集合,能夠支持數組、List、Set接口。xml

<select id="select" resultType="com.zl.domain.StudentDomain">
        SELECT * FROM student
        WHERE name IN
        <foreach collection="names" open="(" close=")" separator="," item="item">
            #{item}
        </foreach>
    </select>
  • collection配置的是傳遞進來的參數名稱
  • item配置的是循環中當前的元素。
  • index配置的是當前元素在集合的位置下標。
  • open和 close配置的是以什麼符號將這些集合元素包裝起來。
  • separator是各個元素的間隔符。
相關文章
相關標籤/搜索