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(高级用法)
创建处理器:
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));
}
// 其他重写方法省略...
}
配置使用:
<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:用1和0代替布尔
PostgreSQL:可直接返回::boolean
SQL Server:用CASE WHEN...THEN 1 ELSE 0 END
到此这篇关于MyBatis设计SQL返回布尔值(Boolean)的常见方法的文章就介绍到这了,更多相关MyBatis设计SQL返回布尔值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java:com.netflix.client.ClientException错误解决
本文主要介绍了Java:com.netflix.client.ClientException错误解决,主要是指出客户端 module-sso 试图通过负载均衡器访问服务时,负载均衡器没有找到可用的服务器来处理请求,下面就来介绍一下解决方法2024-08-08
Java中JSON格式反序列化为Map且保证存取顺序一致的问题
这篇文章主要介绍了Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2025-06-06
springboot集成mybatis-plus遇到的问题及解决方法
这篇文章主要介绍了springboot集成mybatis-plus遇到的问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-11-11
SpringBoot actuator 健康检查不通过的解决方案
这篇文章主要介绍了SpringBoot actuator 健康检查不通过的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07
Java中LambdaQueryWrapper设置自定义排序代码示例
这篇文章主要给大家介绍了关于Java中LambdaQueryWrapper设置自定义排序的相关资料,lambdaquerywrapper是MyBatis-Plus框架中的一个查询条件构造器,它可以用于构建自定义的查询条件,需要的朋友可以参考下2023-12-12


最新评论