MyBatis的動態SQL是基於OGNL表達式的,它能夠幫助咱們方便的在SQL語句中實現某些邏輯。sql
元素 | 做用 | 備註 |
---|---|---|
if | 判斷語句 | 單條件分支判斷 |
choose、when、otherwise | 至關於Java中的switch case when語句 | 多條件分支判斷 |
trim、where、set | 輔助元素 | 用於處理一些SQL拼裝問題 |
foreach | 循環語句 | 在in語句等列舉條件經常使用 |
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>
有些時候咱們還須要多種條件的選擇,在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>
上面的select語句咱們加了一個1=1的絕對true的語句,目的是爲了防止語句錯誤,變成SELECT * FROM student WHERE這樣where後沒有內容的錯誤語句。這樣會有點奇怪,此時能夠使用
<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>
有時候咱們要去掉一些特殊的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元素是一個循環語句,它的做用是遍歷集合,能夠支持數組、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>