if
动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:
<select id="findName" resultType="BaseResultMap">
SELECT * FROM wechat_qa
WHERE status = 1
<if test="name != null">
AND name like #{name}
</if>
</select>
这条语句提供了一个可选的文本查找类型的功能。如果没有传入"name",那么所有状态为1的结果都会返回,若传入了"name",那么就会把模糊查找"name"内容的结果返回。
如果想可选地通过"name"和"age"两个条件搜索该怎么办呢?首先,改变语句的名称让它更具实际意义,然后只要加入另一个条件即可:
<select id="findAll" resultType="BaseResultMap">
SELECT * FROM wechat_qa
WHERE status = 1
<if test="name != null">
AND name like #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
choose, when, otherwise
有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了choose元素,它有点像 Java 中的 switch 语句。
还是上面的例子,但是这次变为提供了"name"就按"name"查找,提供了"age"就按"age"查找,若两者都没有提供,就返回所有符合条件的结果(实际情况可能是由管理员按一定策略选出结果列表,而不是返回大量无意义的随机结果)。
<select id="findAll" resultType="BaseResultMap">
SELECT * FROM wechat_qa WHERE status = 1
<choose>
<when test="title = null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND age = 1
</otherwise>
</choose>
</select>
网友评论