MyBatis 动态 SQL <where>
<if>
标签教程
引言
在 MyBatis 中,<where>
和 <if>
标签通常一起使用来构建动态 SQL 查询。这些标签允许你根据条件动态地包含或排除 SQL 语句的某些部分,从而使你的查询更加灵活和强大。
示例场景
假设我们有一个 tb_user
表,包含 id
、username
、password
和 addr
字段。我们想要构建一个查询,该查询可以根据提供的条件(如用户名、密码或地址)来筛选用户。
步骤
1. 创建 XML 映射文件
<mapper namespace="com.situ.mybatis.UserMapper">
<!-- 定义一个根据条件查询用户的SQL语句 -->
<select id="selectUsersByConditions" resultType="User">
SELECT * FROM tb_user
<!-- 使用<where>标签来动态地包含WHERE子句 -->
<where>
<!-- 使用<if>标签来检查条件是否满足,如果满足则包含该条件 -->
<if test="username != null and username != ''">
AND username like concat('%',#{username},'%')
</if>
<if test="password != null and password != ''">
AND password = #{password}
</if>
<if test="addr != null and addr != ''">
AND addr = #{addr}
</if>
</where>
</select>
</mapper>
注释说明:
-
<mapper>
标签定义了 MyBatis 映射文件的命名空间,通常与对应的 Mapper 接口的全限定名一致。 -
<select>
标签定义了一个查询操作,id
属性与 Mapper 接口中的方法名对应,resultType
属性指定了查询结果的类型。 -
<where>
标签用于动态地包含 WHERE 子句。如果<where>
标签内部的条件都不满足(即没有条件被包含),那么 MyBatis 会自动移除 WHERE 关键字以及它前面的任何 AND 或 OR 关键字,以避免语法错误。 -
<if>
标签用于检查传入的参数是否满足指定的条件。如果条件为真(即参数不为 null 且不为空字符串),则包含该条件。注意,这里使用了!=
运算符来比较 null 值,因为在 XML 中你不能直接使用==
或!=
来比较 null,而应该使用is null
或is not null
,但在这种情况下,我们是在检查 Java 对象的 null 值,所以!= null
是有效的。
2. 创建 Mapper 接口
package com.situ.mybatis;
import com.situ.mybatis.model.User;
import java.util.List;
public interface UserMapper {
// 根据条件查询用户列表
List<User> selectUsersByConditions(User user);
}
3. 创建 User 类
package com.situ.mybatis.model;
public class User {
private Integer id;
private String username;
private String password;
private String addr;
// getters and setters
}
4. 测试查询
// 创建一个 User 对象来存储查询条件
User queryUser = new User();
// queryUser.setUsername("someUsername"); // 如果要按用户名查询,则取消注释此行
// queryUser.setPassword("somePassword"); // 如果要按密码查询,则取消注释此行
queryUser.setAddr("someAddress"); // 示例:按地址查询
// 执行查询
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.selectUsersByConditions(queryUser);
// 处理查询结果
for (User user : users) {
System.out.println(user);
}
注意事项:
-
<where>
标签会自动处理 WHERE 关键字前面的 AND 或 OR,以及在没有条件时移除 WHERE 关键字,因此你不需要在<where>
标签内部显式地添加 AND 或 OR(除非你有特定的逻辑需要这样做)。 - 在
<if>
标签中,你可以使用 Java 的逻辑运算符(如and
、or
)来组合多个条件。 - 确保传入的参数类型与 XML 映射文件中使用的类型一致。
- 在生产环境中,不要将密码明文存储在数据库中,应该使用加密或哈希算法来保护密码。