Mybaits動態sql 常用標籤
Mybatis實現動態SQL,主要通過以下標籤:if,where,choose(when,otherwise),trim,set,foreach。接下來,我將逐一來說明各標籤的用法。有錯誤的地方麻煩指正~
if標籤
就是簡單的條件判斷,利用if語句我們可以實現某些簡單的條件選擇。
這個一般用於動態選項的查詢,即多值結合查詢,選項值有可能為空,因此需要用到動態if標籤來判斷多個值存在與否。
例1:通過年齡和居住地查詢使用者表。
<select id="find" parameterType="Admin" resultType="Admin">
select * from admin where 1=1
<if test="age!= null and age!='' ">
and age=age
</if>
<if test="city!= null and city!='' ">
and city=city
</if>
</select>
注意:上面“1=1”始終為true,所以後邊可以直接接上and 語句,不然就會出現“where and age=age”這樣的錯誤。
where標籤
補充相應的where的sql語句,解決了if標籤在上面所容易造成錯誤的問題。更好地簡化了where的條件判斷。
例2:例1的升級版。
<select id="find" parameterType="Admin" resultType="Admin">
select * from admin
<where>
<if test="age!= null and age!='' ">
and age=age
</if>
<if test="city!= null and city!='' ">
and city=city
</if >
</where>
</select>
這裡就不需要再補充“1=1”的語句了,這是因為where標籤會自動幫你處理,如果where後邊是and,or開頭的會被自動忽略掉。如果使用了and,or的話,mybatis也會自動為你在前後補充空格,媽媽就再也不用擔心出現“ageandpassword”的錯誤出現~
choose標籤
相當於switch語句,通常與when和otherwise搭配使用。
例3:根據年齡和居住地查詢表
<select id="find" parameterType="Admin" resultType="Admin">
select * from admin where 1=1
<choose>
<when test="age!= null and age!=''">
and age=#{age}
</when>
<when test="city!= nulland city!=''">
and city=#{city}
</when>
<otherwise>
and aname=#{aname}
</otherwise>
<choose>
<select>
這裡與例1和例2不同的是,這裡不會每一條都執行,類似於switch case語句。從上往下執行,當when中有條件滿足的時候,就會跳出choose。when中條件都不執行則會執行otherwise語句。即最終choose裡面僅有一條語句執行。
set標籤
類似於where功能,主要用於sql賦值更新操作,聰明的你一個可以領悟得到啦~
<update id ="update" parameterType="Admin">
update admin
<set>
<if test="aname !=null and aname !='' ">
aname=#{aname},
</if>
<if test="age!= null and age!='' ">
age=#{age},
</if>
<if test="city!= null and city!='' ">
password=#{password},
</if>
</set>
where aid=#{aid}
</update>
補充:set標籤會自動忽略不必要的字尾逗號。
foreach標籤
類似於for迴圈,迴圈的物件可以是list和陣列。
時常用於sql的批量操作,如批量刪除,批量新增資料等。
例子:批量新增使用者
<insert id="addAdmin" >
insert into amdin
(aid,aname,pwd,city,address)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.aid},#{item.aname},#{item.pwd},#{item.city},#{item.address)
</foreach>
</insert>
與之相應的sql語句為:insert into admin (…) values(…);。foreach就將物件一個個存入資料庫中。
例子:批量刪除使用者
<delete id="delAdmin">
delete from admin where aid in
<foreach collection="array" item="aid" open="(" separator="," close=")">
#{aid}
</foreach>
</delete>
相應的語句為:delete from admin where aid into(…);。foreach會將陣列轉為(aid,aid,aid)的形式,主要看foreach的後三個屬性就知道啦
trim標籤
十分強大!可以自定義新增前後綴,與之對應的屬性是prefix和suffix。同時通過prefixOverrides和suffixOverrides分別來覆蓋首尾部的內容,即忽略不必要的前後綴。就是說它可以充當where標籤,也可以充當set標籤啦~
例:
充當where標籤:
<trim prefix = "where" prefixOverrides="and|or" >
...
</trim>
充當set標籤:
<trim prefix="set" suffixOverrides=",">
...
</trim>
例子:動態新增使用者屬性
<insert id="find" resultType="Admin">
insert into admin
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test = "aname != null and aname !='' ">
aname,
</if>
<if test = "city != null and city !='' ">
city,
</if>
<if test = "age != null and age !='' ">
age,
</if>
</trim>
<trim prefix="values(" suffix=")" suffixOverrides=",">
<if test = "aname != null and aname !='' ">
#{aname},
</if>
<if test = "city != null and city !='' ">
#{city},
</if>
<if test = "age != null and age !='' ">
#{age},
</if>
</trim>
</insert>