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 UserWHERE 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 UserWHERE 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}条件
- 如果
