個人理解:
where if就相當於正常的java中的if 語句,如果有多個條件組合判斷的話用 and, or連接
而where choose when otherwise
choose就好像是switch,when相當於case,可以有一種屬性的對個判斷,但不能同時去判斷多個屬性. 同時,只要有一個when滿足,則break
otherwise就好像是default,如果前面的when都不滿足,則進入otherwise
1.動態sql where if
傳遞參數為實體類user,if內的userName是user的屬性 username=#{userName} 中的username是數據庫表中的字段, #{userName}是實體類user中的.
<select id="findByCondition" parameterType="user" resultType="user">
select * from user
<!-- 這里的userName 對應的也是實體類中的屬性-->
<!-- test里面的屬性基本都來自於parameterType中的,如這里的userName,是實體類user中的屬性-->
<where>
<if test="userName!=null">
username=#{userName}
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
</where>
</select>
@Test
public void testFindByCondition() throws Exception{
User user=new User();
user.setUserName("xxx");
user.setGender("男");
List<User> list = userDao.findByCondition(user);
for (User user1:list)
{
System.out.println(user1);
}
}
2.同時,if中可以由多個條件的拼接,如這里的ids !=null and ids.size()>0 或者是ids !=null and user!=null 這樣的多個條件的拼接.
<!--多個id,新建實體類,傳入id集合,並用foreach標簽遍歷ids-->
<select id="findByIds" parameterType="vo" resultType="user">
select * from user
<!-- 這里的userName 對應的也是實體類中的屬性-->
<where>
<!--這里的ids 是vo里面的屬性. -->
<if test="ids !=null and ids.size()>0">
<!--這里的item對應的是user里面的屬性字段-->
<foreach collection="ids" open=" uid in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
@Test
public void testFindByIds() throws Exception{
Vo vo=new Vo();
List<Integer> list=new ArrayList<>();
list.add(2);
list.add(5);
list.add(7);
vo.setIds(list);
List<User> users = userDao.findByIds(vo);
for (User user:users)
{
System.out.println(user);
}
}
3.但是如果是where choose when otherwise 的時候,切記不能使用不同屬性條件的拼接,如 a1 and b2 這樣是不可以的, 但是可以 a!=null and a==1 這樣,對同一個屬性進行不同的判斷
<select id="findByChoose" resultType="user" parameterType="user">
select * from user
<where>
<choose>
<!-- 這里test為雙引號,則代表里面應該是字符串,而'男' 會默認為字符.所以gender=='男' 會出現不匹配錯誤,所以這里需要toString() -->
<when test=" gender!='女'.toString() and gender=='男'.toString()">
age=22
</when>
<!--這里寫成單引號,內部可以使用雙引號-->
<!-- <when test=' gender=="男" '>
age=22
</when>-->
<otherwise>
age=23
</otherwise>
</choose>
</where>
</select>
@Test
public void testFindByChoose() throws Exception{
User user=new User();
user.setUserName("aaa");
user.setGender("男");
user.setAge(22);
List<User> users= userDao.findByChoose(user);
for (User user1:users){
System.out.println(user1);
}
}