有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。if标签是与(and)的关系,而 choose 是或(or)的关系。
choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
例如下面例子,同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的test为true的sql执行。安全考虑,我们使用where将choose包起来,放置关键字多于错误。
<!-- choose(判断参数) - 按顺序将实体类 User 第一个不为空的属性作为:where条件 --> <select id="selectControlTableColumnByTableColumnIdAndIsUpdateOrIsDelete" parameterType="com.uama.mdm.model.mdata.MdControlTableColumn" resultMap="BaseResultMap"> SELECT <include refid="Base_Column_list"></include> FROM md_control_table_column u <where> <choose> <when test="isUpdate !=null "> AND u.is_update = #{isUpdate, jdbcType=INTEGER} </when> <when test="isDelete != null"> AND u.is_delete = #{isDelete, jdbcType=INTEGER} </when> <otherwise> </otherwise> </choose> <if test="tableColumnId != null"> AND table_column_id = #{tableColumnId} </if> </where> </select>