Mybatis动态SQL之if、choose、where、set、trim、foreach实例

1.1 if标签

当studentName的值为null或’’的时候,我们并不进行where条件的判断,所以当studentName值为null或’’值,不附带这个条件,所以查询结果是全部。
1.2 where标签

1.3 set标签
当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
没有使用if标签时,如果有一个参数为null,都会导致错误,如下示例:

Xml代码 
 
 
  UPDATE STUDENT_TBL  
    SET STUDENT_TBL.STUDENT_NAME = #{studentName},  
      STUDENT_TBL.STUDENT_SEX = #{studentSex},  
      STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},  
      STUDENT_TBL.CLASS_ID = #{classEntity.classID}  
   WHERE STUDENT_TBL.STUDENT_ID = #{studentID};  


使用set+if标签修改后,如果某项为null则不进行更新,而是保持数据库原值。如下示例:
Xml代码 
 
 
  UPDATE STUDENT_TBL  
   
     
      STUDENT_TBL.STUDENT_NAME = #{studentName},  
   
 
     
      STUDENT_TBL.STUDENT_SEX = #{studentSex},  
   
 
     
      STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},  
   
 
     
      STUDENT_TBL.CLASS_ID = #{classEntity.classID}  
   
 
 
 
  WHERE STUDENT_TBL.STUDENT_ID = #{studentID};  


1.4 trim
trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。
where例子的等效trim语句:

Xml代码 
 


1.4.1 set例子的等效trim语句示例:
Xml代码 
 
 
  UPDATE STUDENT_TBL  
   
     
      STUDENT_TBL.STUDENT_NAME = #{studentName},  
   
 
     
      STUDENT_TBL.STUDENT_SEX = #{studentSex},  
   
 
     
      STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},  
   
 
     
      STUDENT_TBL.CLASS_ID = #{classEntity.classID}  
   
 
 
 
  WHERE STUDENT_TBL.STUDENT_ID = #{studentID};  

1.4.2 set例子的等效trim语句示例:

Xml代码 
 
 
  UPDATE user
   
     

      user.userName = #{userName},
     
     
      user.userSex = #{userSex},  
   
 

   
  WHERE STUDENT_TBL.STUDENT_ID = #{studentID};  

运行结果:UPDATE user SET userName = ?, password=? WHERE id = ?

代替where的就是添加 prefix="where"  prefixOverrides="and|or"  trim就会自动的添加前缀where和自动识别和去掉不用的and或or


1.5 choose (when, otherwise)
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
if是与(and)的关系,而choose是或(or)的关系。

例如下面例子,同样把所有可以限制的条件都写上,方面使用。选择条件顺序,when标签的从上到下的书写顺序:

Xml代码 
 
 

1.6 foreach
对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件。
List 实例将使用“list”做为键,数组实例以“array” 做为键。

参数为list实例的写法:
SQL写法:

Xml代码 


1.6.1参数为Array实例的写法:
SQL语句:

Xml代码