Mybatis 注意传递多种参数,不一定都有参数值,用xml如何写出查询语句
有一张User表,传递name和age参数,通过mybatis的xml格式编写查询name=like“%张%”,或者age=18的学生信息,但是注意传递name和age参数,不一定都有参数值,用xml如何写出查询语句
如果希望在 name
和 age
都有值的情况下,实现 name
包含给定字符串或 age
等于指定值的查询,可以将 AND
改为 OR
,并在判断条件时加上逻辑处理。以下是改写的 XML 查询:
<select id="selectStudentByNameOrAge" resultType="User">
SELECT * FROM User
WHERE 1=1
<if test="name != null and name != ''">
AND (name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="age != null">
<if test="name != null and name != ''">
OR age = #{age})
</if>
<if test="name == null or name == ''">
AND age = #{age}
</if>
</if>
</select>
解释
-
WHERE 1=1
起到占位作用,简化 SQL 条件的拼接。 -
<if test="name != null and name != ''">
:判断name
是否有值。如果有,则拼接AND (name LIKE CONCAT('%', #{name}, '%')
。 -
<if test="age != null">
:判断age
是否有值。是否有值。
- 如果
age
和name
都有值,则拼接OR age = #{age})
,实现name
或age
的条件。 - 如果只有
age
有值(name
为空),则拼接AND age = #{age}
。
- 如果
这样实现后,如果 name
和 age
都有值,会查询满足 name
包含指定字符串或 age
等于指定值的用户。
或者
<select id="selectStudentByNameOrAge" resultType="User">
SELECT * FROM User
WHERE 1=1
<if test="name != null and name != ''">
AND (name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="age != null">
<if test="name != null and name != ''">
OR
</if>
age = #{age})
</if>
<if test="name == null or name == ''">
<if test="age != null">
AND age = #{age}
</if>
</if>
</select>
解释:
- 使用
OR
逻辑:如果name
和age
都有值,则name
和age
的条件会被括在一起,实现(name LIKE '%张%' OR age = 18)
的逻辑。 - 分支控制:
- 如果
name
有值,先添加name LIKE
条件; - 如果
age
也有值,在name
后面添加OR age = #{age}
; - 如果只有
age
有值,而name
没有值,则直接在外面添加age = #{age}
条件
- 如果