MyBatis 动态 SQL <choose>
, <when>
, 和 <otherwise>
标签教程
引言
在 MyBatis 中,<choose>
, <when>
, 和 <otherwise>
标签用于构建类似于 Java 中的 switch-case
语句的动态 SQL 查询。这些标签允许你根据提供的条件来动态地选择 SQL 语句的某个部分。
示例场景
假设我们有一个 tb_user
表,包含 id
, username
, password
, gender
, 和 addr
字段。我们想要构建一个查询,该查询可以根据提供的性别(gender
)来筛选用户,如果性别未提供,则默认查询所有用户。
步骤
1. 创建 XML 映射文件
<mapper namespace="com.situ.mybatis.UserMapper">
<!-- 定义一个根据性别查询用户的SQL语句,如果性别未提供则查询所有用户 -->
<select id="selectUsersByGender" resultType="User">
SELECT * FROM tb_user
<where>
<!-- 使用<choose>标签来选择SQL语句的某个部分 -->
<choose>
<!-- 如果gender为'male',则选择这个条件 -->
<when test="gender == 'male'">
gender = 'male'
</when>
<!-- 如果gender为'female',则选择这个条件 -->
<when test="gender == 'female'">
gender = 'female'
</when>
<!-- 如果gender未提供或不是'male'或'female',则选择这个默认条件 -->
<otherwise>
1 = 1 <!-- 这是一个恒真的条件,相当于没有条件限制 -->
</otherwise>
</choose>
</where>
</select>
</mapper>
注释说明:
-
<choose>
标签按顺序判断其内部<when>
标签中的判断条件是否成立,如果有一个成立,则执行相应的 SQL 语句,<choose>
执行结束;如果都不成立,则执行<otherwise>
中的 SQL 语句。 -
<choose>
标签类似于 Java 中的switch
语句,它包含了一个或多个<when>
标签和一个可选的<otherwise>
标签。这类似于 Java 的switch
语句,choose
为switch
,when
为case
,otherwise
则为default
。 -
<when>
标签用于指定当某个条件为真时要执行的 SQL 片段。 -
<otherwise>
标签用于指定当所有<when>
标签的条件都不满足时要执行的默认 SQL 片段。在这个例子中,我们使用1 = 1
作为恒真的条件,它不会对查询结果产生任何限制。 - 注意,在
<where>
标签内部,MyBatis 会自动处理 SQL 语句中的逻辑,例如移除不必要的 AND 或 OR 关键字,以及在没有条件时移除 WHERE 关键字。
2. 创建 Mapper 接口
public interface UserMapper {
// 根据性别查询用户列表,如果性别未提供则查询所有用户
List<User> selectUsersByGender(String gender);
}
3. 创建 User 类
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String addr;
// getters and setters
}
4. 测试查询
UserMapper userMapper = session.getMapper(UserMapper.class);
// 测试查询男性用户
List<User> maleUsers = userMapper.selectUsersByGender("male");
for (User user : maleUsers) {
System.out.println(user);
}
// 测试查询所有用户(不传递gender参数或传递一个非'male'或'female'的值)
List<User> allUsers = userMapper.selectUsersByGender(null); // 或者传递一个无效值,如 "unknown"
for (User user : allUsers) {
System.out.println(user);
}
注意事项:
-
<choose>
,<when>
, 和<otherwise>
标签提供了一种灵活的方式来构建动态 SQL 查询,但它们应该谨慎使用,以避免过度复杂的查询逻辑。 - 在
<when>
标签的test
属性中,你可以使用 Java 的逻辑运算符(如==
,!=
,&&
,||
)来组合多个条件。但是,注意字符串比较应该使用==
(在 MyBatis 的 XML 配置中,字符串比较实际上是通过equals
方法进行的,但语法上写为==
),并且对于空值检查,你应该使用!= null
和相应的字符串比较。