在MyBatis中设计SQL返回布尔值(Boolean)有几种常见方法
方案一:使用COUNT查询存在性(推荐)
<select id="checkUserExists" resultType="_boolean">SELECT COUNT(*) > 0 FROM users WHERE username = #{username}
</select>
- 说明:
- MySQL中
COUNT(*) > 0
直接返回1
(true)或0
(false) - MyBatis自动将数字转换为Java的
boolean
类型(1→true, 0→false)
- MySQL中
方案二:条件表达式直接返回布尔
<select id="isAccountActive" resultType="java.lang.Boolean">SELECT (status = 'ACTIVE') FROM accounts WHERE account_id = #{id}
</select>
方案三:存在性检查(EXISTS优化)
<select id="hasUserPermission" resultType="boolean">SELECT EXISTS(SELECT 1 FROM permissions WHERE user_id = #{userId} AND permission = #{perm})
</select>
- 优势:比COUNT更高效,数据库在找到第一条匹配记录即返回
方案四:处理更新/删除操作
<update id="deactivateUser">UPDATE users SET active = 0 WHERE id = #{id}
</update>
在Mapper接口定义:
// 返回Boolean类型
Boolean deactivateUser(Long id);
- 原理:MyBatis自动将影响行数转换:
- ≥1行 →
true
- 0行 →
false
- ≥1行 →
方案五:自定义TypeHandler(高级用法)
- 创建处理器:
public class BooleanTypeHandler extends BaseTypeHandler<Boolean> {@Overridepublic void setNonNullParameter(...) {ps.setString(i, parameter ? "Y" : "N");}@Overridepublic Boolean getNullableResult(ResultSet rs, String col) {return "Y".equals(rs.getString(col));}// 其他重写方法省略...
}
- 配置使用:
<resultMap type="User"><result property="vip" column="is_vip" typeHandler="com.example.BooleanTypeHandler"/>
</resultMap>
最佳实践建议
- 查询场景优先用
SELECT COUNT(*) > 0 FROM ... -- 简单条件 SELECT EXISTS(...) -- 复杂条件
- 更新场景:直接用
Boolean
接收更新操作返回值 - 避免误区:
需改为:<!-- 错误:resultType不能是boolean --> <select id="isAdmin" resultType="boolean">SELECT is_admin FROM users WHERE id=#{id} </select>
<select id="isAdmin" resultType="_boolean">SELECT IF(is_admin='Y', true, false) FROM users WHERE id=#{id} </select>
完整使用示例
Mapper接口:
public interface UserMapper {// 检查用户名是否存在boolean existsByUsername(@Param("name") String username);// 禁用用户并返回是否成功Boolean deactivateUser(Long id);
}
XML配置:
<select id="existsByUsername" resultType="_boolean">SELECT EXISTS(SELECT 1 FROM users WHERE username = #{name})
</select><update id="deactivateUser">UPDATE users SET active = 0 WHERE id = #{id}
</update>
Java调用:
UserMapper mapper = session.getMapper(UserMapper.class);// 检查用户名
boolean exists = mapper.existsByUsername("john_doe");
System.out.println("Username exists? " + exists);// 禁用用户
Boolean success = mapper.deactivateUser(1001L);
if(success) {System.out.println("User deactivated");
}
根据具体数据库类型可能需要调整:
- Oracle:用
1
和0
代替布尔 - PostgreSQL:可直接返回
::boolean
- SQL Server:用
CASE WHEN...THEN 1 ELSE 0 END