MyBatis 的強大特性之一便是它的動態 SQL。動態 SQL 元素和 JSTL 或基於類似 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多元素需要花時間了解。MyBatis 3 大大精簡了元素種類,現在只需學習原來一半的元素便可。MyBatis 采用功能強大的基於 OGNL 的表達式來淘汰其它大部分元素。
1.if標簽
映射文件配置:
<select id="query" resultMap="baseMap" parameterType="user">
select * from t_user
<!-- 這里的1=1方便測試 -->
where 1=1
<!-- 條件if標簽通過判斷name參數是否為空決定是否使用這個SQL語句 -->
<if test="name!=null" >
and name=#{name}
</if>
</select>
測試代碼name=null的情況下:
@Test
public void test() {
List<User> list = mapper.query(new User());
for (User user : list) {
System.err.println("在name=null的情況下"+user);
}
}
測試結果:
測試代碼name!=null的情況下:
@Test
public void test() {
User testUser = new User();
testUser.setName("zhangsan");
List<User> list = mapper.query(testUser);
for (User user : list) {
System.err.println("在name=null的情況下"+user);
}
}
2. choose,when,otherwise
choose選擇語句,差不多等同於java語句中的switch語句。通過創建多個標簽元素來選擇符合要求的元素。when表示在滿足某種情況下調用該內容,otherwise表示在所有情況都不滿足的情況下調用的內容。
配置標簽代碼使用方式:
<select id="query" resultMap="baseMap" parameterType="user">
select * from t_user
where 1=1
<!-- 如果滿足其中的條件就調用其中的SQL語句 -->
<choose>
<when test="no!=null">
and no=#{no}
</when>
<when test="name!=null">
and name=#{name}
</when>
<otherwise>
<if test="age!=null" >
and age=#{age}
</if>
</otherwise>
</choose>
</select>
3.where
上述配置代碼中為了方便測試我都在where后面添加1=1來方便測試,但是有時候我們對where是否使用也需要動態決定。這個時候就可以使用where標簽來解決這個問題。
<select id="queryById" resultType="user" parameterType="int">
select *
from t_user
<where>
<if test="no!=null" >
no=#{no}
</if>
</where>
</select>
這里滿足條件就會自動添加where並調用其中的SQL代碼。
4.set
set標簽主要用於SQL更新UPDATE代碼中,用法如下代碼:
<update id="update" parameterType="user">
update t_user
<!-- 通過set來動態設置更新的參數 -->
<set>
<if test="name!=null">name=#{name}</if>
<if test="age!=null">age=#{age}</if>
</set>
where no = #{no}
</update>
5.trim
trim標簽是一個格式化標簽,可以用來代替set或者where標簽的功能。具體用法如下代碼:
<update id="update" parameterType="user">
update t_user
<!-- <set>
<if test="name!=null">name=#{name}</if>
<if test="age!=null">age=#{age}</if>
</set> -->
<!-- prefix表示調用SQL語句時在最前面添加的前綴
prefixOverrides表示調用SQL語句時去掉的第一個指定內容
suffix表示調用SQL語句時在最后面添加的后綴
suffixOverride表示調用SQL語句時去掉的最后一個指定內容
-->
<trim prefix="set" prefixOverrides="and | or">
<if test="name!=null"> and name=#{name}</if>
<if test="age!=null"> or age=#{age}</if>
</trim>
where no = #{no}
</update>
通過這個trim獲得了跟set一樣的效果,不過更具有靈活性。