在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)

方案二:条件表达式直接返回布尔

<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

方案五:自定义TypeHandler(高级用法)

  1. 创建处理器:
public class BooleanTypeHandler extends BaseTypeHandler<Boolean> {
    @Override
    public void setNonNullParameter(...) {
        ps.setString(i, parameter ? "Y" : "N");
    }
    
    @Override
    public Boolean getNullableResult(ResultSet rs, String col) {
        return "Y".equals(rs.getString(col));
    }
    // 其他重写方法省略...
}
  1. 配置使用:
<resultMap type="User">
    <result property="vip" column="is_vip" 
            typeHandler="com.example.BooleanTypeHandler"/>
</resultMap>

最佳实践建议

  1. ​查询场景优先用​
    SELECT COUNT(*) > 0 FROM ...  -- 简单条件
    SELECT EXISTS(...)           -- 复杂条件
  2. ​更新场景​​:直接用Boolean接收更新操作返回值
  3. ​避免误区​​:
    <!-- 错误: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​​:用10代替布尔
  • ​PostgreSQL​​:可直接返回::boolean
  • ​SQL Server​​:用CASE WHEN...THEN 1 ELSE 0 END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值