方案一:使用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返回布尔值内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论