MyBatis學習之動態SQL
阿新 • • 發佈:2018-12-04
1、概述
MyBatis最為強大的部分是提供了動態SQL的支援,一些查詢邏輯可以直接在xml中完成,大大簡化了我們的操作,體現出了MyBatis的靈活性、拓展性、和可維護性。
MyBatis中的四大動態SQL元素:
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
2、使用
if元素
if元素是我們最為常用的判斷語句,test屬性相當於條件,使用起來也十分簡單。
<select id="queryByNameAndCity" resultType="com.lzx.entity.Author"> select * from author where 1=1 <if test="name != null and name != ''"> and name = #{name} </if> <if test="city != null and city != ''"> and city = #{city} </if> </select>
choose、when、otherwise元素
當條件較多時,很明顯我們使用if元素就不是那麼合適。MyBatis給我們提供了類似java中的switch…case…default語句,即choose…when…otherwise
<select id="queryByNameAndCity" resultType="com.lzx.entity.Author"> select * from author where 1=1 <choose> <when test="name != null and name != ''"> and name = #{name} </when> <otherwise> and city is not null </otherwise> </choose> </select>
trim, where, set元素
回到最初的if元素中,我們會發現如果所有的條件都不成立,那麼條件"1=1"就十分奇怪,在這裡我們可以使用where元素進行修改
<select id="queryByNameAndCity" resultType="com.lzx.entity.Author"> select * from author <where> <if test="name != null and name != ''"> and name = #{name} </if> <if test="city != null and city != ''"> and city = #{city} </if> </where> </select>
有些時候我們需要去掉一些特殊的SQL語句,比如and、or,這個時候我們可以使用trim元素。trim元素意味著去掉一些字串,prefix代表的是語句的字首,prefixOverrides代表的是需要去掉的字串。
<select id="queryByName" resultType="com.lzx.entity.Author">
select * from author
<trim prefix="where" prefixOverrides="and">
<if test="name != null and name != ''">
and name = #{name}
</if>
</trim>
</select>
set元素,我們常用到更新語句中
<update id="updateAuthor">
update author
<set>
<if test="name != null and name != ''">
name = #{name}
</if>
<if test="city != null and city != ''">
city = #{city}
</if>
</set>
where id = #{id}
</update>
foreach元素
foreach是一個迴圈語句,他的作用是遍歷集合,支援陣列和集合。我們可以用來批量刪除或者批量新增。
- collection元素是傳過來的集合名
- item是迴圈中的元素
- index是當前元素的下標
- open和close代表使用什麼符號包括這些集合元素
- separator是各元素的間隔符
<insert id="insertAuthor">
insert into author values
<foreach collection="authorList" index="id" item="author" separator=",">
(#{name},#{city})
</foreach>
</insert>
<delete id="deleteAuthor">
delete author where id in
<foreach collection="id" index="index" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
blind元素
bind 元素可以從 OGNL 表示式中建立一個變數並將其繫結到上下文。
<select id="queryByNameAndCity" resultType="com.lzx.entity.Author">
<blind name="a_name" value="'%' + name + '%'"/>
<blind name="a_name" value="'%' + city + '%'"/>
select * from author where name = #{a_name} and city = #{a_city}
</select>